summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-01-07 18:42:46 +0100
committerJakub Jelinek <jakub@redhat.com>2022-01-07 18:42:46 +0100
commit4f9f14f3058439430752047e725b8845c03e4025 (patch)
treec8acb339b8ee02978fab595745cac18d402b2cc3
parentedf755a4e268fe57609eef31dd2ceb2177424566 (diff)
libgfortran: Avoid using libquadmath APIs on powerpc64le on glibc 2.32+
On a glibc 2.32+ build, we still use some libquadmath APIs when we shouldn't: readelf -Wr /home/jakub/gcc/obj/powerpc64le-unknown-linux-gnu/libgfortran/.libs/libgfortran.so.5 | grep QUADMATH 00000000002502c8 0000002600000015 R_PPC64_JMP_SLOT 0000000000000000 fmaq@QUADMATH_1.0 + 0 00000000002505f8 0000006700000015 R_PPC64_JMP_SLOT 0000000000000000 tanq@QUADMATH_1.0 + 0 0000000000250930 0000009b00000015 R_PPC64_JMP_SLOT 0000000000000000 fabsq@QUADMATH_1.0 + 0 0000000000250940 0000009d00000015 R_PPC64_JMP_SLOT 0000000000000000 sinq@QUADMATH_1.0 + 0 0000000000250c98 000000cf00000015 R_PPC64_JMP_SLOT 0000000000000000 copysignq@QUADMATH_1.0 + 0 0000000000251038 0000010700000015 R_PPC64_JMP_SLOT 0000000000000000 cosq@QUADMATH_1.0 + 0 0000000000251068 0000010a00000015 R_PPC64_JMP_SLOT 0000000000000000 fmodq@QUADMATH_1.0 + 0 These should use __fmaieee128, __tanieee128 etc. instead. 2022-01-07 Jakub Jelinek <jakub@redhat.com> * libgfortran.h (__copysignieee128, __fmaieee128, __fmodieee128): Declare. * intrinsics/trigd.c (COPYSIGN, FMOD, FABS, FMA, SIN, COS, TAN): If POWER_IEEE128 is defined, define these for kind 17 include. * intrinsics/trigd_lib.inc (COPYSIGN, FMOD, FABS, FMA, SIN, COS, TAN): Don't define if COPYSIGN is already defined.
-rw-r--r--libgfortran/intrinsics/trigd.c10
-rw-r--r--libgfortran/intrinsics/trigd_lib.inc2
-rw-r--r--libgfortran/libgfortran.h6
3 files changed, 18 insertions, 0 deletions
diff --git a/libgfortran/intrinsics/trigd.c b/libgfortran/intrinsics/trigd.c
index 9cc1b0b46cb..24a98fa9fe6 100644
--- a/libgfortran/intrinsics/trigd.c
+++ b/libgfortran/intrinsics/trigd.c
@@ -313,6 +313,16 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define HAVE_INFINITY_KIND
#endif
+#ifdef POWER_IEEE128
+#define COPYSIGN __copysignieee128
+#define FMOD __fmodieee128
+#define FABS __fabsieee128
+#define FMA __fmaieee128
+#define SIN __sinieee128
+#define COS __cosieee128
+#define TAN __tanieee128
+#endif
+
#include "trigd_lib.inc"
#undef KIND
diff --git a/libgfortran/intrinsics/trigd_lib.inc b/libgfortran/intrinsics/trigd_lib.inc
index 3f3c227b130..011cee59e48 100644
--- a/libgfortran/intrinsics/trigd_lib.inc
+++ b/libgfortran/intrinsics/trigd_lib.inc
@@ -65,6 +65,7 @@ PIO180L -- lower bits of pi/180 for FMA
#define CONCAT(x,y) x ## y
#define CONCAT_EXPAND(x,y) CONCAT(x,y)
+#ifndef COPYSIGN
#define COPYSIGN LITERAL(copysign)
#define FMOD LITERAL(fmod)
#define FABS LITERAL(fabs)
@@ -72,6 +73,7 @@ PIO180L -- lower bits of pi/180 for FMA
#define SIN LITERAL(sin)
#define COS LITERAL(cos)
#define TAN LITERAL(tan)
+#endif
#ifdef TINY
#define TINY_LITERAL LITERAL(TINY)
diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h
index 4f49bbaf567..f0a549f682b 100644
--- a/libgfortran/libgfortran.h
+++ b/libgfortran/libgfortran.h
@@ -1956,6 +1956,8 @@ extern __float128 __atanhieee128 (__float128)
__attribute__ ((__nothrow__, __leaf__));
extern __float128 __atanieee128 (__float128)
__attribute__ ((__nothrow__, __leaf__));
+extern __float128 __copysignieee128 (__float128, __float128)
+ __attribute__ ((__nothrow__, __leaf__));
extern __float128 __coshieee128 (__float128)
__attribute__ ((__nothrow__, __leaf__));
extern __float128 __cosieee128 (__float128)
@@ -1968,6 +1970,10 @@ extern __float128 __expieee128 (__float128)
__attribute__ ((__nothrow__, __leaf__));
extern __float128 __fabsieee128 (__float128)
__attribute__ ((__nothrow__, __leaf__));
+extern __float128 __fmaieee128 (__float128, __float128, __float128)
+ __attribute__ ((__nothrow__, __leaf__));
+extern __float128 __fmodieee128 (__float128, __float128)
+ __attribute__ ((__nothrow__, __leaf__));
extern __float128 __jnieee128 (int, __float128)
__attribute__ ((__nothrow__, __leaf__));
extern __float128 __log10ieee128 (__float128)