[builtins] Fix ABI-incompatibility with GCC for floating-point compare
While implementing support for the float128 routines on x86_64, I noticed that __builtin_isinf() was returning true for 128-bit floating point values that are not infinite when compiling with GCC and using the compiler-rt implementation of the soft-float comparison functions. After stepping through the assembly, I discovered that this was caused by GCC assuming a sign-extended 64-bit -1 result, but our implementation returns an enum (which then has zeroes in the upper bits) and therefore causes the comparison with -1 to fail. Fix this by using a CMP_RESULT typedef and add a static_assert that it matches the GCC soft-float comparison return type when compiling with GCC (GCC has a __libgcc_cmp_return__ mode that can be used for this purpose). Also move the 3 copies of the same code to a shared .inc file. Reviewed By: compnerd Differential Revision: https://reviews.llvm.org/D98205
Loading
Please sign in to comment