diff options
-rw-r--r-- | lib/divdc3.c | 21 | ||||
-rw-r--r-- | lib/divsc3.c | 21 | ||||
-rw-r--r-- | lib/divxc3.c | 21 | ||||
-rw-r--r-- | lib/int_math.h | 28 | ||||
-rw-r--r-- | lib/muldc3.c | 35 | ||||
-rw-r--r-- | lib/mulsc3.c | 35 | ||||
-rw-r--r-- | lib/mulxc3.c | 35 | ||||
-rw-r--r-- | lib/ppc/divtc3.c | 22 | ||||
-rw-r--r-- | lib/ppc/multc3.c | 30 |
9 files changed, 147 insertions, 101 deletions
diff --git a/lib/divdc3.c b/lib/divdc3.c index 95f8c930..620b8cad 100644 --- a/lib/divdc3.c +++ b/lib/divdc3.c @@ -13,6 +13,7 @@ */ #include "int_lib.h" +#include "int_math.h" #include <math.h> /* Returns: the quotient of (a + ib) / (c + id) */ @@ -22,7 +23,7 @@ __divdc3(double __a, double __b, double __c, double __d) { int __ilogbw = 0; double __logbw = logb(fmax(fabs(__c), fabs(__d))); - if (isfinite(__logbw)) + if (crt_isfinite(__logbw)) { __ilogbw = (int)__logbw; __c = scalbn(__c, -__ilogbw); @@ -32,24 +33,26 @@ __divdc3(double __a, double __b, double __c, double __d) double _Complex z; __real__ z = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); __imag__ z = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); - if (isnan(__real__ z) && isnan(__imag__ z)) + if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) { - if ((__denom == 0.0) && (!isnan(__a) || !isnan(__b))) + if ((__denom == 0.0) && (!crt_isnan(__a) || !crt_isnan(__b))) { __real__ z = copysign(INFINITY, __c) * __a; __imag__ z = copysign(INFINITY, __c) * __b; } - else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d)) + else if ((crt_isinf(__a) || crt_isinf(__b)) && + crt_isfinite(__c) && crt_isfinite(__d)) { - __a = copysign(isinf(__a) ? 1.0 : 0.0, __a); - __b = copysign(isinf(__b) ? 1.0 : 0.0, __b); + __a = copysign(crt_isinf(__a) ? 1.0 : 0.0, __a); + __b = copysign(crt_isinf(__b) ? 1.0 : 0.0, __b); __real__ z = INFINITY * (__a * __c + __b * __d); __imag__ z = INFINITY * (__b * __c - __a * __d); } - else if (isinf(__logbw) && __logbw > 0.0 && isfinite(__a) && isfinite(__b)) + else if (crt_isinf(__logbw) && __logbw > 0.0 && + crt_isfinite(__a) && crt_isfinite(__b)) { - __c = copysign(isinf(__c) ? 1.0 : 0.0, __c); - __d = copysign(isinf(__d) ? 1.0 : 0.0, __d); + __c = copysign(crt_isinf(__c) ? 1.0 : 0.0, __c); + __d = copysign(crt_isinf(__d) ? 1.0 : 0.0, __d); __real__ z = 0.0 * (__a * __c + __b * __d); __imag__ z = 0.0 * (__b * __c - __a * __d); } diff --git a/lib/divsc3.c b/lib/divsc3.c index 50ca81e5..88e2e094 100644 --- a/lib/divsc3.c +++ b/lib/divsc3.c @@ -13,6 +13,7 @@ */ #include "int_lib.h" +#include "int_math.h" #include <math.h> /* Returns: the quotient of (a + ib) / (c + id) */ @@ -22,7 +23,7 @@ __divsc3(float __a, float __b, float __c, float __d) { int __ilogbw = 0; float __logbw = logbf(fmaxf(fabsf(__c), fabsf(__d))); - if (isfinite(__logbw)) + if (crt_isfinite(__logbw)) { __ilogbw = (int)__logbw; __c = scalbnf(__c, -__ilogbw); @@ -32,24 +33,26 @@ __divsc3(float __a, float __b, float __c, float __d) float _Complex z; __real__ z = scalbnf((__a * __c + __b * __d) / __denom, -__ilogbw); __imag__ z = scalbnf((__b * __c - __a * __d) / __denom, -__ilogbw); - if (isnan(__real__ z) && isnan(__imag__ z)) + if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) { - if ((__denom == 0) && (!isnan(__a) || !isnan(__b))) + if ((__denom == 0) && (!crt_isnan(__a) || !crt_isnan(__b))) { __real__ z = copysignf(INFINITY, __c) * __a; __imag__ z = copysignf(INFINITY, __c) * __b; } - else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d)) + else if ((crt_isinf(__a) || crt_isinf(__b)) && + crt_isfinite(__c) && crt_isfinite(__d)) { - __a = copysignf(isinf(__a) ? 1 : 0, __a); - __b = copysignf(isinf(__b) ? 1 : 0, __b); + __a = copysignf(crt_isinf(__a) ? 1 : 0, __a); + __b = copysignf(crt_isinf(__b) ? 1 : 0, __b); __real__ z = INFINITY * (__a * __c + __b * __d); __imag__ z = INFINITY * (__b * __c - __a * __d); } - else if (isinf(__logbw) && __logbw > 0 && isfinite(__a) && isfinite(__b)) + else if (crt_isinf(__logbw) && __logbw > 0 && + crt_isfinite(__a) && crt_isfinite(__b)) { - __c = copysignf(isinf(__c) ? 1 : 0, __c); - __d = copysignf(isinf(__d) ? 1 : 0, __d); + __c = copysignf(crt_isinf(__c) ? 1 : 0, __c); + __d = copysignf(crt_isinf(__d) ? 1 : 0, __d); __real__ z = 0 * (__a * __c + __b * __d); __imag__ z = 0 * (__b * __c - __a * __d); } diff --git a/lib/divxc3.c b/lib/divxc3.c index 32364d62..66111db5 100644 --- a/lib/divxc3.c +++ b/lib/divxc3.c @@ -14,6 +14,7 @@ #if !_ARCH_PPC #include "int_lib.h" +#include "int_math.h" #include <math.h> /* Returns: the quotient of (a + ib) / (c + id) */ @@ -23,7 +24,7 @@ __divxc3(long double __a, long double __b, long double __c, long double __d) { int __ilogbw = 0; long double __logbw = logbl(fmaxl(fabsl(__c), fabsl(__d))); - if (isfinite(__logbw)) + if (crt_isfinite(__logbw)) { __ilogbw = (int)__logbw; __c = scalbnl(__c, -__ilogbw); @@ -33,24 +34,26 @@ __divxc3(long double __a, long double __b, long double __c, long double __d) long double _Complex z; __real__ z = scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw); __imag__ z = scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw); - if (isnan(__real__ z) && isnan(__imag__ z)) + if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) { - if ((__denom == 0) && (!isnan(__a) || !isnan(__b))) + if ((__denom == 0) && (!crt_isnan(__a) || !crt_isnan(__b))) { __real__ z = copysignl(INFINITY, __c) * __a; __imag__ z = copysignl(INFINITY, __c) * __b; } - else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d)) + else if ((crt_isinf(__a) || crt_isinf(__b)) && + crt_isfinite(__c) && crt_isfinite(__d)) { - __a = copysignl(isinf(__a) ? 1 : 0, __a); - __b = copysignl(isinf(__b) ? 1 : 0, __b); + __a = copysignl(crt_isinf(__a) ? 1 : 0, __a); + __b = copysignl(crt_isinf(__b) ? 1 : 0, __b); __real__ z = INFINITY * (__a * __c + __b * __d); __imag__ z = INFINITY * (__b * __c - __a * __d); } - else if (isinf(__logbw) && __logbw > 0 && isfinite(__a) && isfinite(__b)) + else if (crt_isinf(__logbw) && __logbw > 0 && + crt_isfinite(__a) && crt_isfinite(__b)) { - __c = copysignl(isinf(__c) ? 1 : 0, __c); - __d = copysignl(isinf(__d) ? 1 : 0, __d); + __c = copysignl(crt_isinf(__c) ? 1 : 0, __c); + __d = copysignl(crt_isinf(__d) ? 1 : 0, __d); __real__ z = 0 * (__a * __c + __b * __d); __imag__ z = 0 * (__b * __c - __a * __d); } diff --git a/lib/int_math.h b/lib/int_math.h new file mode 100644 index 00000000..856889d8 --- /dev/null +++ b/lib/int_math.h @@ -0,0 +1,28 @@ +/* ===-- int_math.h - internal math inlines ---------------------------------=== + * + * The LLVM Compiler Infrastructure + * + * This file is dual licensed under the MIT and the University of Illinois Open + * Source Licenses. See LICENSE.TXT for details. + * + * ===-----------------------------------------------------------------------=== + * + * This file is not part of the interface of this library. + * + * This file defines substitutes for the libm functions used in some of the + * compiler-rt implementations, defined in such a way that there is not a direct + * dependency on libm or math.h. Instead, we use the compiler builtin versions + * where available. This reduces our dependencies on the system SDK by foisting + * the responsibility onto the compiler. + * + * ===-----------------------------------------------------------------------=== + */ + +#ifndef INT_MATH_H +#define INT_MATH_H + +#define crt_isfinite(x) __builtin_isfinite((x)) +#define crt_isinf(x) __builtin_isinf((x)) +#define crt_isnan(x) __builtin_isnan((x)) + +#endif /* INT_MATH_H */ diff --git a/lib/muldc3.c b/lib/muldc3.c index d92ee7af..0f3be9eb 100644 --- a/lib/muldc3.c +++ b/lib/muldc3.c @@ -13,6 +13,7 @@ */ #include "int_lib.h" +#include "int_math.h" #include <math.h> /* Returns: the product of a + ib and c + id */ @@ -27,39 +28,39 @@ __muldc3(double __a, double __b, double __c, double __d) double _Complex z; __real__ z = __ac - __bd; __imag__ z = __ad + __bc; - if (isnan(__real__ z) && isnan(__imag__ z)) + if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) { int __recalc = 0; - if (isinf(__a) || isinf(__b)) + if (crt_isinf(__a) || crt_isinf(__b)) { - __a = copysign(isinf(__a) ? 1 : 0, __a); - __b = copysign(isinf(__b) ? 1 : 0, __b); - if (isnan(__c)) + __a = copysign(crt_isinf(__a) ? 1 : 0, __a); + __b = copysign(crt_isinf(__b) ? 1 : 0, __b); + if (crt_isnan(__c)) __c = copysign(0, __c); - if (isnan(__d)) + if (crt_isnan(__d)) __d = copysign(0, __d); __recalc = 1; } - if (isinf(__c) || isinf(__d)) + if (crt_isinf(__c) || crt_isinf(__d)) { - __c = copysign(isinf(__c) ? 1 : 0, __c); - __d = copysign(isinf(__d) ? 1 : 0, __d); - if (isnan(__a)) + __c = copysign(crt_isinf(__c) ? 1 : 0, __c); + __d = copysign(crt_isinf(__d) ? 1 : 0, __d); + if (crt_isnan(__a)) __a = copysign(0, __a); - if (isnan(__b)) + if (crt_isnan(__b)) __b = copysign(0, __b); __recalc = 1; } - if (!__recalc && (isinf(__ac) || isinf(__bd) || - isinf(__ad) || isinf(__bc))) + if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || + crt_isinf(__ad) || crt_isinf(__bc))) { - if (isnan(__a)) + if (crt_isnan(__a)) __a = copysign(0, __a); - if (isnan(__b)) + if (crt_isnan(__b)) __b = copysign(0, __b); - if (isnan(__c)) + if (crt_isnan(__c)) __c = copysign(0, __c); - if (isnan(__d)) + if (crt_isnan(__d)) __d = copysign(0, __d); __recalc = 1; } diff --git a/lib/mulsc3.c b/lib/mulsc3.c index 28f9d338..ec0411a5 100644 --- a/lib/mulsc3.c +++ b/lib/mulsc3.c @@ -13,6 +13,7 @@ */ #include "int_lib.h" +#include "int_math.h" #include <math.h> /* Returns: the product of a + ib and c + id */ @@ -27,39 +28,39 @@ __mulsc3(float __a, float __b, float __c, float __d) float _Complex z; __real__ z = __ac - __bd; __imag__ z = __ad + __bc; - if (isnan(__real__ z) && isnan(__imag__ z)) + if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) { int __recalc = 0; - if (isinf(__a) || isinf(__b)) + if (crt_isinf(__a) || crt_isinf(__b)) { - __a = copysignf(isinf(__a) ? 1 : 0, __a); - __b = copysignf(isinf(__b) ? 1 : 0, __b); - if (isnan(__c)) + __a = copysignf(crt_isinf(__a) ? 1 : 0, __a); + __b = copysignf(crt_isinf(__b) ? 1 : 0, __b); + if (crt_isnan(__c)) __c = copysignf(0, __c); - if (isnan(__d)) + if (crt_isnan(__d)) __d = copysignf(0, __d); __recalc = 1; } - if (isinf(__c) || isinf(__d)) + if (crt_isinf(__c) || crt_isinf(__d)) { - __c = copysignf(isinf(__c) ? 1 : 0, __c); - __d = copysignf(isinf(__d) ? 1 : 0, __d); - if (isnan(__a)) + __c = copysignf(crt_isinf(__c) ? 1 : 0, __c); + __d = copysignf(crt_isinf(__d) ? 1 : 0, __d); + if (crt_isnan(__a)) __a = copysignf(0, __a); - if (isnan(__b)) + if (crt_isnan(__b)) __b = copysignf(0, __b); __recalc = 1; } - if (!__recalc && (isinf(__ac) || isinf(__bd) || - isinf(__ad) || isinf(__bc))) + if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || + crt_isinf(__ad) || crt_isinf(__bc))) { - if (isnan(__a)) + if (crt_isnan(__a)) __a = copysignf(0, __a); - if (isnan(__b)) + if (crt_isnan(__b)) __b = copysignf(0, __b); - if (isnan(__c)) + if (crt_isnan(__c)) __c = copysignf(0, __c); - if (isnan(__d)) + if (crt_isnan(__d)) __d = copysignf(0, __d); __recalc = 1; } diff --git a/lib/mulxc3.c b/lib/mulxc3.c index a7f23554..ae59d052 100644 --- a/lib/mulxc3.c +++ b/lib/mulxc3.c @@ -15,6 +15,7 @@ #if !_ARCH_PPC #include "int_lib.h" +#include "int_math.h" #include <math.h> /* Returns: the product of a + ib and c + id */ @@ -29,39 +30,39 @@ __mulxc3(long double __a, long double __b, long double __c, long double __d) long double _Complex z; __real__ z = __ac - __bd; __imag__ z = __ad + __bc; - if (isnan(__real__ z) && isnan(__imag__ z)) + if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) { int __recalc = 0; - if (isinf(__a) || isinf(__b)) + if (crt_isinf(__a) || crt_isinf(__b)) { - __a = copysignl(isinf(__a) ? 1 : 0, __a); - __b = copysignl(isinf(__b) ? 1 : 0, __b); - if (isnan(__c)) + __a = copysignl(crt_isinf(__a) ? 1 : 0, __a); + __b = copysignl(crt_isinf(__b) ? 1 : 0, __b); + if (crt_isnan(__c)) __c = copysignl(0, __c); - if (isnan(__d)) + if (crt_isnan(__d)) __d = copysignl(0, __d); __recalc = 1; } - if (isinf(__c) || isinf(__d)) + if (crt_isinf(__c) || crt_isinf(__d)) { - __c = copysignl(isinf(__c) ? 1 : 0, __c); - __d = copysignl(isinf(__d) ? 1 : 0, __d); - if (isnan(__a)) + __c = copysignl(crt_isinf(__c) ? 1 : 0, __c); + __d = copysignl(crt_isinf(__d) ? 1 : 0, __d); + if (crt_isnan(__a)) __a = copysignl(0, __a); - if (isnan(__b)) + if (crt_isnan(__b)) __b = copysignl(0, __b); __recalc = 1; } - if (!__recalc && (isinf(__ac) || isinf(__bd) || - isinf(__ad) || isinf(__bc))) + if (!__recalc && (crt_isinf(__ac) || crt_isinf(__bd) || + crt_isinf(__ad) || crt_isinf(__bc))) { - if (isnan(__a)) + if (crt_isnan(__a)) __a = copysignl(0, __a); - if (isnan(__b)) + if (crt_isnan(__b)) __b = copysignl(0, __b); - if (isnan(__c)) + if (crt_isnan(__c)) __c = copysignl(0, __c); - if (isnan(__d)) + if (crt_isnan(__d)) __d = copysignl(0, __d); __recalc = 1; } diff --git a/lib/ppc/divtc3.c b/lib/ppc/divtc3.c index d41f6211..d718d5a2 100644 --- a/lib/ppc/divtc3.c +++ b/lib/ppc/divtc3.c @@ -3,16 +3,17 @@ */ #include "DD.h" +#include "../int_math.h" #include <math.h> #if !defined(INFINITY) && defined(HUGE_VAL) #define INFINITY HUGE_VAL #endif /* INFINITY */ -#define makeFinite(x) { \ - (x).s.hi = __builtin_copysign(isinf((x).s.hi) ? 1.0 : 0.0, (x).s.hi); \ - (x).s.lo = 0.0; \ - } +#define makeFinite(x) { \ + (x).s.hi = __builtin_copysign(crt_isinf((x).s.hi) ? 1.0 : 0.0, (x).s.hi); \ + (x).s.lo = 0.0; \ + } long double __gcc_qadd(long double, long double); long double __gcc_qsub(long double, long double); @@ -28,7 +29,7 @@ __divtc3(long double a, long double b, long double c, long double d) int ilogbw = 0; const double logbw = logb(__builtin_fmax( __builtin_fabs(cDD.s.hi), __builtin_fabs(dDD.s.hi) )); - if (isfinite(logbw)) + if (crt_isfinite(logbw)) { ilogbw = (int)logbw; @@ -50,13 +51,14 @@ __divtc3(long double a, long double b, long double c, long double d) imag.s.hi = scalbn(imag.s.hi, -ilogbw); imag.s.lo = scalbn(imag.s.lo, -ilogbw); - if (isnan(real.s.hi) && isnan(imag.s.hi)) + if (crt_isnan(real.s.hi) && crt_isnan(imag.s.hi)) { DD aDD = { .ld = a }; DD bDD = { .ld = b }; DD rDD = { .ld = denom }; - if ((rDD.s.hi == 0.0) && (!isnan(aDD.s.hi) || !isnan(bDD.s.hi))) + if ((rDD.s.hi == 0.0) && (!crt_isnan(aDD.s.hi) || + !crt_isnan(bDD.s.hi))) { real.s.hi = __builtin_copysign(INFINITY,cDD.s.hi) * aDD.s.hi; real.s.lo = 0.0; @@ -64,7 +66,8 @@ __divtc3(long double a, long double b, long double c, long double d) imag.s.lo = 0.0; } - else if ((isinf(aDD.s.hi) || isinf(bDD.s.hi)) && isfinite(cDD.s.hi) && isfinite(dDD.s.hi)) + else if ((crt_isinf(aDD.s.hi) || crt_isinf(bDD.s.hi)) && + crt_isfinite(cDD.s.hi) && crt_isfinite(dDD.s.hi)) { makeFinite(aDD); makeFinite(bDD); @@ -74,7 +77,8 @@ __divtc3(long double a, long double b, long double c, long double d) imag.s.lo = 0.0; } - else if ((isinf(cDD.s.hi) || isinf(dDD.s.hi)) && isfinite(aDD.s.hi) && isfinite(bDD.s.hi)) + else if ((crt_isinf(cDD.s.hi) || crt_isinf(dDD.s.hi)) && + crt_isfinite(aDD.s.hi) && crt_isfinite(bDD.s.hi)) { makeFinite(cDD); makeFinite(dDD); diff --git a/lib/ppc/multc3.c b/lib/ppc/multc3.c index 9d17a2c6..d04a9017 100644 --- a/lib/ppc/multc3.c +++ b/lib/ppc/multc3.c @@ -3,23 +3,24 @@ */ #include "DD.h" +#include "../int_math.h" #include <math.h> #if !defined(INFINITY) && defined(HUGE_VAL) #define INFINITY HUGE_VAL #endif /* INFINITY */ -#define makeFinite(x) { \ - (x).s.hi = __builtin_copysign(isinf((x).s.hi) ? 1.0 : 0.0, (x).s.hi); \ - (x).s.lo = 0.0; \ - } +#define makeFinite(x) { \ + (x).s.hi = __builtin_copysign(crt_isinf((x).s.hi) ? 1.0 : 0.0, (x).s.hi); \ + (x).s.lo = 0.0; \ + } -#define zeroNaN(x) { \ - if (isnan((x).s.hi)) { \ - (x).s.hi = __builtin_copysign(0.0, (x).s.hi); \ - (x).s.lo = 0.0; \ - } \ - } +#define zeroNaN() { \ + if (crt_isnan((x).s.hi)) { \ + (x).s.hi = __builtin_copysign(0.0, (x).s.hi); \ + (x).s.lo = 0.0; \ + } \ + } long double __gcc_qadd(long double, long double); long double __gcc_qsub(long double, long double); @@ -36,7 +37,7 @@ __multc3(long double a, long double b, long double c, long double d) DD real = { .ld = __gcc_qsub(ac,bd) }; DD imag = { .ld = __gcc_qadd(ad,bc) }; - if (isnan(real.s.hi) && isnan(imag.s.hi)) + if (crt_isnan(real.s.hi) && crt_isnan(imag.s.hi)) { int recalc = 0; @@ -45,7 +46,7 @@ __multc3(long double a, long double b, long double c, long double d) DD cDD = { .ld = c }; DD dDD = { .ld = d }; - if (isinf(aDD.s.hi) || isinf(bDD.s.hi)) + if (crt_isinf(aDD.s.hi) || crt_isinf(bDD.s.hi)) { makeFinite(aDD); makeFinite(bDD); @@ -54,7 +55,7 @@ __multc3(long double a, long double b, long double c, long double d) recalc = 1; } - if (isinf(cDD.s.hi) || isinf(dDD.s.hi)) + if (crt_isinf(cDD.s.hi) || crt_isinf(dDD.s.hi)) { makeFinite(cDD); makeFinite(dDD); @@ -70,7 +71,8 @@ __multc3(long double a, long double b, long double c, long double d) DD adDD = { .ld = ad }; DD bcDD = { .ld = bc }; - if (isinf(acDD.s.hi) || isinf(bdDD.s.hi) || isinf(adDD.s.hi) || isinf(bcDD.s.hi)) + if (crt_isinf(acDD.s.hi) || crt_isinf(bdDD.s.hi) || + crt_isinf(adDD.s.hi) || crt_isinf(bcDD.s.hi)) { zeroNaN(aDD); zeroNaN(bDD); |