Go “如何编写asm代码”;bsrl";在戈兰

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有一个

我需要在golang中编写一些asm代码。我读了这个问题,但不知道怎么写。 有人能帮我吗?谢谢

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)已经实现了这一点。