mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-13 14:50:17 +00:00
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.
This commit is contained in:
parent
91da896a3e
commit
9e8081d123
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -17,6 +17,7 @@
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <math_ldbl_opt.h>
|
||||
#include <math_private.h>
|
||||
#include <libm-alias-double.h>
|
||||
|
||||
/* 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))
|
||||
|
@ -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))
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user