Skip to content

Commit 6f965e9

Browse files
committed
[compiler-rt] Stop using x86 intrinsic on AArch64 with GCC
Previously, building `multc3.c` on A64 with GCC 7 or up but 9 and lower will attempt to reference `__builtin_copysignq`, an [x86-specific intrinsic][1]: ``` $ gcc -c multc3.c In file included from fp_lib.h:24, from multc3.c:14: multc3.c: In function '__multc3': int_math.h:71:32: warning: implicit declaration of function '__builtin_copysignq'; did you mean '__builtin_copysign'? [-Wimplicit-function-declaration] #define crt_copysignf128(x, y) __builtin_copysignq((x), (y)) ^~~~~~~~~~~~~~~~~~~ ``` This is because `__has_builtin` is from GCC 10, and defined to 0 at the top of int_math.h for affected GCC versions, so the fallback definition is used. But `__builtin_copysignq` is unavailable on A64. Use version detection to find `__builtin_copysignf128` instead. It's available since GCC 7 and [available][2] on both x86 and A64, given this macro is only used when `CRT_HAS_IEEE_TF`. [1]: https://gcc.gnu.org/onlinedocs/gcc/x86-Built-in-Functions.html [2]: https://gcc.gnu.org/gcc-7/changes.html
1 parent 419d363 commit 6f965e9

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

compiler-rt/lib/builtins/int_math.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@
6565
#define crt_copysign(x, y) __builtin_copysign((x), (y))
6666
#define crt_copysignf(x, y) __builtin_copysignf((x), (y))
6767
#define crt_copysignl(x, y) __builtin_copysignl((x), (y))
68-
#if __has_builtin(__builtin_copysignf128)
68+
#if __has_builtin(__builtin_copysignf128) || \
69+
(defined(__GNUC__) && __GNUC__ >= 7)
6970
#define crt_copysignf128(x, y) __builtin_copysignf128((x), (y))
70-
#elif __has_builtin(__builtin_copysignq) || (defined(__GNUC__) && __GNUC__ >= 7)
71+
#elif __has_builtin(__builtin_copysignq)
7172
#define crt_copysignf128(x, y) __builtin_copysignq((x), (y))
7273
#endif
7374
#endif

0 commit comments

Comments
 (0)