C/C++ 中你自己的常量文件夹

主要观点:

  • 有人希望在代码中使用sqrtps,但在 clang 中使用-ffast-math会改变其使用方式。
  • 在 LLVM 的优化流程中,快速数学条件下sqrt(x) == x * rsqrt(x),会使用rsqrtps,但存在精度问题。
  • 可以使用内联汇编来保证得到想要的指令选择,但存在一些问题,如内联时常量折叠不生效等。
  • 可以通过__builtin_constant_p检查vec是否为常量,从而在常量时使用_mm_sqrt_ps并进行常量折叠。

关键信息:

  • 给出了不同条件下test函数的编译结果,如无-ffast-math时、有-ffast-math时等。
  • 介绍了 LLVM 的优化流程及rsqrtps指令的精度问题。
  • 提到内联汇编时常量折叠的问题及解决方法,如通过逐个检查向量元素的常量性。
  • 说明标记testnoinline时的代码情况。

重要细节:

  • 给出了具体的代码示例,包括test函数和call_test函数的不同实现及编译结果。
  • 提到 GCC 对__builtin_constant_p的使用有一定限制,LLVM 可能继承了这种行为。
  • 提供了在 godbolt 上的完整示例链接,可查看具体的代码运行情况。
阅读 14
0 条评论