Go “如何编写asm代码”;bsrl";在戈兰
我需要在golang中编写一些asm代码。我读了这个问题,但不知道怎么写。 有人能帮我吗?谢谢Go “如何编写asm代码”;bsrl";在戈兰,go,assembly,Go,Assembly,我需要在golang中编写一些asm代码。我读了这个问题,但不知道怎么写。 有人能帮我吗?谢谢 asm ("bsrl %1, %0;" :"=r"(bits) /* output */ :"r"(value) ); /* input */ 上的所有答案都表明,在Go中不可能使用任何语法的内联asm。GNUC内联asm语法不会有帮助 但幸运的是,bsr不需要内联asm(它查找最高设置位的位索引)。Go 1.9有一个
asm ("bsrl %1, %0;"
:"=r"(bits) /* output */
:"r"(value) ); /* input */
上的所有答案都表明,在Go中不可能使用任何语法的内联asm。GNUC内联asm语法不会有帮助
但幸运的是,bsr
不需要内联asm(它查找最高设置位的位索引)。Go 1.9有一个内在/内置函数,用于按位操作,这些操作非常接近,应该能够高效编译
用于获取非零
x
的lzcnt(x)
,即31 bsr(x)
。这可能需要额外的指令,尤其是在仅支持bsr而不支持bsr的CPU上(例如Intel pre-Haswell)
或使用
Len32(x)
返回表示x
所需的位数。对于x=0
,它返回0
,对于x=1
,它可能返回1
,因此它是bsr(x)+1
,定义了0
的行为(因此可能会花费额外的指令)。希望Len32(x)-1可以直接编译成bsr
当然,如果您真正想要的是lzcnt
,那么首先使用LeadingZeros32
请注意,对于input=0
,目标寄存器保持不变。英特尔的文档中只有一个未定义的值,所以编译器可能不会利用AMD文档和英特尔在硬件中提供的这种保证
但是,至少在理论上,Len32(x)-1
可以编译成一条bsr
指令,前提是编译器能够证明x
是非零的。如果您需要准确的brsl
,数学位。前导零(自Go 1.9)已经实现了这一点。