gcc 的 `__builtin_popcountll` 有什么意义?

What's the sense of gcc's `__builtin_popcountll`?

我在 C 中实现了位集(位图)。 假设 __builtin_popcountll 是一个高效的实现,我用它来计算位而不是自己实现。

然而,在调试程序时,它看起来好像 __builtin_popcountll 正在使用一些循环(而不是我所期望的:汇编指令)。 实际上,当使用 gprof 分析我的测试程序时,__popcountdi2 消耗了总量的 12% CPU,而使用它的“周围代码”消耗了“0%”。

所以我想知道:当它看起来如此低效时,这样的内置函数有什么用?

平台是 x86_64 (AMD EPYC 7401P) 使用 gcc 4.8.5。

根据 __builtin_popcountll 生成的代码取决于 gcc 选项的设置 -march=CPU-TYPE

  • 对于 Intel CPUs 第一个支持 SSE4a popcnt 指令的是 CPU-TYPE corei7
  • 对于 AMD CPUs 它是 CPU-TYPE amdfam10barcelona
  • 如果当前 CPU 知道指令,使用 CPU-TYPE native 也将启用它。

如果设置正确(即:CPU 知道 popcnt 指令),gcc 会创建相应的内联汇编指令; 否则它将调用 __popcountdi2(来自 libgcc2)计算执行循环的位(每字节一次迭代)。