diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-09-25 17:43:58 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-09-25 17:43:58 +0000 |
commit | 0e05d9826e6d32a27392ed9d6fe613ef6cf957a0 (patch) | |
tree | 6e88884bf2f757103209ad4d97d61f37db5cc1d7 | |
parent | cf7b82ed31eaa526c74f8b1af6f0cfec315f1d69 (diff) |
- remove files that are not either LGPL or Public Domain.
- pull replacement funcs for fpmacros.c from glibc
This removes the powerpc/classic implementation which did not state any
license but read:
Copyright © 1991 Apple Computer, Inc. All rights reserved.
and thus was dubious (and not needed).
-rw-r--r-- | libm/Makefile.in | 17 | ||||
-rw-r--r-- | libm/fp_private.h | 90 | ||||
-rw-r--r-- | libm/fpmacros.c | 303 | ||||
-rw-r--r-- | libm/powerpc/classic/s_ceil.c | 113 | ||||
-rw-r--r-- | libm/powerpc/classic/s_copysign.c | 59 | ||||
-rw-r--r-- | libm/powerpc/classic/s_floor.c | 113 | ||||
-rw-r--r-- | libm/powerpc/classic/s_frexp.c | 65 | ||||
-rw-r--r-- | libm/powerpc/classic/s_ldexp.c | 49 | ||||
-rw-r--r-- | libm/powerpc/classic/s_logb.c | 107 | ||||
-rw-r--r-- | libm/powerpc/classic/s_modf.c | 344 | ||||
-rw-r--r-- | libm/powerpc/classic/s_nearbyint.c | 38 | ||||
-rw-r--r-- | libm/powerpc/classic/s_rint.c | 159 | ||||
-rw-r--r-- | libm/powerpc/classic/s_round.c | 115 | ||||
-rw-r--r-- | libm/powerpc/classic/s_trunc.c | 89 | ||||
-rw-r--r-- | libm/powerpc/classic/w_scalb.c | 94 | ||||
-rw-r--r-- | libm/s_fpclassify.c | 44 | ||||
-rw-r--r-- | libm/s_fpclassifyf.c | 44 | ||||
-rw-r--r-- | libm/s_isinf.c | 34 | ||||
-rw-r--r-- | libm/s_isinff.c | 30 | ||||
-rw-r--r-- | libm/s_isnan.c | 45 | ||||
-rw-r--r-- | libm/s_isnanf.c | 43 | ||||
-rw-r--r-- | libm/s_signbit.c | 34 | ||||
-rw-r--r-- | libm/s_signbitf.c | 34 |
23 files changed, 313 insertions, 1750 deletions
diff --git a/libm/Makefile.in b/libm/Makefile.in index f3768d38e..a94989dcf 100644 --- a/libm/Makefile.in +++ b/libm/Makefile.in @@ -34,15 +34,10 @@ libm_OUT:=$(top_builddir)libm # Fix builds for powerpc as there are different cores in this # section now.` -ifeq ($(TARGET_ARCH),powerpc) -ifeq ($(CONFIG_E500),y) +ifeq ($(TARGET_ARCH)-$(CONFIG_E500),powerpc-y) libm_ARCH_DIR:=$(libm_DIR)/$(TARGET_ARCH)/e500 libm_ARCH_OUT:=$(libm_OUT)/$(TARGET_ARCH)/e500 else -libm_ARCH_DIR:=$(libm_DIR)/$(TARGET_ARCH)/classic -libm_ARCH_OUT:=$(libm_OUT)/$(TARGET_ARCH)/classic -endif -else libm_ARCH_DIR:=$(libm_DIR)/$(TARGET_ARCH) libm_ARCH_OUT:=$(libm_OUT)/$(TARGET_ARCH) endif @@ -74,7 +69,9 @@ libm_CSRC := \ w_cabs.c w_cosh.c w_drem.c w_exp.c w_fmod.c w_gamma.c w_gamma_r.c \ w_hypot.c w_j0.c w_j1.c w_jn.c w_lgamma.c w_lgamma_r.c \ w_log.c w_log10.c w_pow.c w_remainder.c w_scalb.c w_sinh.c \ - w_sqrt.c fpmacros.c nan.c carg.c s_llrint.c + w_sqrt.c nan.c carg.c s_llrint.c \ + s_fpclassify.c s_fpclassifyf.c s_signbit.c s_signbitf.c \ + s_isnan.c s_isnanf.c s_isnf.c s_isinff.c FL_MOBJ := \ acosf.o acoshf.o asinf.o asinhf.o atan2f.o atanf.o atanhf.o cbrtf.o \ ceilf.o copysignf.o cosf.o coshf.o erfcf.o erff.o exp2f.o expf.o \ @@ -103,13 +100,9 @@ endif ifeq ($(UCLIBC_HAS_FPU),y) ifeq ($(DO_C99_MATH),y) ifneq ($(strip $(libm_ARCH_OBJS)),) -ifeq ($(TARGET_ARCH),powerpc) -ifeq ($(CONFIG_E500),y) +ifeq ($(TARGET_ARCH)-$(CONFIG_E500),powerpc-y) CFLAGS-libm/$(TARGET_ARCH)/e500/ := $(CFLAGS-libm) else -CFLAGS-libm/$(TARGET_ARCH)/classic/ := $(CFLAGS-libm) -endif -else CFLAGS-libm/$(TARGET_ARCH)/ := $(CFLAGS-libm) endif diff --git a/libm/fp_private.h b/libm/fp_private.h deleted file mode 100644 index 0ddb616c4..000000000 --- a/libm/fp_private.h +++ /dev/null @@ -1,90 +0,0 @@ -/******************************************************************************* -* * -* File fp_private.h, * -* All pack 4 dependencies for the MathLib elems plus some defines used * -* throughout MathLib. * -* * -* Copyright © 1991 Apple Computer, Inc. All rights reserved. * -* * -* Written by Ali Sazegari, started on October 1991, * -* * -* W A R N I N G: This routine expects a 64 bit double model. * -* * -*******************************************************************************/ - -#define NoException 0 - -/******************************************************************************* -* Values of constants. * -*******************************************************************************/ - -//#define SgnMask 0x8000 -#define dSgnMask 0x80000000 -#define sSgnMask 0x7FFFFFFF - -//#define ExpMask 0x7FFF -#define dExpMask 0x7FF00000 -#define sExpMask 0xFF000000 - - /* according to rounding BIG & SMALL are: */ -#define BIG 1.1e+300 /* used to deliver ±° or largest number, */ -#define SMALL 1.1e-300 /* used to deliver ±0 or smallest number. */ -#define InfExp 0x7FF -#define dMaxExp 0x7FF00000 - -#define MaxExpP1 1024 -#define MaxExp 1023 - -#define DenormLimit -52 - -//#define ManMask 0x80000000 -#define dManMask 0x00080000 - -//#define IsItDenorm 0x80000000 -#define dIsItDenorm 0x00080000 - -//#define xIsItSNaN 0x40000000 -#define dIsItSNaN 0x00080000 - -#define dHighMan 0x000FFFFF -#define dFirstBitSet 0x00080000 -#define BIAS 0x3FF - -//#define GetSign 0x8000 -#define dGetSign 0x80000000 -#define sGetSign 0x80000000 - -//#define Infinity(x) ( x.hex.exponent & ExpMask ) == ExpMask -#define dInfinity(x) ( x.hex.high & dExpMask ) == dExpMask -#define sInfinity(x) ( ( x.hexsgl << 1 ) & sExpMask ) == sExpMask - -//#define Exponent(x) x.hex.exponent & ExpMask -#define dExponent(x) x.hex.high & dExpMask -#define sExponent(x) ( ( x.hexsgl << 1 ) & sExpMask ) - -#define sZero(x) ( x.hexsgl & sSgnMask ) == 0 -//#define Sign(x) ( x.hex.exponent & SgnMask ) == SgnMask - -/******************************************************************************* -* Types used in the auxiliary functions. * -*******************************************************************************/ - -#include <stdint.h> -#include <endian.h> - -typedef struct /* Hex representation of a double. */ - { -#if (__BYTE_ORDER == __BIG_ENDIAN) - uint32_t high; - uint32_t low; -#else - uint32_t low; - uint32_t high; -#endif - } dHexParts; - -typedef union - { - unsigned char byties[8]; - double dbl; - } DblInHex; diff --git a/libm/fpmacros.c b/libm/fpmacros.c deleted file mode 100644 index 0a079c016..000000000 --- a/libm/fpmacros.c +++ /dev/null @@ -1,303 +0,0 @@ -/*********************************************************************** -** File: fpmacros.c -** -** Contains: C source code for implementations of floating-point -** functions which involve float format numbers, as -** defined in header <fp.h>. In particular, this file -** contains implementations of functions -** __fpclassify(d,f), __isnormal(d,f), __isfinite(d,f), -** __isnan(d,f), and __signbit(d,f). This file targets -** PowerPC platforms. -** -** Written by: Robert A. Murley, Ali Sazegari -** -** Copyright: c 2001 by Apple Computer, Inc., all rights reserved -** -** Change History (most recent first): -** -** 07 Jul 01 ram First created from fpfloatfunc.c, fp.c, -** classify.c and sign.c in MathLib v3 Mac OS9. -** -***********************************************************************/ - -#include <features.h> -#include <sys/types.h> -#include <math.h> -#include "fp_private.h" - -#define SIGN_MASK 0x80000000 -#define NSIGN_MASK 0x7fffffff -#define FEXP_MASK 0x7f800000 -#define FFRAC_MASK 0x007fffff - -/*********************************************************************** - int __fpclassifyf(float x) returns the classification code of the - argument x, as defined in <fp.h>. - - Exceptions: INVALID signaled if x is a signaling NaN; in this case, - the FP_QNAN code is returned. - - Calls: none -***********************************************************************/ - -libm_hidden_proto(__fpclassifyf) -int __fpclassifyf ( float x ) -{ - unsigned int iexp; - - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - iexp = z.lval & FEXP_MASK; /* isolate float exponent */ - - if (iexp == FEXP_MASK) { /* NaN or INF case */ - if ((z.lval & 0x007fffff) == 0) - return FP_INFINITE; - return FP_NAN; - } - - if (iexp != 0) /* normal float */ - return FP_NORMAL; - - if (x == 0.0) - return FP_ZERO; /* zero */ - else - return FP_SUBNORMAL; /* must be subnormal */ -} -libm_hidden_def(__fpclassifyf) - - -/*********************************************************************** - Function __fpclassify, - Implementation of classify of a double number for the PowerPC. - - Exceptions: INVALID signaled if x is a signaling NaN; in this case, - the FP_QNAN code is returned. - - Calls: none -***********************************************************************/ - -libm_hidden_proto(__fpclassify) -int __fpclassify ( double arg ) -{ - register unsigned int exponent; - union - { - dHexParts hex; - double dbl; - } x; - - x.dbl = arg; - - exponent = x.hex.high & dExpMask; - if ( exponent == dExpMask ) - { - if ( ( ( x.hex.high & dHighMan ) | x.hex.low ) == 0 ) - return FP_INFINITE; - else - return FP_NAN; - } - else if ( exponent != 0) - return FP_NORMAL; - else { - if ( arg == 0.0 ) - return FP_ZERO; - else - return FP_SUBNORMAL; - } -} -libm_hidden_def(__fpclassify) - - -/*********************************************************************** - int __isnormalf(float x) returns nonzero if and only if x is a - normalized float number and zero otherwise. - - Exceptions: INVALID is raised if x is a signaling NaN; in this case, - zero is returned. - - Calls: none -***********************************************************************/ - -int __isnormalf ( float x ); -int __isnormalf ( float x ) -{ - unsigned int iexp; - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - iexp = z.lval & FEXP_MASK; /* isolate float exponent */ - return ((iexp != FEXP_MASK) && (iexp != 0)); -} - - -int __isnormal ( double x ); -int __isnormal ( double x ) -{ - return ( __fpclassify ( x ) == FP_NORMAL ); -} - - -/*********************************************************************** - int __isfinitef(float x) returns nonzero if and only if x is a - finite (normal, subnormal, or zero) float number and zero otherwise. - - Exceptions: INVALID is raised if x is a signaling NaN; in this case, - zero is returned. - - Calls: none -***********************************************************************/ - -int __finitef ( float x ) -{ - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - return ((z.lval & FEXP_MASK) != FEXP_MASK); -} -strong_alias(__finitef,finitef) - -#if 0 /* use __finite in s_finite.c */ -int __finite ( double x ) -{ - return ( __fpclassify ( x ) >= FP_ZERO ); -} -strong_alias(__finite,finite) -#endif - - -/*********************************************************************** - int __signbitf(float x) returns nonzero if and only if the sign - bit of x is set and zero otherwise. - - Exceptions: INVALID is raised if x is a signaling NaN. - - Calls: none -***********************************************************************/ - -libm_hidden_proto(__signbitf) -int __signbitf ( float x ) -{ - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - return ((z.lval & SIGN_MASK) != 0); -} -libm_hidden_def(__signbitf) - - -/*********************************************************************** - Function sign of a double. - Implementation of sign bit for the PowerPC. - - Calls: none -***********************************************************************/ - -libm_hidden_proto(__signbit) -int __signbit ( double arg ) -{ - union - { - dHexParts hex; - double dbl; - } x; - int sign; - - x.dbl = arg; - sign = ( ( x.hex.high & dSgnMask ) == dSgnMask ) ? 1 : 0; - return sign; -} -libm_hidden_def(__signbit) - - -/*********************************************************************** -* int __isinff(float x) returns -1 if value represents negative -* infinity, 1 if value represents positive infinity, -* and 0 otherwise. -* -* Calls: __signbit -* +***********************************************************************/ -int __isinff ( float x ) -{ - int class = __fpclassifyf(x); - if ( class == FP_INFINITE ) { - return ( (__signbitf(x)) ? -1 : 1); - } - return 0; -} -strong_alias(__isinff,isinff) - -int __isinf ( double x ) -{ - int class = __fpclassify(x); - if ( class == FP_INFINITE ) { - return ( (__signbit(x)) ? -1 : 1); - } - return 0; -} -strong_alias(__isinf,isinf) - -#if 0 -int __isinfl ( long double x ) -{ - int class = __fpclassify(x); - if ( class == FP_INFINITE ) { - return ( (__signbit(x)) ? -1 : 1); - } - return 0; -} -strong_alias(__isinfl,isinfl) -#endif - -/*********************************************************************** - int __isnanf(float x) returns nonzero if and only if x is a - NaN and zero otherwise. - - Exceptions: INVALID is raised if x is a signaling NaN; in this case, - nonzero is returned. - - Calls: none -***********************************************************************/ - -int __isnanf ( float x ) -{ - union { - u_int32_t lval; - float fval; - } z; - - z.fval = x; - return (((z.lval&FEXP_MASK) == FEXP_MASK) && ((z.lval&FFRAC_MASK) != 0)); -} -strong_alias(__isnanf,isnanf) - -libm_hidden_proto(__isnan) -int __isnan ( double x ) -{ - int class = __fpclassify(x); - return ( class == FP_NAN ); -} -libm_hidden_def(__isnan) -strong_alias(__isnan,isnan) - -#if 0 -int __isnanl ( long double x ) -{ - int class = __fpclassify(x); - return ( class == FP_NAN ); -} -strong_alias(__isnanl,isnanl) -#endif - diff --git a/libm/powerpc/classic/s_ceil.c b/libm/powerpc/classic/s_ceil.c deleted file mode 100644 index ee4ceb5fc..000000000 --- a/libm/powerpc/classic/s_ceil.c +++ /dev/null @@ -1,113 +0,0 @@ -/******************************************************************************* -* * -* File ceilfloor.c, * -* Function ceil(x) and floor(x), * -* Implementation of ceil and floor for the PowerPC. * -* * -* Copyright © 1991 Apple Computer, Inc. All rights reserved. * -* * -* Written by Ali Sazegari, started on November 1991, * -* * -* based on math.h, library code for Macintoshes with a 68881/68882 * -* by Jim Thomas. * -* * -* W A R N I N G: This routine expects a 64 bit double model. * -* * -* December 03 1992: first rs6000 port. * -* July 14 1993: comment changes and addition of #pragma fenv_access. * -* May 06 1997: port of the ibm/taligent ceil and floor routines. * -* April 11 2001: first port to os x using gcc. * -* June 13 2001: replaced __setflm with in-line assembly * -* * -*******************************************************************************/ - -#include <math.h> -#include <endian.h> - -static const double twoTo52 = 4503599627370496.0; -static const unsigned long signMask = 0x80000000ul; - -typedef union - { - struct { -#if (__BYTE_ORDER == __BIG_ENDIAN) - unsigned long int hi; - unsigned long int lo; -#else - unsigned long int lo; - unsigned long int hi; -#endif - } words; - double dbl; - } DblInHex; - -/******************************************************************************* -* Functions needed for the computation. * -*******************************************************************************/ - -/******************************************************************************* -* Ceil(x) returns the smallest integer not less than x. * -*******************************************************************************/ - -libm_hidden_proto(ceil) -double ceil ( double x ) - { - DblInHex xInHex,OldEnvironment; - register double y; - register unsigned long int xhi; - register int target; - - xInHex.dbl = x; - xhi = xInHex.words.hi & 0x7fffffffUL; // xhi is the high half of |x| - target = ( xInHex.words.hi < signMask ); - - if ( xhi < 0x43300000ul ) -/******************************************************************************* -* Is |x| < 2.0^52? * -*******************************************************************************/ - { - if ( xhi < 0x3ff00000ul ) -/******************************************************************************* -* Is |x| < 1.0? * -*******************************************************************************/ - { - if ( ( xhi | xInHex.words.lo ) == 0ul ) // zero x is exact case - return ( x ); - else - { // inexact case - __asm__ ("mffs %0" : "=f" (OldEnvironment.dbl)); - OldEnvironment.words.lo |= 0x02000000ul; - __asm__ ("mtfsf 255,%0" : /*NULLOUT*/ : /*IN*/ "f" ( OldEnvironment.dbl )); - if ( target ) - return ( 1.0 ); - else - return ( -0.0 ); - } - } -/******************************************************************************* -* Is 1.0 < |x| < 2.0^52? * -*******************************************************************************/ - if ( target ) - { - y = ( x + twoTo52 ) - twoTo52; // round at binary pt. - if ( y < x ) - return ( y + 1.0 ); - else - return ( y ); - } - - else - { - y = ( x - twoTo52 ) + twoTo52; // round at binary pt. - if ( y < x ) - return ( y + 1.0 ); - else - return ( y ); - } - } -/******************************************************************************* -* |x| >= 2.0^52 or x is a NaN. * -*******************************************************************************/ - return ( x ); - } -libm_hidden_def(ceil) diff --git a/libm/powerpc/classic/s_copysign.c b/libm/powerpc/classic/s_copysign.c deleted file mode 100644 index c6f1307a3..000000000 --- a/libm/powerpc/classic/s_copysign.c +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************* -* * -* File sign.c, * -* Functions copysign and __signbitd. * -* For PowerPC based machines. * -* * -* Copyright © 1991, 2001 Apple Computer, Inc. All rights reserved. * -* * -* Written by Ali Sazegari, started on June 1991. * -* * -* August 26 1991: no CFront Version 1.1d17 warnings. * -* September 06 1991: passes the test suite with invalid raised on * -* signaling nans. sane rom code behaves the same. * -* September 24 1992: took the Ò#include support.hÓ out. * -* Dcember 02 1992: PowerPC port. * -* July 20 1994: __fabs added * -* July 21 1994: deleted unnecessary functions: neg, COPYSIGNnew, * -* and SIGNNUMnew. * -* April 11 2001: first port to os x using gcc. * -* removed fabs and deffered to gcc for direct * -* instruction generation. * -* * -*******************************************************************************/ - -#include <math.h> -#include "../../fp_private.h" - -/******************************************************************************* -* * -* Function copysign. * -* Implementation of copysign for the PowerPC. * -* * -******************************************************************************** -* Note: The order of the operands in this function is reversed from that * -* suggested in the IEEE standard 754. * -*******************************************************************************/ - -libm_hidden_proto(copysign) -double copysign ( double arg2, double arg1 ) - { - union - { - dHexParts hex; - double dbl; - } x, y; - -/******************************************************************************* -* No need to flush NaNs out. * -*******************************************************************************/ - - x.dbl = arg1; - y.dbl = arg2; - - y.hex.high = y.hex.high & 0x7FFFFFFF; - y.hex.high = ( y.hex.high | ( x.hex.high & dSgnMask ) ); - - return y.dbl; - } -libm_hidden_def(copysign) diff --git a/libm/powerpc/classic/s_floor.c b/libm/powerpc/classic/s_floor.c deleted file mode 100644 index 2cd720eff..000000000 --- a/libm/powerpc/classic/s_floor.c +++ /dev/null @@ -1,113 +0,0 @@ -/******************************************************************************* -* * -* File ceilfloor.c, * -* Function ceil(x) and floor(x), * -* Implementation of ceil and floor for the PowerPC. * -* * -* Copyright © 1991 Apple Computer, Inc. All rights reserved. * -* * -* Written by Ali Sazegari, started on November 1991, * -* * -* based on math.h, library code for Macintoshes with a 68881/68882 * -* by Jim Thomas. * -* * -* W A R N I N G: This routine expects a 64 bit double model. * -* * -* December 03 1992: first rs6000 port. * -* July 14 1993: comment changes and addition of #pragma fenv_access. * -* May 06 1997: port of the ibm/taligent ceil and floor routines. * -* April 11 2001: first port to os x using gcc. * -* June 13 2001: replaced __setflm with in-line assembly * -* * -*******************************************************************************/ - -#include <math.h> -#include <endian.h> - -static const double twoTo52 = 4503599627370496.0; -static const unsigned long signMask = 0x80000000ul; - -typedef union - { - struct { -#if (__BYTE_ORDER == __BIG_ENDIAN) - unsigned long int hi; - unsigned long int lo; -#else - unsigned long int lo; - unsigned long int hi; -#endif - } words; - double dbl; - } DblInHex; - -/******************************************************************************* -* Functions needed for the computation. * -*******************************************************************************/ - -/******************************************************************************* -* Floor(x) returns the largest integer not greater than x. * -*******************************************************************************/ - -libm_hidden_proto(floor) -double floor ( double x ) - { - DblInHex xInHex,OldEnvironment; - register double y; - register unsigned long int xhi; - register long int target; - - xInHex.dbl = x; - xhi = xInHex.words.hi & 0x7fffffffUL; // xhi is the high half of |x| - target = ( xInHex.words.hi < signMask ); - - if ( xhi < 0x43300000ul ) -/******************************************************************************* -* Is |x| < 2.0^52? * -*******************************************************************************/ - { - if ( xhi < 0x3ff00000ul ) -/******************************************************************************* -* Is |x| < 1.0? * -*******************************************************************************/ - { - if ( ( xhi | xInHex.words.lo ) == 0ul ) // zero x is exact case - return ( x ); - else - { // inexact case - __asm__ ("mffs %0" : "=f" (OldEnvironment.dbl)); - OldEnvironment.words.lo |= 0x02000000ul; - __asm__ ("mtfsf 255,%0" : /*NULLOUT*/ : /*IN*/ "f" ( OldEnvironment.dbl )); - if ( target ) - return ( 0.0 ); - else - return ( -1.0 ); - } - } -/******************************************************************************* -* Is 1.0 < |x| < 2.0^52? * -*******************************************************************************/ - if ( target ) - { - y = ( x + twoTo52 ) - twoTo52; // round at binary pt. - if ( y > x ) - return ( y - 1.0 ); - else - return ( y ); - } - - else - { - y = ( x - twoTo52 ) + twoTo52; // round at binary pt. - if ( y > x ) - return ( y - 1.0 ); - else - return ( y ); - } - } -/******************************************************************************* -* |x| >= 2.0^52 or x is a NaN. * -*******************************************************************************/ - return ( x ); - } -libm_hidden_def(floor) diff --git a/libm/powerpc/classic/s_frexp.c b/libm/powerpc/classic/s_frexp.c deleted file mode 100644 index 001aaf708..000000000 --- a/libm/powerpc/classic/s_frexp.c +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* -* * -* File frexpldexp.c, * -* Functions frexp(x) and ldexp(x), * -* Implementation of frexp and ldexp functions for the PowerPC. * -* * -* Copyright © 1991 Apple Computer, Inc. All rights reserved. * -* * -* Written by Ali Sazegari, started on January 1991, * -* * -* W A R N I N G: This routine expects a 64 bit double model. * -* * -* December03 1992: first rs6000 implementation. * -* October 05 1993: added special cases for NaN and ° in frexp. * -* May 27 1997: improved the performance of frexp by eliminating the * -* switch statement. * -* June 13 2001: (ram) rewrote frexp to eliminate calls to scalb and * -* logb. * -* * -*******************************************************************************/ - -#include <limits.h> -#include <math.h> -#include <endian.h> - -static const double two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ - -typedef union - { - struct { -#if (__BYTE_ORDER == __BIG_ENDIAN) - unsigned long int hi; - unsigned long int lo; -#else - unsigned long int lo; - unsigned long int hi; -#endif - } words; - double dbl; - } DblInHex; - -libm_hidden_proto(frexp) -double frexp ( double value, int *eptr ) - { - DblInHex argument; - unsigned long int valueHead; - - argument.dbl = value; - valueHead = argument.words.hi & 0x7fffffffUL; // valueHead <- |x| - - *eptr = 0; - if ( valueHead >= 0x7ff00000 || ( valueHead | argument.words.lo ) == 0 ) - return value; // 0, inf, or NaN - - if ( valueHead < 0x00100000 ) - { // denorm - argument.dbl = two54 * value; - valueHead = argument.words.hi &0x7fffffff; - *eptr = -54; - } - *eptr += ( valueHead >> 20 ) - 1022; - argument.words.hi = ( argument.words.hi & 0x800fffff ) | 0x3fe00000; - return argument.dbl; - } -libm_hidden_def(frexp) diff --git a/libm/powerpc/classic/s_ldexp.c b/libm/powerpc/classic/s_ldexp.c deleted file mode 100644 index 10100d7c2..000000000 --- a/libm/powerpc/classic/s_ldexp.c +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* -* * -* File frexpldexp.c, * -* Functions frexp(x) and ldexp(x), * -* Implementation of frexp |