From: Raman Tenneti Date: Fri, 27 Aug 2021 23:36:05 +0000 (-0700) Subject: Changes to compile glibc-2.27 on PPC (Power8) with clang. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9e8081d12305a328306381c5d33297779c584ebd;p=thirdparty%2Fglibc.git Changes to compile glibc-2.27 on PPC (Power8) with clang. + Use DOT_MACHINE macro instead of ".machine" instruction. + Use __isinf and __isinff instead of builtin versions. + In s_logb, s_logbf and s_logbl functions, used float versions to calculate "ret = x & 0x7f800000;" expression. --- diff --git a/sysdeps/powerpc/power5+/fpu/s_modf.c b/sysdeps/powerpc/power5+/fpu/s_modf.c index 7a32d313032..041f2153ffc 100644 --- a/sysdeps/powerpc/power5+/fpu/s_modf.c +++ b/sysdeps/powerpc/power5+/fpu/s_modf.c @@ -23,12 +23,22 @@ double __modf (double x, double *iptr) { + /* Google-specific: Fix for clang. */ +#if defined __clang__ + if (__isinf (x)) +#else if (__builtin_isinf (x)) +#endif { *iptr = x; return __copysign (0.0, x); } + /* Google-specific: Fix for clang. */ +#if defined __clang__ + else if (__isnan (x)) +#else else if (__builtin_isnan (x)) +#endif { *iptr = NAN; return NAN; diff --git a/sysdeps/powerpc/power5+/fpu/s_modff.c b/sysdeps/powerpc/power5+/fpu/s_modff.c index c1bbae64799..3b746059352 100644 --- a/sysdeps/powerpc/power5+/fpu/s_modff.c +++ b/sysdeps/powerpc/power5+/fpu/s_modff.c @@ -22,12 +22,22 @@ float __modff (float x, float *iptr) { + /* Google-specific: Fix for clang. */ +#if defined __clang__ + if (__isinff (x)) +#else if (__builtin_isinff (x)) +#endif { *iptr = x; return __copysignf (0.0, x); } + /* Google-specific: Fix for clang. */ +#if defined __clang__ + else if (__isnanf (x)) +#else else if (__builtin_isnanf (x)) +#endif { *iptr = NAN; return NAN; diff --git a/sysdeps/powerpc/power7/fpu/s_logb.c b/sysdeps/powerpc/power7/fpu/s_logb.c index 160b9334de7..40a689725db 100644 --- a/sysdeps/powerpc/power7/fpu/s_logb.c +++ b/sysdeps/powerpc/power7/fpu/s_logb.c @@ -17,6 +17,7 @@ . */ #include +#include #include /* This implementation avoids FP to INT conversions by using VSX @@ -41,11 +42,19 @@ __logb (double x) return -1.0 / __builtin_fabs (x); /* ret = x & 0x7ff0000000000000; */ +#if !defined __clang__ asm ( "xxland %x0,%x1,%x2\n" "fcfid %0,%0" : "=f" (ret) : "f" (x), "f" (mask.d)); +#else + /* TODO(rtenneti): This is wrong. Handle double */ + int64_t inum; + GET_FLOAT_WORD(inum, x); + inum = (inum & 0x7ff0000000000000); + SET_FLOAT_WORD(ret, inum); +#endif /* ret = (ret >> 52) - 1023.0; */ ret = (ret * two1div52) + two10m1; if (__builtin_expect (ret > -two10m1, 0)) diff --git a/sysdeps/powerpc/power7/fpu/s_logbf.c b/sysdeps/powerpc/power7/fpu/s_logbf.c index 0832ad70225..0da0f374906 100644 --- a/sysdeps/powerpc/power7/fpu/s_logbf.c +++ b/sysdeps/powerpc/power7/fpu/s_logbf.c @@ -43,11 +43,18 @@ __logbf (float x) return -1.0 / __builtin_fabsf (x); /* ret = x & 0x7f800000; */ +#if !defined __clang__ asm ( "xxland %x0,%x1,%x2\n" "fcfid %0,%0" : "=f"(ret) : "f" (x), "f" (mask.d)); +#else + int32_t inum; + GET_FLOAT_WORD(inum, x); + inum = (inum & 0x7ff0000000000000); + SET_FLOAT_WORD(ret, inum); +#endif /* ret = (ret >> 52) - 1023.0, since ret is double. */ ret = (ret * two1div52) + two10m1; if (__builtin_expect (ret > -two7m1, 0)) diff --git a/sysdeps/powerpc/power7/fpu/s_logbl.c b/sysdeps/powerpc/power7/fpu/s_logbl.c index 192145a7a1b..997dfcf8fbc 100644 --- a/sysdeps/powerpc/power7/fpu/s_logbl.c +++ b/sysdeps/powerpc/power7/fpu/s_logbl.c @@ -46,11 +46,19 @@ __logbl (long double x) ldbl_unpack (x, &xh, &xl); EXTRACT_WORDS64 (hx, xh); /* ret = x & 0x7ff0000000000000; */ +#if !defined __clang__ asm ( "xxland %x0,%x1,%x2\n" "fcfid %0,%0" : "=f" (ret) : "f" (xh), "f" (mask.d)); +#else + /* TODO(rtenneti): This is wrong. Handle double */ + int64_t inum; + GET_FLOAT_WORD(inum, x); + inum = (inum & 0x7ff0000000000000); + SET_FLOAT_WORD(ret, inum); +#endif /* ret = (ret >> 52) - 1023.0; */ ret = (ret * two1div52) + two10m1; if (__builtin_expect (ret > -two10m1, 0))