如何生成sse4.2 popcnt机器指令
使用 c 程序:
int main(int argc , char** argv)
{
return __builtin_popcountll(0xf0f0f0f0f0f0f0f0);
}
和编译器行(gcc 4.4 - Intel Xeon L3426):
gcc -msse4.2 poptest.c -o poptest
我没有得到内置的 popcnt 指令,而是编译器生成一个查找表并以这种方式计算 popcount。生成的二进制文件超过 8000 个字节。 (Yuk!)
非常感谢您的帮助。
Using the c program:
int main(int argc , char** argv)
{
return __builtin_popcountll(0xf0f0f0f0f0f0f0f0);
}
and the compiler line (gcc 4.4 - Intel Xeon L3426):
gcc -msse4.2 poptest.c -o poptest
I do NOT get the builtin popcnt insruction rather the compiler generates a lookup table and computes the popcount that way. The resulting binary is over 8000 bytes. (Yuk!)
Thanks so much for any assistance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你必须告诉 GCC 为支持的架构生成代码
popcnt 指令:
或者仅启用对 popcnt 的支持:
在示例程序中,
__builtin_popcountll
的参数是常量,因此编译器可能会在编译时进行计算
时间并且永远不会发出 popcnt 指令。即使没有,GCC 也会这样做
要求优化程序。
所以尝试向它传递一些它在编译时无法知道的东西:
You have to tell GCC to generate code for an architecture that supports
the popcnt instruction:
Or just enable support for popcnt:
In your example program the parameter to
__builtin_popcountll
is aconstant so the compiler will probably do the calculation at compile
time and never emit the popcnt instruction. GCC does this even if not
asked to optimize the program.
So try passing it something that it can't know at compile time:
您需要这样做:
编辑
哎呀 - 我刚刚使用 gcc 4.2 和 ICC 11.1 检查了反汇编输出 - 而 ICC 11.1 正确生成了
popcntl
或popcntq< /code>,由于某种原因 gcc 不会 - 它调用
___popcountdi2
。诡异的。当我有机会时,我会尝试更新版本的 gcc,看看它是否已修复。我想唯一的解决方法是使用 ICC 而不是 gcc。You need to do it like this:
EDIT
Oops - I just checked the disassembly output with gcc 4.2 and ICC 11.1 - while ICC 11.1 correctly generates
popcntl
orpopcntq
, for some reason gcc does not - it calls___popcountdi2
instead. Weird. I will try a newer version of gcc when I get a chance and see if it's fixed. I guess the only workaround otherwise is to use ICC instead of gcc.对于GCC中的
__builtin_popcountll
,您需要做的就是添加-mpopcnt
和
-mpopcnt
-mpopcnt
使用
而不 使用 POPCNTQ 之前请务必检查 CPUID 功能位的 ABM 位(位 23)
For
__builtin_popcountll
in GCC, all you need to do is add-mpopcnt
with
-mpopcnt
without
-mpopcnt
Notes
Be sure to check the ABM bit (bit 23) of CPUID feature bits before using POPCNTQ