使用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

10-08 13:18