主要观点:
- 有人希望在代码中使用
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指令的精度问题。 - 提到内联汇编时常量折叠的问题及解决方法,如通过逐个检查向量元素的常量性。
- 说明标记
test为noinline时的代码情况。
重要细节:
- 给出了具体的代码示例,包括
test函数和call_test函数的不同实现及编译结果。 - 提到 GCC 对
__builtin_constant_p的使用有一定限制,LLVM 可能继承了这种行为。 - 提供了在 godbolt 上的完整示例链接,可查看具体的代码运行情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。