我需要在golang中编写一些asm代码。我读了这个问题Is it possible to include inline assembly in Google Go code?,但没看到如何写它。 谁能帮助我?感谢。
asm ("bsrl %1, %0;"
:"=r"(bits) /* output */
:"r"(value) ); /* input */
答案 0 :(得分:1)
the question you found上的所有答案都表示
GNU C inline-asm语法不会提供帮助。 但幸运的是,您不需要bsr
的内联asm(它找到最高设置位的位索引)。 Go 1.9具有用于按位运算的内在/内置函数,这些函数足够接近它们应该有效编译。
使用math.bits.LeadingZeros32
获取lzcnt(x)
,31-bsr(x)
为非零x
。这可能会花费额外的指令,特别是在仅支持bsr
而非lzcnt
的CPU(例如Intel pre-Haswell)上。
或使用Len32(x) - 1
Len32(x)
返回表示x
所需的位数。它会为0
返回x=0
,并且可能会为1
返回x=1
,因此它为bsr(x) + 1
,并为0
定义了行为(因此可能会花费额外的指令)。希望Len32(x) - 1
可以直接编译为bsr
。
当然,如果你真正想要的是lzcnt
,那么首先使用LeadingZeros32
。
请注意,bsr
不会修改目标寄存器的输入= 0
。英特尔的文档只说具有不确定的价值,因此编译器可能不会利用AMD文档和英特尔确实提供的硬件保证。
至少在理论上,如果编译器可以证明Len32(x) - 1
非零,bsr
可以编译为单个x
指令。