如何编写asm代码" bsrl"在golang

时间:2018-04-07 05:36:44

标签: go assembly

我需要在golang中编写一些asm代码。我读了这个问题Is it possible to include inline assembly in Google Go code?,但没看到如何写它。 谁能帮助我?感谢。

asm ("bsrl %1, %0;"
           :"=r"(bits)            /* output */
           :"r"(value) );         /* input */

1 个答案:

答案 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指令。