gcc – 我想要__builtin_popcountll的两个实现

我有一些代码,我想运行快速内置的CPU指令popcnt(当__builtin_popcountll使用适当的标志编译时,例如使用g -mpopcnt或clang -march = corei7,这会发生),但也能够掉线当cpuid显示不支持HW指令的CPU时,返回代码.

当然,要获得我信任的编译人员已经正确实现的后备代码(所以我不需要引入C或asm代码来执行我的popcount)我需要一个单独的编译单元,编译时没有 – mpopcnt或-march = corei7标志.

链接在一起单独编译代码的唯一方法是什么?是否没有编译器内在函数或其他类型的提示或其他内置插件我不知道我可以用它来生成回退popcount代码?

最佳答案 我不确定,但是在popcnt指令和回退实现之间选择所需的代码的成本可能会比仅仅使用非popcnt实现的性能更大.

要切换备用实现(在popcnt的站点进行切换),您至少需要以下内容:

>加载并检查cpuid位(CPUID.01H:ECX.POPCNT [Bit 23])
>分支以选择popcnt或替代实现
>备用实现所需的潜在保存/恢复寄存器
>如果备用实现是基于SSE或AVX,则可能将数据移动到SIMD寄存器

我怀疑成本禁止有效实施您描述的内在因素.

点赞