主要观点:
- 有人希望在代码中使用
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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。