【发布时间】:2011-06-21 15:02:43
【问题描述】:
使用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 字节。 (哇!)
非常感谢您的帮助。
【问题讨论】:
-
gcc 因为至少 4.4.7(godbolt 上最旧)启用了
-mpopcnt作为-msse4.2的一部分,即使它们具有单独的 CPUID 功能位。 godbolt.org/g/SfcHYh。另外,如果您__builtin_popcountll(argc),当您启用优化时,您的程序将不会优化到return 32。或者只是查看带有 int arg 的函数的 asm,因为您只想查看 asm,而不是运行它。但是,如果您要在本地运行二进制文件,-march=native是迄今为止最好的选择,因为它设置了-mtune以及启用指令。
标签: gcc optimization bit-manipulation hammingweight