[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