使用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个字节。 (Y!)
非常感谢您的协助。
最佳答案
您必须告诉GCC为支持以下架构的代码生成代码
popcnt指令:
gcc -march=corei7 popcnt.c
或仅启用对popcnt的支持:
gcc -mpopcnt popcnt.c
在示例程序中,
__builtin_popcountll
的参数是常量,因此编译器可能会在编译时进行计算
时间,并且永远不会发出popcnt指令。即使没有,GCC也会这样做
要求优化程序。
因此,尝试在编译时传递一些它不知道的内容:
int main (int argc, char** argv)
{
return __builtin_popcountll ((long long) argv);
}
$ gcc -march=corei7 -O popcnt.c && objdump -d a.out | grep '<main>' -A 2
0000000000400454 <main>:
400454: f3 48 0f b8 c6 popcnt %rsi,%rax
400459: c3 retq