[libc-commits] [libc] [libc][math] Optimize misc basic math operations with builtins when available (PR #99037)
via libc-commits
libc-commits at lists.llvm.org
Wed Jul 17 04:21:02 PDT 2024
overmighty wrote:
For some reason, on x86, `__builtin_{fmaximum_num}{fminimum_num}{,f}` return signaling NaNs in cases where we expect quiet NaNs.
```
[862/1780] Running unit test libc.test.src.math.smoke.fmaximum_numf_test.__unit__
FAILED: projects/libc/test/src/math/smoke/CMakeFiles/libc.test.src.math.smoke.fmaximum_numf_test.__unit__ /tmp/llvm-build-overlay-release-native/projects/libc/test/src/math/smoke/CMakeFiles/libc.test.src.math.smoke.fmaximum_numf_test.__unit__
cd /tmp/llvm-build-overlay-release-native/projects/libc/test/src/math/smoke && /tmp/llvm-build-overlay-release-native/projects/libc/test/src/math/smoke/libc.test.src.math.smoke.fmaximum_numf_test.__unit__.__build__
[==========] Running 5 tests from 1 test suite.
[ RUN ] LlvmLibcFMaximumNumTest.NaN
/home/overmighty/projects/llvm-project/libc/test/src/math/smoke/FMaximumNumTest.h:42: FAILURE
Expected: FPBits(aNaN).uintval()
Which is: 2143289344
To be equal to: FPBits(func(aNaN, sNaN)).uintval()
Which is: 2141192192
/home/overmighty/projects/llvm-project/libc/test/src/math/smoke/FMaximumNumTest.h:44: FAILURE
Expected: FPBits(aNaN).uintval()
Which is: 2143289344
To be equal to: FPBits(func(sNaN, sNaN)).uintval()
Which is: 2141192192
[ FAILED ] LlvmLibcFMaximumNumTest.NaN
[ RUN ] LlvmLibcFMaximumNumTest.InfArg
[ OK ] LlvmLibcFMaximumNumTest.InfArg (0 ns)
[ RUN ] LlvmLibcFMaximumNumTest.NegInfArg
[ OK ] LlvmLibcFMaximumNumTest.NegInfArg (0 ns)
[ RUN ] LlvmLibcFMaximumNumTest.BothZero
```
```py
>>> f"{2141192192:>032b}"
'01111111101000000000000000000000'
>>>
```
Code generated by Clang without `-march=native`:
```asm
0000000000004dc0 <__llvm_libc_19_0_0_git::fmaximum_numf(float, float)>:
4dc0: 55 push rbp
4dc1: 48 89 e5 mov rbp, rsp
4dc4: 0f 28 d0 movaps xmm2, xmm0
4dc7: f3 0f c2 d0 03 cmpunordss xmm2, xmm0
4dcc: 0f 28 da movaps xmm3, xmm2
4dcf: 0f 54 d9 andps xmm3, xmm1
4dd2: f3 0f 5f c8 maxss xmm1, xmm0
4dd6: 0f 55 d1 andnps xmm2, xmm1
4dd9: 0f 56 d3 orps xmm2, xmm3
4ddc: 0f 28 c2 movaps xmm0, xmm2
4ddf: 5d pop rbp
4de0: c3 ret
```
Code generated by Clang with `-march=native` on Intel Raptor Lake:
```asm
0000000000004d50 <__llvm_libc_19_0_0_git::fmaximum_numf(float, float)>:
4d50: 55 push rbp
4d51: 48 89 e5 mov rbp, rsp
4d54: c5 f2 5f d0 vmaxss xmm2, xmm1, xmm0
4d58: c5 fa c2 c0 03 vcmpunordss xmm0, xmm0, xmm0
4d5d: c4 e3 69 4a c1 00 vblendvps xmm0, xmm2, xmm1, xmm0
4d63: 5d pop rbp
4d64: c3 ret
```
https://github.com/llvm/llvm-project/pull/99037
More information about the libc-commits
mailing list