diff options
Diffstat (limited to 'sysdeps')
79 files changed, 1487 insertions, 513 deletions
diff --git a/sysdeps/alpha/Makefile b/sysdeps/alpha/Makefile index 1e74d82f58..725ae43584 100644 --- a/sysdeps/alpha/Makefile +++ b/sysdeps/alpha/Makefile @@ -38,9 +38,10 @@ ifeq ($(subdir),elf) CFLAGS-rtld.c = -mbuild-constants endif -# For now, build everything with full IEEE math support. -# TODO: build separate libm and libm-ieee. -sysdep-CFLAGS += -mieee +# Build everything with full IEEE math support, and with dynamic rounding; +# there are a number of math routines that are defined to work with the +# "current" rounding mode, and it's easiest to set this with all of them. +sysdep-CFLAGS += -mieee -mfp-rounding-mode=d # libc.so requires about 16k for the small data area, which is well # below the 64k maximum. diff --git a/sysdeps/alpha/fpu/bits/mathinline.h b/sysdeps/alpha/fpu/bits/mathinline.h index 87d40058c3..a126dcf056 100644 --- a/sysdeps/alpha/fpu/bits/mathinline.h +++ b/sysdeps/alpha/fpu/bits/mathinline.h @@ -1,5 +1,6 @@ /* Inline math functions for Alpha. - Copyright (C) 1996, 1997, 1999-2001, 2004 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1999-2001, 2004, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by David Mosberger-Tang. @@ -25,7 +26,7 @@ #ifdef __cplusplus # define __MATH_INLINE __inline #else -# define __MATH_INLINE extern __inline +# define __MATH_INLINE __extern_inline #endif #if defined __USE_ISOC99 && defined __GNUC__ && !__GNUC_PREREQ(3,0) @@ -83,101 +84,64 @@ __inline_fabs (fabs, double) # undef __inline_fabs #endif +#ifdef __USE_ISOC99 -/* Use the -inf rounding mode conversion instructions to implement - floor. We note when the exponent is large enough that the value - must be integral, as this avoids unpleasant integer overflows. */ - -__MATH_INLINE float -__NTH (__floorf (float __x)) +/* Test for negative number. Used in the signbit() macro. */ +__MATH_INLINE int +__NTH (__signbitf (float __x)) { - /* Check not zero since floor(-0) == -0. */ - if (__x != 0 && fabsf (__x) < 16777216.0f) /* 1 << FLT_MANT_DIG */ - { - /* Note that Alpha S_Floating is stored in registers in a - restricted T_Floating format, so we don't even need to - convert back to S_Floating in the end. The initial - conversion to T_Floating is needed to handle denormals. */ - - float __tmp1, __tmp2; - - __asm ("cvtst/s %3,%2\n\t" -#ifdef _IEEE_FP_INEXACT - "cvttq/svim %2,%1\n\t" +#if !__GNUC_PREREQ (4, 0) + __extension__ union { float __f; int __i; } __u = { __f: __x }; + return __u.__i < 0; #else - "cvttq/svm %2,%1\n\t" + return __builtin_signbitf (__x); #endif - "cvtqt/m %1,%0\n\t" - : "=f"(__x), "=&f"(__tmp1), "=&f"(__tmp2) - : "f"(__x)); - } - return __x; } -__MATH_INLINE double -__NTH (__floor (double __x)) +__MATH_INLINE int +__NTH (__signbit (double __x)) { - if (__x != 0 && fabs (__x) < 9007199254740992.0) /* 1 << DBL_MANT_DIG */ - { - double __tmp1; - __asm ( -#ifdef _IEEE_FP_INEXACT - "cvttq/svim %2,%1\n\t" +#if !__GNUC_PREREQ (4, 0) + __extension__ union { double __d; long __i; } __u = { __d: __x }; + return __u.__i < 0; #else - "cvttq/svm %2,%1\n\t" + return __builtin_signbit (__x); #endif - "cvtqt/m %1,%0\n\t" - : "=f"(__x), "=&f"(__tmp1) - : "f"(__x)); - } - return __x; } -__MATH_INLINE float __NTH (floorf (float __x)) { return __floorf(__x); } -__MATH_INLINE double __NTH (floor (double __x)) { return __floor(__x); } - - -#ifdef __USE_ISOC99 - -__MATH_INLINE float -__NTH (__fdimf (float __x, float __y)) -{ - return __x <= __y ? 0.0f : __x - __y; -} - -__MATH_INLINE float -__NTH (fdimf (float __x, float __y)) +__MATH_INLINE int +__NTH (__signbitl (long double __x)) { - return __x <= __y ? 0.0f : __x - __y; +#if !__GNUC_PREREQ (4, 0) + __extension__ union { + long double __d; + long __i[sizeof(long double)/sizeof(long)]; + } __u = { __d: __x }; + return __u.__i[sizeof(long double)/sizeof(long) - 1] < 0; +#else + return __builtin_signbitl (__x); +#endif } -__MATH_INLINE double -__NTH (__fdim (double __x, double __y)) -{ - return __x <= __y ? 0.0 : __x - __y; -} +/* Test for NaN. Used in the isnan() macro. */ -__MATH_INLINE double -__NTH (fdim (double __x, double __y)) +__MATH_INLINE int +__NTH (__isnanf (float __x)) { - return __x <= __y ? 0.0 : __x - __y; + return isunordered (__x, __x); } -/* Test for negative number. Used in the signbit() macro. */ __MATH_INLINE int -__NTH (__signbitf (float __x)) +__NTH (__isnan (double __x)) { - __extension__ union { float __f; int __i; } __u = { __f: __x }; - return __u.__i < 0; + return isunordered (__x, __x); } __MATH_INLINE int -__NTH (__signbit (double __x)) +__NTH (__isnanl (long double __x)) { - __extension__ union { double __d; long __i; } __u = { __d: __x }; - return __u.__i < 0; + return isunordered (__x, __x); } - #endif /* C99 */ #endif /* __NO_MATH_INLINES */ diff --git a/sysdeps/alpha/fpu/libm-test-ulps b/sysdeps/alpha/fpu/libm-test-ulps index 6b882e388a..d9df631d7c 100644 --- a/sysdeps/alpha/fpu/libm-test-ulps +++ b/sysdeps/alpha/fpu/libm-test-ulps @@ -2,34 +2,40 @@ # atan2 Test "atan2 (-0.00756827042671106339, -.001792735857538728036) == -1.80338464113663849327153994379639112": -float: 6 -ifloat: 6 +ildouble: 1 +ldouble: 1 Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025": -float: 3 -ifloat: 3 +float: 1 +ifloat: 1 +ildouble: 1 +ldouble: 1 Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025": -float: 3 -ifloat: 3 +float: 1 +ifloat: 1 +ildouble: 1 +ldouble: 1 Test "atan2 (1.390625, 0.9296875) == 0.981498387184244311516296577615519772": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 # atanh Test "atanh (0.75) == 0.972955074527656652552676371721589865": float: 1 ifloat: 1 +# cacos +Test "Imaginary part of: cacos (0.75 + 1.25 i) == 1.11752014915610270578240049553777969 - 1.13239363160530819522266333696834467 i": +ildouble: 1 +ldouble: 1 + # cacosh -Test "Real part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i": -double: 1 -float: 7 -idouble: 1 -ifloat: 7 Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i": -double: 1 -float: 3 -idouble: 1 -ifloat: 3 +float: 1 +ifloat: 1 +ildouble: 1 +ldouble: 1 # casin Test "Real part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i": @@ -37,6 +43,9 @@ double: 1 float: 1 idouble: 1 ifloat: 1 +Test "Imaginary part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i": +ildouble: 1 +ldouble: 1 # casinh Test "Real part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i": @@ -44,48 +53,55 @@ double: 5 float: 1 idouble: 5 ifloat: 1 +ildouble: 4 +ldouble: 4 Test "Imaginary part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i": double: 3 float: 6 idouble: 3 ifloat: 6 +ildouble: 2 +ldouble: 2 Test "Real part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "Imaginary part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 # catan -Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i": -float: 3 -ifloat: 3 Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i": double: 1 float: 1 idouble: 1 ifloat: 1 -Test "Real part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i": -float: 4 -ifloat: 4 +Test "Imaginary part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i": +ildouble: 1 +ldouble: 1 # catanh Test "Real part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i": double: 4 idouble: 4 -Test "Imaginary part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i": -float: 4 -ifloat: 4 Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": double: 1 idouble: 1 +ildouble: 1 +ldouble: 1 Test "Imaginary part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": -float: 6 -ifloat: 6 +ildouble: 1 +ldouble: 1 # cbrt +Test "cbrt (-0.001) == -0.1": +ildouble: 1 +ldouble: 1 Test "cbrt (-27.0) == -3.0": double: 1 idouble: 1 @@ -97,9 +113,14 @@ double: 1 idouble: 1 # ccos +Test "Real part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": +ildouble: 1 +ldouble: 1 Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": double: 1 float: 1 @@ -113,9 +134,13 @@ ifloat: 1 Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": double: 1 float: 1 @@ -126,89 +151,130 @@ float: 1 ifloat: 1 # cexp +Test "Real part of: cexp (-2.0 - 3.0 i) == -0.13398091492954261346140525546115575 - 0.019098516261135196432576240858800925 i": +ildouble: 1 +ldouble: 1 Test "Imaginary part of: cexp (-2.0 - 3.0 i) == -0.13398091492954261346140525546115575 - 0.019098516261135196432576240858800925 i": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "Real part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": float: 1 ifloat: 1 +Test "Imaginary part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": +ildouble: 1 +ldouble: 1 # clog -Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680267437207826593 - 2.1587989303424641704769327722648368 i": -float: 3 -ifloat: 3 Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 # clog10 Test "Imaginary part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 +Test "Real part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": +ildouble: 1 +ldouble: 1 Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": double: 1 -float: 5 idouble: 1 -ifloat: 5 +ildouble: 1 +ldouble: 1 Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-3 - inf i) == inf - pi/2*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-inf + 0 i) == inf + pi*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-inf + 1 i) == inf + pi*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 +Test "Imaginary part of: clog10 (-inf + inf i) == inf + 3/4 pi*log10(e) i": +double: 1 +idouble: 1 Test "Imaginary part of: clog10 (-inf - 0 i) == inf - pi*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-inf - 1 i) == inf - pi*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (0 + inf i) == inf + pi/2*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (0 - inf i) == inf - pi/2*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Real part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i": float: 1 ifloat: 1 +Test "Imaginary part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i": +ildouble: 1 +ldouble: 1 Test "Imaginary part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (3 - inf i) == inf - pi/2*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (inf + inf i) == inf + pi/4*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (inf - inf i) == inf - pi/4*log10(e) i": +double: 1 float: 1 +idouble: 1 ifloat: 1 # cos Test "cos (M_PI_6l * 2.0) == 0.5": double: 1 -float: 1 idouble: 1 -ifloat: 1 +ildouble: 1 +ldouble: 1 Test "cos (M_PI_6l * 4.0) == -0.5": double: 2 float: 1 idouble: 2 ifloat: 1 -Test "cos (pi/2) == 0": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 +ildouble: 1 +ldouble: 1 # cpow Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i": @@ -222,16 +288,31 @@ double: 1 float: 4 idouble: 1 ifloat: 4 +ildouble: 4 +ldouble: 4 +Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 0.0 i) == 0.75 + 1.25 i": +ildouble: 2 +ldouble: 2 +Test "Imaginary part of: cpow (0.75 + 1.25 i, 1.0 + 0.0 i) == 0.75 + 1.25 i": +ildouble: 1 +ldouble: 1 Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 1.0 i) == 0.0846958290317209430433805274189191353 + 0.513285749182902449043287190519090481 i": double: 2 float: 3 idouble: 2 ifloat: 3 +ildouble: 10 +ldouble: 10 +Test "Real part of: cpow (2 + 0 i, 10 + 0 i) == 1024.0 + 0.0 i": +ildouble: 2 +ldouble: 2 Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": double: 1 float: 4 idouble: 1 ifloat: 4 +ildouble: 3 +ldouble: 3 Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": float: 2 ifloat: 2 @@ -240,8 +321,21 @@ double: 2 float: 2 idouble: 2 ifloat: 2 +ildouble: 1 +ldouble: 1 + +# csin +Test "Imaginary part of: csin (-2 - 3 i) == -9.15449914691142957346729954460983256 + 4.16890695996656435075481305885375484 i": +ildouble: 1 +ldouble: 1 +Test "Real part of: csin (0.75 + 1.25 i) == 1.28722291002649188575873510790565441 + 1.17210635989270256101081285116138863 i": +ildouble: 1 +ldouble: 1 # csinh +Test "Real part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": +ildouble: 1 +ldouble: 1 Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": double: 1 idouble: 1 @@ -256,14 +350,29 @@ ifloat: 1 Test "Real part of: csqrt (-2 + 3 i) == 0.89597747612983812471573375529004348 + 1.6741492280355400404480393008490519 i": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "Real part of: csqrt (-2 - 3 i) == 0.89597747612983812471573375529004348 - 1.6741492280355400404480393008490519 i": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 +Test "Imaginary part of: csqrt (0.75 + 1.25 i) == 1.05065169626078392338656675760808326 + 0.594868882070379067881984030639932657 i": +ildouble: 1 +ldouble: 1 # ctan +Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": +ildouble: 1 +ldouble: 1 +Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": +ildouble: 1 +ldouble: 1 Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": double: 1 idouble: 1 +ildouble: 2 +ldouble: 2 # ctanh Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": @@ -271,6 +380,11 @@ double: 1 float: 2 idouble: 1 ifloat: 2 +ildouble: 1 +ldouble: 1 +Test "Imaginary part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": +ildouble: 1 +ldouble: 1 Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i": float: 1 ifloat: 1 @@ -287,6 +401,9 @@ idouble: 1 Test "erfc (2.0) == 0.00467773498104726583793074363274707139": double: 1 idouble: 1 +Test "erfc (27.0) == 0.523704892378925568501606768284954709e-318": +ildouble: 1 +ldouble: 1 Test "erfc (4.125) == 0.542340079956506600531223408575531062e-8": double: 1 idouble: 1 @@ -307,14 +424,30 @@ double: 6 float: 2 idouble: 6 ifloat: 2 +ildouble: 1 +ldouble: 1 + +# exp2 +Test "exp2 (10) == 1024": +ildouble: 2 +ldouble: 2 # expm1 Test "expm1 (0.75) == 1.11700001661267466854536981983709561": double: 1 idouble: 1 Test "expm1 (1) == M_El - 1.0": +double: 1 float: 1 +idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 + +# gamma +Test "gamma (-0.5) == log(2*sqrt(pi))": +ildouble: 1 +ldouble: 1 # hypot Test "hypot (-0.7, -12.4) == 12.419742348374220601176836866763271": @@ -356,9 +489,13 @@ double: 2 float: 1 idouble: 2 ifloat: 1 +ildouble: 2 +ldouble: 2 Test "j0 (2.0) == 0.223890779141235668051827454649948626": float: 2 ifloat: 2 +ildouble: 2 +ldouble: 2 Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 float: 1 @@ -367,17 +504,32 @@ ifloat: 1 Test "j0 (8.0) == 0.171650807137553906090869407851972001": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 # j1 +Test "j1 (-1.0) == -0.440050585744933515959682203718914913": +ildouble: 1 +ldouble: 1 +Test "j1 (0.75) == 0.349243602174862192523281016426251335": +ildouble: 1 +ldouble: 1 +Test "j1 (1.0) == 0.440050585744933515959682203718914913": +ildouble: 1 +ldouble: 1 Test "j1 (10.0) == 0.0434727461688614366697487680258592883": float: 2 ifloat: 2 +ildouble: 2 +ldouble: 2 Test "j1 (2.0) == 0.576724807756873387202448242269137087": double: 1 idouble: 1 Test "j1 (8.0) == 0.234636346853914624381276651590454612": double: 1 idouble: 1 +ildouble: 4 +ldouble: 4 # jn Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1": @@ -393,9 +545,13 @@ double: 2 float: 1 idouble: 2 ifloat: 1 +ildouble: 2 +ldouble: 2 Test "jn (0, 2.0) == 0.223890779141235668051827454649948626": float: 2 ifloat: 2 +ildouble: 2 +ldouble: 2 Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 float: 1 @@ -404,30 +560,57 @@ ifloat: 1 Test "jn (0, 8.0) == 0.171650807137553906090869407851972001": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 +Test "jn (1, -1.0) == -0.440050585744933515959682203718914913": +ildouble: 1 +ldouble: 1 +Test "jn (1, 0.75) == 0.349243602174862192523281016426251335": +ildouble: 1 +ldouble: 1 +Test "jn (1, 1.0) == 0.440050585744933515959682203718914913": +ildouble: 1 +ldouble: 1 Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883": float: 2 ifloat: 2 +ildouble: 2 +ldouble: 2 Test "jn (1, 2.0) == 0.576724807756873387202448242269137087": double: 1 idouble: 1 Test "jn (1, 8.0) == 0.234636346853914624381276651590454612": double: 1 idouble: 1 +ildouble: 4 +ldouble: 4 +Test "jn (10, -1.0) == 0.263061512368745320699785368779050294e-9": +ildouble: 1 +ldouble: 1 Test "jn (10, 0.125) == 0.250543369809369890173993791865771547e-18": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "jn (10, 0.75) == 0.149621713117596814698712483621682835e-10": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 +Test "jn (10, 1.0) == 0.263061512368745320699785368779050294e-9": +ildouble: 1 +ldouble: 1 Test "jn (10, 10.0) == 0.207486106633358857697278723518753428": double: 4 float: 3 idouble: 4 ifloat: 3 +ildouble: 2 +ldouble: 2 Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6": float: 4 ifloat: 4 @@ -446,6 +629,8 @@ double: 3 float: 1 idouble: 3 ifloat: 1 +ildouble: 2 +ldouble: 2 Test "jn (3, 2.0) == 0.128943249474402051098793332969239835": double: 1 float: 2 @@ -453,16 +638,23 @@ idouble: 1 ifloat: 2 # lgamma +Test "lgamma (-0.5) == log(2*sqrt(pi))": +ildouble: 1 +ldouble: 1 Test "lgamma (0.7) == 0.260867246531666514385732417016759578": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": double: 1 float: 2 idouble: 1 ifloat: 2 +ildouble: 1 +ldouble: 1 # log10 Test "log10 (0.75) == -0.124938736608299953132449886193870744": @@ -473,36 +665,54 @@ ifloat: 2 Test "log10 (e) == log10(e)": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 # log1p Test "log1p (-0.25) == -0.287682072451780927439219005993827432": float: 1 ifloat: 1 +# log2 +Test "log2 (0.75) == -.415037499278843818546261056052183492": +ildouble: 1 +ldouble: 1 + # sincos Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res": double: 1 -float: 1 idouble: 1 -ifloat: 1 +ildouble: 1 +ldouble: 1 Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res": double: 1 float: 1 idouble: 1 ifloat: 1 -Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res": -double: 1 -float: 1 -idouble: 1 -ifloat: 1 +ildouble: 1 +ldouble: 1 Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res": float: 1 ifloat: 1 -# tan -Test "tan (pi/4) == 1": -double: 1 -idouble: 1 +# sqrt +Test "sqrt (2) == M_SQRT2l": +ildouble: 1 +ldouble: 1 + +# tanh +Test "tanh (-0.75) == -0.635148952387287319214434357312496495": +ildouble: 1 +ldouble: 1 +Test "tanh (-1.0) == -0.7615941559557648881194582826047935904": +ildouble: 1 +ldouble: 1 +Test "tanh (0.75) == 0.635148952387287319214434357312496495": +ildouble: 1 +ldouble: 1 +Test "tanh (1.0) == 0.7615941559557648881194582826047935904": +ildouble: 1 +ldouble: 1 # tgamma Test "tgamma (-0.5) == -2 sqrt (pi)": @@ -510,6 +720,8 @@ double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "tgamma (0.5) == sqrt (pi)": float: 1 ifloat: 1 @@ -518,6 +730,9 @@ double: 1 float: 1 idouble: 1 ifloat: 1 +Test "tgamma (4) == 6": +ildouble: 1 +ldouble: 1 # y0 Test "y0 (1.0) == 0.0882569642156769579829267660235151628": @@ -533,19 +748,28 @@ ifloat: 1 Test "y0 (10.0) == 0.0556711672835993914244598774101900481": float: 1 ifloat: 1 +ildouble: 3 +ldouble: 3 Test "y0 (8.0) == 0.223521489387566220527323400498620359": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 3 +ldouble: 3 # y1 Test "y1 (0.125) == -5.19993611253477499595928744876579921": double: 1 idouble: 1 +Test "y1 (0.75) == -1.03759455076928541973767132140642198": +ildouble: 1 +ldouble: 1 Test "y1 (1.5) == -0.412308626973911295952829820633445323": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "y1 (10.0) == 0.249015424206953883923283474663222803": double: 3 float: 1 @@ -556,11 +780,15 @@ double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "y1 (8.0) == -0.158060461731247494255555266187483550": double: 1 float: 2 idouble: 1 ifloat: 2 +ildouble: 1 +ldouble: 1 # yn Test "yn (0, 1.0) == 0.0882569642156769579829267660235151628": @@ -576,17 +804,26 @@ ifloat: 1 Test "yn (0, 10.0) == 0.0556711672835993914244598774101900481": float: 1 ifloat: 1 +ildouble: 3 +ldouble: 3 Test "yn (0, 8.0) == 0.223521489387566220527323400498620359": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 3 +ldouble: 3 Test "yn (1, 0.125) == -5.19993611253477499595928744876579921": double: 1 idouble: 1 +Test "yn (1, 0.75) == -1.03759455076928541973767132140642198": +ildouble: 1 +ldouble: 1 Test "yn (1, 1.5) == -0.412308626973911295952829820633445323": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "yn (1, 10.0) == 0.249015424206953883923283474663222803": double: 3 float: 1 @@ -597,30 +834,44 @@ double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "yn (1, 8.0) == -0.158060461731247494255555266187483550": double: 1 float: 2 idouble: 1 ifloat: 2 +ildouble: 1 +ldouble: 1 Test "yn (10, 0.125) == -127057845771019398.252538486899753195": double: 1 idouble: 1 +ildouble: 2 +ldouble: 2 Test "yn (10, 0.75) == -2133501638.90573424452445412893839236": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 5 +ldouble: 5 Test "yn (10, 1.0) == -121618014.278689189288130426667971145": double: 1 idouble: 1 +ildouble: 1 +ldouble: 1 Test "yn (10, 10.0) == -0.359814152183402722051986577343560609": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 2 +ldouble: 2 Test "yn (10, 2.0) == -129184.542208039282635913145923304214": double: 2 idouble: 2 +ildouble: 2 +ldouble: 2 Test "yn (3, 0.125) == -2612.69757350066712600220955744091741": double: 1 idouble: 1 @@ -629,35 +880,39 @@ double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 2 +ldouble: 2 Test "yn (3, 10.0) == -0.251362657183837329779204747654240998": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Test "yn (3, 2.0) == -1.12778377684042778608158395773179238": double: 1 idouble: 1 # Maximal error of functions: Function: "atan2": -float: 6 -ifloat: 6 +float: 1 +ifloat: 1 +ildouble: 1 +ldouble: 1 Function: "atanh": float: 1 ifloat: 1 -Function: Real part of "cacosh": -double: 1 -float: 7 -idouble: 1 -ifloat: 7 +Function: Imaginary part of "cacos": +ildouble: 1 +ldouble: 1 Function: Imaginary part of "cacosh": -double: 1 -float: 3 -idouble: 1 -ifloat: 3 +float: 1 +ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Real part of "casin": double: 1 @@ -665,107 +920,147 @@ float: 1 idouble: 1 ifloat: 1 +Function: Imaginary part of "casin": +ildouble: 1 +ldouble: 1 + Function: Real part of "casinh": double: 5 float: 1 idouble: 5 ifloat: 1 +ildouble: 4 +ldouble: 4 Function: Imaginary part of "casinh": double: 3 float: 6 idouble: 3 ifloat: 6 - -Function: Real part of "catan": -float: 4 -ifloat: 4 +ildouble: 2 +ldouble: 2 Function: Imaginary part of "catan": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Real part of "catanh": double: 4 idouble: 4 +ildouble: 1 +ldouble: 1 Function: Imaginary part of "catanh": -float: 6 -ifloat: 6 +ildouble: 1 +ldouble: 1 Function: "cbrt": double: 1 idouble: 1 +ildouble: 1 +ldouble: 1 Function: Real part of "ccos": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Imaginary part of "ccos": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Real part of "ccosh": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Imaginary part of "ccosh": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Real part of "cexp": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Imaginary part of "cexp": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Real part of "clog": float: 1 ifloat: 1 - -Function: Imaginary part of "clog": -float: 3 -ifloat: 3 +ildouble: 1 +ldouble: 1 Function: Real part of "clog10": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Imaginary part of "clog10": double: 1 -float: 5 +float: 1 idouble: 1 -ifloat: 5 +ifloat: 1 +ildouble: 1 +ldouble: 1 Function: "cos": double: 2 float: 1 idouble: 2 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Real part of "cpow": double: 2 float: 4 idouble: 2 ifloat: 4 +ildouble: 10 +ldouble: 10 Function: Imaginary part of "cpow": double: 2 float: 2 idouble: 2 ifloat: 2 +ildouble: 1 +ldouble: 1 + +Function: Real part of "csin": +ildouble: 1 +ldouble: 1 + +Function: Imaginary part of "csin": +ildouble: 1 +ldouble: 1 Function: Real part of "csinh": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: Imaginary part of "csinh": double: 1 @@ -776,20 +1071,36 @@ ifloat: 1 Function: Real part of "csqrt": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 + +Function: Imaginary part of "csqrt": +ildouble: 1 +ldouble: 1 + +Function: Real part of "ctan": +ildouble: 1 +ldouble: 1 Function: Imaginary part of "ctan": double: 1 idouble: 1 +ildouble: 2 +ldouble: 2 Function: Real part of "ctanh": double: 1 float: 2 idouble: 1 ifloat: 2 +ildouble: 1 +ldouble: 1 Function: Imaginary part of "ctanh": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: "erf": double: 1 @@ -798,18 +1109,32 @@ idouble: 1 Function: "erfc": double: 1 idouble: 1 +ildouble: 1 +ldouble: 1 Function: "exp10": double: 6 float: 2 idouble: 6 ifloat: 2 +ildouble: 1 +ldouble: 1 + +Function: "exp2": +ildouble: 2 +ldouble: 2 Function: "expm1": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 + +Function: "gamma": +ildouble: 1 +ldouble: 1 Function: "hypot": float: 1 @@ -820,67 +1145,101 @@ double: 2 float: 2 idouble: 2 ifloat: 2 +ildouble: 2 +ldouble: 2 Function: "j1": double: 1 float: 2 idouble: 1 ifloat: 2 +ildouble: 4 +ldouble: 4 Function: "jn": double: 4 float: 4 idouble: 4 ifloat: 4 +ildouble: 4 +ldouble: 4 Function: "lgamma": double: 1 float: 2 idouble: 1 ifloat: 2 +ildouble: 1 +ldouble: 1 Function: "log10": double: 1 float: 2 idouble: 1 ifloat: 2 +ildouble: 1 +ldouble: 1 Function: "log1p": float: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 + +Function: "log2": +ildouble: 1 +ldouble: 1 Function: "sincos": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 + +Function: "sqrt": +ildouble: 1 +ldouble: 1 Function: "tan": double: 1 idouble: 1 +Function: "tanh": +ildouble: 1 +ldouble: 1 + Function: "tgamma": double: 1 float: 1 idouble: 1 ifloat: 1 +ildouble: 1 +ldouble: 1 Function: "y0": double: 2 float: 1 idouble: 2 ifloat: 1 +ildouble: 3 +ldouble: 3 Function: "y1": double: 3 float: 2 idouble: 3 ifloat: 2 +ildouble: 1 +ldouble: 1 Function: "yn": double: 3 float: 2 idouble: 3 ifloat: 2 +ildouble: 5 +ldouble: 5 # end of automatic generation diff --git a/sysdeps/alpha/fpu/s_ceil.c b/sysdeps/alpha/fpu/s_ceil.c index ec58fd9486..40c2379286 100644 --- a/sysdeps/alpha/fpu/s_ceil.c +++ b/sysdeps/alpha/fpu/s_ceil.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 2000, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson. @@ -27,25 +27,20 @@ double __ceil (double x) { - if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */ - { - double tmp1, new_x; - - new_x = -x; - __asm ( + double two52 = copysign (0x1.0p52, x); + double r, tmp; + + __asm ( #ifdef _IEEE_FP_INEXACT - "cvttq/svim %2,%1\n\t" + "addt/suim %2, %3, %1\n\tsubt/suim %1, %3, %0" #else - "cvttq/svm %2,%1\n\t" + "addt/sum %2, %3, %1\n\tsubt/sum %1, %3, %0" #endif - "cvtqt/m %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1) - : "f"(new_x)); - - /* Fix up the negation we did above, as well as handling -0 properly. */ - x = copysign(new_x, x); - } - return x; + : "=&f"(r), "=&f"(tmp) + : "f"(-x), "f"(-two52)); + + /* Fix up the negation we did above, as well as handling -0 properly. */ + return copysign (r, x); } weak_alias (__ceil, ceil) diff --git a/sysdeps/alpha/fpu/s_ceilf.c b/sysdeps/alpha/fpu/s_ceilf.c index aba1697a55..0df651f405 100644 --- a/sysdeps/alpha/fpu/s_ceilf.c +++ b/sysdeps/alpha/fpu/s_ceilf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson. @@ -26,30 +26,20 @@ float __ceilf (float x) { - if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */ - { - /* Note that Alpha S_Floating is stored in registers in a - restricted T_Floating format, so we don't even need to - convert back to S_Floating in the end. The initial - conversion to T_Floating is needed to handle denormals. */ - - float tmp1, tmp2, new_x; - - new_x = -x; - __asm ("cvtst/s %3,%2\n\t" + float two23 = copysignf (0x1.0p23, x); + float r, tmp; + + __asm ( #ifdef _IEEE_FP_INEXACT - "cvttq/svim %2,%1\n\t" + "adds/suim %2, %3, %1\n\tsubs/suim %1, %3, %0" #else - "cvttq/svm %2,%1\n\t" + "adds/sum %2, %3, %1\n\tsubs/sum %1, %3, %0" #endif - "cvtqt/m %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1), "=&f"(tmp2) - : "f"(new_x)); - - /* Fix up the negation we did above, as well as handling -0 properly. */ - x = copysignf(new_x, x); - } - return x; + : "=&f"(r), "=&f"(tmp) + : "f"(-x), "f"(-two23)); + + /* Fix up the negation we did above, as well as handling -0 properly. */ + return copysignf (r, x); } weak_alias (__ceilf, ceilf) diff --git a/sysdeps/alpha/fpu/s_floor.c b/sysdeps/alpha/fpu/s_floor.c index b22c52303d..5af6386155 100644 --- a/sysdeps/alpha/fpu/s_floor.c +++ b/sysdeps/alpha/fpu/s_floor.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson. @@ -21,32 +21,26 @@ #include <math_ldbl_opt.h> -/* Use the -inf rounding mode conversion instructions to implement - floor. We note when the exponent is large enough that the value - must be integral, as this avoids unpleasant integer overflows. */ +/* Use the -inf rounding mode conversion instructions to implement floor. */ double __floor (double x) { - if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */ - { - double tmp1, new_x; - - __asm ( + double two52 = copysign (0x1.0p52, x); + double r, tmp; + + __asm ( #ifdef _IEEE_FP_INEXACT - "cvttq/svim %2,%1\n\t" + "addt/suim %2, %3, %1\n\tsubt/suim %1, %3, %0" #else - "cvttq/svm %2,%1\n\t" + "addt/sum %2, %3, %1\n\tsubt/sum %1, %3, %0" #endif - "cvtqt/m %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1) - : "f"(x)); - - /* floor(-0) == -0, and in general we'll always have the same - sign as our input. */ - x = copysign(new_x, x); - } - return x; + : "=&f"(r), "=&f"(tmp) + : "f"(x), "f"(two52)); + + /* floor(-0) == -0, and in general we'll always have the same + sign as our input. */ + return copysign (r, x); } weak_alias (__floor, floor) diff --git a/sysdeps/alpha/fpu/s_floorf.c b/sysdeps/alpha/fpu/s_floorf.c index fd1ddab6be..8b421705cd 100644 --- a/sysdeps/alpha/fpu/s_floorf.c +++ b/sysdeps/alpha/fpu/s_floorf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson. @@ -20,37 +20,26 @@ #include <math.h> -/* Use the -inf rounding mode conversion instructions to implement - floor. We note when the exponent is large enough that the value - must be integral, as this avoids unpleasant integer overflows. */ +/* Use the -inf rounding mode conversion instructions to implement floor. */ float __floorf (float x) { - if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */ - { - /* Note that Alpha S_Floating is stored in registers in a - restricted T_Floating format, so we don't even need to - convert back to S_Floating in the end. The initial - conversion to T_Floating is needed to handle denormals. */ - - float tmp1, tmp2, new_x; - - __asm ("cvtst/s %3,%2\n\t" + float two23 = copysignf (0x1.0p23, x); + float r, tmp; + + __asm ( #ifdef _IEEE_FP_INEXACT - "cvttq/svim %2,%1\n\t" + "adds/suim %2, %3, %1\n\tsubs/suim %1, %3, %0" #else - "cvttq/svm %2,%1\n\t" + "adds/sum %2, %3, %1\n\tsubs/sum %1, %3, %0" #endif - "cvtqt/m %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1), "=&f"(tmp2) - : "f"(x)); - - /* floor(-0) == -0, and in general we'll always have the same - sign as our input. */ - x = copysignf(new_x, x); - } - return x; + : "=&f"(r), "=&f"(tmp) + : "f"(x), "f"(two23)); + + /* floor(-0) == -0, and in general we'll always have the same + sign as our input. */ + return copysignf (r, x); } weak_alias (__floorf, floorf) diff --git a/sysdeps/alpha/fpu/s_fmax.S b/sysdeps/alpha/fpu/s_fmax.S new file mode 100644 index 0000000000..4f2ace7d11 --- /dev/null +++ b/sysdeps/alpha/fpu/s_fmax.S @@ -0,0 +1,58 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + + .set noat + .set noreorder + + .text +ENTRY (__fmax) + .prologue 0 + + cmptun/su $f16, $f16, $f10 + cmptun/su $f17, $f17, $f11 + fmov $f17, $f0 + unop + + trapb + fbne $f10, $ret + fmov $f16, $f0 + fbne $f11, $ret + + cmptlt/su $f16, $f17, $f11 + trapb + fcmovne $f11, $f17, $f0 +$ret: ret + +END (__fmax) + +/* Given the in-register format of single-precision, this works there too. */ +strong_alias (__fmax, __fmaxf) +weak_alias (__fmaxf, fmaxf) + +weak_alias (__fmax, fmax) +#ifdef NO_LONG_DOUBLE +strong_alias (__fmax, __fmaxl) +weak_alias (__fmaxl, fmaxl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __fmax, fmaxl, GLIBC_2_0); +#endif diff --git a/sysdeps/alpha/fpu/s_fmaxf.S b/sysdeps/alpha/fpu/s_fmaxf.S new file mode 100644 index 0000000000..3c2d62bb81 --- /dev/null +++ b/sysdeps/alpha/fpu/s_fmaxf.S @@ -0,0 +1 @@ +/* __fmaxf is in s_fmax.c */ diff --git a/sysdeps/alpha/fpu/s_fmin.S b/sysdeps/alpha/fpu/s_fmin.S new file mode 100644 index 0000000000..10de52940e --- /dev/null +++ b/sysdeps/alpha/fpu/s_fmin.S @@ -0,0 +1,58 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <math_ldbl_opt.h> + + .set noat + .set noreorder + + .text +ENTRY (__fmin) + .prologue 0 + + cmptun/su $f16, $f16, $f10 + cmptun/su $f17, $f17, $f11 + fmov $f17, $f0 + unop + + trapb + fbne $f10, $ret + fmov $f16, $f0 + fbne $f11, $ret + + cmptlt/su $f17, $f16, $f11 + trapb + fcmovne $f11, $f17, $f0 +$ret: ret + +END (__fmin) + +/* Given the in-register format of single-precision, this works there too. */ +strong_alias (__fmin, __fminf) +weak_alias (__fminf, fminf) + +weak_alias (__fmin, fmin) +#ifdef NO_LONG_DOUBLE +strong_alias (__fmin, __fminl) +weak_alias (__fminl, fminl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __fmin, fminl, GLIBC_2_0); +#endif diff --git a/sysdeps/alpha/fpu/s_fminf.S b/sysdeps/alpha/fpu/s_fminf.S new file mode 100644 index 0000000000..10ab7fe53c --- /dev/null +++ b/sysdeps/alpha/fpu/s_fminf.S @@ -0,0 +1 @@ +/* __fminf is in s_fmin.c */ diff --git a/sysdeps/alpha/fpu/s_isnan.c b/sysdeps/alpha/fpu/s_isnan.c new file mode 100644 index 0000000000..4403a50bb0 --- /dev/null +++ b/sysdeps/alpha/fpu/s_isnan.c @@ -0,0 +1,58 @@ +/* Return 1 if argument is a NaN, else 0. + Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Ugly kludge to avoid declarations. */ +#define __isnanf not___isnanf +#define isnanf not_isnanf +#define __GI___isnanf not__GI___isnanf + +#include <math.h> +#include <math_ldbl_opt.h> + +#undef __isnanf +#undef isnanf +#undef __GI___isnanf + +/* The hidden_proto in include/math.h was obscured by the macro hackery. */ +__typeof (__isnan) __isnanf; +hidden_proto (__isnanf) + + +int +__isnan (double x) +{ + return isunordered (x, x); +} + +hidden_def (__isnan) +weak_alias (__isnan, isnan) + +/* It turns out that the 'double' version will also always work for + single-precision. */ +strong_alias (__isnan, __isnanf) +hidden_def (__isnanf) +weak_alias (__isnanf, isnanf) + +#ifdef NO_LONG_DOUBLE +strong_alias (__isnan, __isnanl) +weak_alias (__isnan, isnanl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __isnan, isnanl, GLIBC_2_0); +#endif diff --git a/sysdeps/alpha/fpu/s_isnanf.c b/sysdeps/alpha/fpu/s_isnanf.c new file mode 100644 index 0000000000..af41e43850 --- /dev/null +++ b/sysdeps/alpha/fpu/s_isnanf.c @@ -0,0 +1 @@ +/* In s_isnan.c */ diff --git a/sysdeps/alpha/fpu/s_llrint.c b/sysdeps/alpha/fpu/s_llrint.c new file mode 100644 index 0000000000..5db97be037 --- /dev/null +++ b/sysdeps/alpha/fpu/s_llrint.c @@ -0,0 +1 @@ +/* In s_lrint.c */ diff --git a/sysdeps/alpha/fpu/s_llrintf.c b/sysdeps/alpha/fpu/s_llrintf.c new file mode 100644 index 0000000000..18f2885ef7 --- /dev/null +++ b/sysdeps/alpha/fpu/s_llrintf.c @@ -0,0 +1 @@ +/* In s_lrintf.c */ diff --git a/sysdeps/alpha/fpu/s_llround.c b/sysdeps/alpha/fpu/s_llround.c new file mode 100644 index 0000000000..b212fbd8e5 --- /dev/null +++ b/sysdeps/alpha/fpu/s_llround.c @@ -0,0 +1 @@ +/* In s_lround.c. */ diff --git a/sysdeps/alpha/fpu/s_llroundf.c b/sysdeps/alpha/fpu/s_llroundf.c new file mode 100644 index 0000000000..73bdf3103f --- /dev/null +++ b/sysdeps/alpha/fpu/s_llroundf.c @@ -0,0 +1 @@ +/* In s_lroundf.c. */ diff --git a/sysdeps/alpha/fpu/s_lrint.c b/sysdeps/alpha/fpu/s_lrint.c new file mode 100644 index 0000000000..4c32f61093 --- /dev/null +++ b/sysdeps/alpha/fpu/s_lrint.c @@ -0,0 +1,48 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define __llrint not___llrint +#define llrint not_llrint +#include <math.h> +#include <math_ldbl_opt.h> +#undef __llrint +#undef llrint + +long int +__lrint (double x) +{ + long ret; + + __asm ("cvttq/svd %1,%0" : "=&f"(ret) : "f"(x)); + + return ret; +} + +strong_alias (__lrint, __llrint) +weak_alias (__lrint, lrint) +weak_alias (__llrint, llrint) +#ifdef NO_LONG_DOUBLE +strong_alias (__lrint, __lrintl) +strong_alias (__lrint, __llrintl) +weak_alias (__lrintl, lrintl) +weak_alias (__llrintl, llrintl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __lrint, lrintl, GLIBC_2_0); +compat_symbol (libm, __llrint, llrintl, GLIBC_2_0); +#endif diff --git a/sysdeps/alpha/fpu/s_lrintf.c b/sysdeps/alpha/fpu/s_lrintf.c new file mode 100644 index 0000000000..20a6a6cf82 --- /dev/null +++ b/sysdeps/alpha/fpu/s_lrintf.c @@ -0,0 +1,39 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define __llrintf not___llrintf +#define llrintf not_llrintf +#include <math.h> +#undef __llrintf +#undef llrintf + +long int +__lrintf (float x) +{ + double tmp; + long ret; + + __asm ("cvtst/s %2,%1\n\tcvttq/svd %1,%0" + : "=&f"(ret), "=&f"(tmp) : "f"(x)); + + return ret; +} + +strong_alias (__lrintf, __llrintf) +weak_alias (__lrintf, lrintf) +weak_alias (__llrintf, llrintf) diff --git a/sysdeps/alpha/fpu/s_lround.c b/sysdeps/alpha/fpu/s_lround.c new file mode 100644 index 0000000000..bc5cb88ed2 --- /dev/null +++ b/sysdeps/alpha/fpu/s_lround.c @@ -0,0 +1,48 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define __llround not___llround +#define llround not_llround +#include <math.h> +#include <math_ldbl_opt.h> +#undef __llround +#undef llround + +long int +__lround (double x) +{ + double adj; + + adj = 0x1.fffffffffffffp-2; /* nextafter (0.5, 0.0) */ + adj = copysign (adj, x); + return x + adj; +} + +strong_alias (__lround, __llround) +weak_alias (__lround, lround) +weak_alias (__llround, llround) +#ifdef NO_LONG_DOUBLE +strong_alias (__lround, __lroundl) +strong_alias (__lround, __llroundl) +weak_alias (__lroundl, lroundl) +weak_alias (__llroundl, llroundl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __lround, lroundl, GLIBC_2_0); +compat_symbol (libm, __llround, llroundl, GLIBC_2_0); +#endif diff --git a/sysdeps/alpha/fpu/s_lroundf.c b/sysdeps/alpha/fpu/s_lroundf.c new file mode 100644 index 0000000000..16ff348b21 --- /dev/null +++ b/sysdeps/alpha/fpu/s_lroundf.c @@ -0,0 +1,38 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define __llroundf not___llroundf +#define llroundf not_llroundf +#include <math.h> +#undef __llroundf +#undef llroundf + + +long int +__lroundf (float x) +{ + float adj; + + adj = 0x1.fffffep-2; /* nextafterf (0.5f, 0.0f) */ + adj = copysignf (adj, x); + return x + adj; +} + +strong_alias (__lroundf, __llroundf) +weak_alias (__lroundf, lroundf) +weak_alias (__llroundf, llroundf) diff --git a/sysdeps/alpha/fpu/s_nearbyint.c b/sysdeps/alpha/fpu/s_nearbyint.c new file mode 100644 index 0000000000..7a91bd115b --- /dev/null +++ b/sysdeps/alpha/fpu/s_nearbyint.c @@ -0,0 +1,48 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <math.h> +#include <math_ldbl_opt.h> + +#ifdef _IEEE_FP_INEXACT +#error "Don't compile with -mieee-with-inexact" +#endif + +double +__nearbyint (double x) +{ + double two52 = copysign (0x1.0p52, x); + double r; + + r = x + two52; + r = r - two52; + + /* nearbyint(-0.1) == -0, and in general we'll always have the same sign + as our input. */ + return copysign (r, x); +} + +weak_alias (__nearbyint, nearbyint) +#ifdef NO_LONG_DOUBLE +strong_alias (__nearbyint, __nearbyintl) +weak_alias (__nearbyint, nearbyintl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __nearbyint, nearbyintl, GLIBC_2_0); +#endif diff --git a/sysdeps/alpha/fpu/s_nearbyintf.c b/sysdeps/alpha/fpu/s_nearbyintf.c new file mode 100644 index 0000000000..ee637982df --- /dev/null +++ b/sysdeps/alpha/fpu/s_nearbyintf.c @@ -0,0 +1,40 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <math.h> + +#ifdef _IEEE_FP_INEXACT +#error "Don't compile with -mieee-with-inexact" +#endif + +float +__nearbyintf (float x) +{ + float two23 = copysignf (0x1.0p23, x); + float r; + + r = x + two23; + r = r - two23; + + /* nearbyint(-0.1) == -0, and in general we'll always have the same sign + as our input. */ + return copysign (r, x); +} + +weak_alias (__nearbyintf, nearbyintf) diff --git a/sysdeps/alpha/fpu/s_rint.c b/sysdeps/alpha/fpu/s_rint.c index be09651b35..e9aa028822 100644 --- a/sysdeps/alpha/fpu/s_rint.c +++ b/sysdeps/alpha/fpu/s_rint.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson. @@ -24,24 +24,15 @@ double __rint (double x) { - if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */ - { - double tmp1, new_x; - __asm ( -#ifdef _IEEE_FP_INEXACT - "cvttq/svid %2,%1\n\t" -#else - "cvttq/svd %2,%1\n\t" -#endif - "cvtqt/d %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1) - : "f"(x)); - - /* rint(-0.1) == -0, and in general we'll always have the same - sign as our input. */ - x = copysign(new_x, x); - } - return x; + double two52 = copysign (0x1.0p52, x); + double r; + + r = x + two52; + r = r - two52; + + /* rint(-0.1) == -0, and in general we'll always have the same sign + as our input. */ + return copysign (r, x); } weak_alias (__rint, rint) diff --git a/sysdeps/alpha/fpu/s_rintf.c b/sysdeps/alpha/fpu/s_rintf.c index d5d019d709..9e4cbd1ffd 100644 --- a/sysdeps/alpha/fpu/s_rintf.c +++ b/sysdeps/alpha/fpu/s_rintf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson. @@ -23,30 +23,15 @@ float __rintf (float x) { - if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */ - { - /* Note that Alpha S_Floating is stored in registers in a - restricted T_Floating format, so we don't even need to - convert back to S_Floating in the end. The initial - conversion to T_Floating is needed to handle denormals. */ - - float tmp1, tmp2, new_x; - - __asm ("cvtst/s %3,%2\n\t" -#ifdef _IEEE_FP_INEXACT - "cvttq/svid %2,%1\n\t" -#else - "cvttq/svd %2,%1\n\t" -#endif - "cvtqt/d %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1), "=&f"(tmp2) - : "f"(x)); - - /* rint(-0.1) == -0, and in general we'll always have the same - sign as our input. */ - x = copysignf(new_x, x); - } - return x; + float two23 = copysignf (0x1.0p23, x); + float r; + + r = x + two23; + r = r - two23; + + /* rint(-0.1) == -0, and in general we'll always have the same sign + as our input. */ + return copysign (r, x); } weak_alias (__rintf, rintf) diff --git a/sysdeps/alpha/fpu/s_round.c b/sysdeps/alpha/fpu/s_round.c new file mode 100644 index 0000000000..3999e6110a --- /dev/null +++ b/sysdeps/alpha/fpu/s_round.c @@ -0,0 +1,49 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <math.h> +#include <math_ldbl_opt.h> + + +double +__round (double x) +{ + const double almost_half = 0x1.fffffffffffffp-2; + const double two52 = 0x1.0p52; + double tmp, r; + + __asm ( +#ifdef _IEEE_FP_INEXACT + "addt/suic %2, %3, %1\n\tsubt/suic %1, %3, %0" +#else + "addt/suc %2, %3, %1\n\tsubt/suc %1, %3, %0" +#endif + : "=&f"(r), "=&f"(tmp) + : "f"(fabs (x) + almost_half), "f"(two52)); + + return copysign (r, x); +} + +weak_alias (__round, round) +#ifdef NO_LONG_DOUBLE +strong_alias (__round, __roundl) +weak_alias (__roundl, roundl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __round, roundl, GLIBC_2_0); +#endif diff --git a/sysdeps/alpha/fpu/s_roundf.c b/sysdeps/alpha/fpu/s_roundf.c new file mode 100644 index 0000000000..89584f062b --- /dev/null +++ b/sysdeps/alpha/fpu/s_roundf.c @@ -0,0 +1,44 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <math.h> + + +float +__roundf (float x) +{ + const float almost_half = 0x1.fffffep-2; + const float two23 = 0x1.0p23; + float r, tmp; + + __asm ( +#ifdef _IEEE_FP_INEXACT + "adds/suic %2, %3, %1\n\tsubs/suic %1, %3, %0" +#else + "adds/suc %2, %3, %1\n\tsubs/suc %1, %3, %0" +#endif + : "=&f"(r), "=&f"(tmp) + : "f"(fabsf (x) + almost_half), "f"(two23)); + + /* round(-0) == -0, and in general we'll always have the same + sign as our input. */ + return copysignf (r, x); +} + +weak_alias (__roundf, roundf) diff --git a/sysdeps/alpha/fpu/s_trunc.c b/sysdeps/alpha/fpu/s_trunc.c new file mode 100644 index 0000000000..1c1a66673f --- /dev/null +++ b/sysdeps/alpha/fpu/s_trunc.c @@ -0,0 +1,53 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <math.h> +#include <math_ldbl_opt.h> + + +/* Use the chopped rounding mode conversion instructions to implement trunc. */ + +double +__trunc (double x) +{ + double two52 = copysign (0x1.0p52, x); + double r, tmp; + + __asm ( +#ifdef _IEEE_FP_INEXACT + "addt/suic %2, %3, %1\n\tsubt/suic %1, %3, %0" +#else + "addt/suc %2, %3, %1\n\tsubt/suc %1, %3, %0" +#endif + : "=&f"(r), "=&f"(tmp) + : "f"(x), "f"(two52)); + + /* trunc(-0) == -0, and in general we'll always have the same + sign as our input. */ + return copysign (r, x); +} + +weak_alias (__trunc, trunc) +#ifdef NO_LONG_DOUBLE +strong_alias (__trunc, __truncl) +weak_alias (__trunc, truncl) +#endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) +compat_symbol (libm, __trunc, truncl, GLIBC_2_0); +#endif diff --git a/sysdeps/alpha/fpu/s_truncf.c b/sysdeps/alpha/fpu/s_truncf.c new file mode 100644 index 0000000000..094997b433 --- /dev/null +++ b/sysdeps/alpha/fpu/s_truncf.c @@ -0,0 +1,45 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <math.h> + + +/* Use the chopped rounding mode conversion instructions to implement trunc. */ + +float +__truncf (float x) +{ + float two23 = copysignf (0x1.0p23, x); + float r, tmp; + + __asm ( +#ifdef _IEEE_FP_INEXACT + "adds/suic %2, %3, %1\n\tsubs/suic %1, %3, %0" +#else + "adds/suc %2, %3, %1\n\tsubs/suc %1, %3, %0" +#endif + : "=&f"(r), "=&f"(tmp) + : "f"(x), "f"(two23)); + + /* trunc(-0) == -0, and in general we'll always have the same + sign as our input. */ + return copysignf (r, x); +} + +weak_alias (__truncf, truncf) diff --git a/sysdeps/generic/inttypes.h b/sysdeps/generic/inttypes.h index 87f532f1d4..3f1b316c09 100644 --- a/sysdeps/generic/inttypes.h +++ b/sysdeps/generic/inttypes.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-2001, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1997-2001, 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -330,7 +330,7 @@ extern long int __strtol_internal (__const char *__restrict __nptr, int __base, int __group) __THROW; # define __strtol_internal_defined 1 # endif -extern __inline intmax_t +__extern_inline intmax_t __NTH (strtoimax (__const char *__restrict nptr, char **__restrict endptr, int base)) { @@ -345,7 +345,7 @@ extern unsigned long int __strtoul_internal (__const char * int __base, int __group) __THROW; # define __strtoul_internal_defined 1 # endif -extern __inline uintmax_t +__extern_inline uintmax_t __NTH (strtoumax (__const char *__restrict nptr, char **__restrict endptr, int base)) { @@ -359,7 +359,7 @@ extern long int __wcstol_internal (__const __gwchar_t * __restrict __nptr, int __base, int __group) __THROW; # define __wcstol_internal_defined 1 # endif -extern __inline intmax_t +__extern_inline intmax_t __NTH (wcstoimax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr, int base)) { @@ -376,7 +376,7 @@ extern unsigned long int __wcstoul_internal (__const __gwchar_t * int __base, int __group) __THROW; # define __wcstoul_internal_defined 1 # endif -extern __inline uintmax_t +__extern_inline uintmax_t __NTH (wcstoumax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr, int base)) { @@ -393,7 +393,7 @@ extern long long int __strtoll_internal (__const char *__restrict __nptr, int __base, int __group) __THROW; # define __strtoll_internal_defined 1 # endif -extern __inline intmax_t +__extern_inline intmax_t __NTH (strtoimax (__const char *__restrict nptr, char **__restrict endptr, int base)) { @@ -411,7 +411,7 @@ extern unsigned long long int __strtoull_internal (__const char * int __group) __THROW; # define __strtoull_internal_defined 1 # endif -extern __inline uintmax_t +__extern_inline uintmax_t __NTH (strtoumax (__const char *__restrict nptr, char **__restrict endptr, int base)) { @@ -427,7 +427,7 @@ extern long long int __wcstoll_internal (__const __gwchar_t * int __base, int __group) __THROW; # define __wcstoll_internal_defined 1 # endif -extern __inline intmax_t +__extern_inline intmax_t __NTH (wcstoimax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr, int base)) { @@ -446,7 +446,7 @@ extern unsigned long long int __wcstoull_internal (__const __gwchar_t * int __group) __THROW; # define __wcstoull_internal_defined 1 # endif -extern __inline uintmax_t +__extern_inline uintmax_t __NTH (wcstoumax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr, int base)) { diff --git a/sysdeps/generic/machine-lock.h b/sysdeps/generic/machine-lock.h index c7cadf5128..db9f444891 100644 --- a/sysdeps/generic/machine-lock.h +++ b/sysdeps/generic/machine-lock.h @@ -1,5 +1,5 @@ /* Machine-specific definition for spin locks. Stub version. - Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Copyright (C) 1994, 1997, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -30,7 +30,7 @@ typedef volatile int __spin_lock_t; #ifndef _EXTERN_INLINE -#define _EXTERN_INLINE extern __inline +#define _EXTERN_INLINE __extern_inline #endif /* Unlock LOCK. */ diff --git a/sysdeps/generic/machine-sp.h b/sysdeps/generic/machine-sp.h index a8be7c0f69..25e423efa5 100644 --- a/sysdeps/generic/machine-sp.h +++ b/sysdeps/generic/machine-sp.h @@ -1,5 +1,5 @@ /* Machine-specific function to return the stack pointer. Stub version. - Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Copyright (C) 1994, 1997, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,7 +23,7 @@ /* Return the current stack pointer. */ #ifndef _EXTERN_INLINE -#define _EXTERN_INLINE extern __inline +#define _EXTERN_INLINE __extern_inline #endif _EXTERN_INLINE void * diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h index 28547d44b8..a0f630e240 100644 --- a/sysdeps/i386/fpu/bits/mathinline.h +++ b/sysdeps/i386/fpu/bits/mathinline.h @@ -1,5 +1,5 @@ /* Inline math functions for i387. - Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2006 + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2003,2004,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by John C. Bowman <bowman@math.ualberta.ca>, 1995. @@ -26,7 +26,7 @@ #ifdef __cplusplus # define __MATH_INLINE __inline #else -# define __MATH_INLINE extern __inline +# define __MATH_INLINE __extern_inline #endif diff --git a/sysdeps/i386/fpu/e_fmod.S b/sysdeps/i386/fpu/e_fmod.S index e801286a9b..4cf6e92054 100644 --- a/sysdeps/i386/fpu/e_fmod.S +++ b/sysdeps/i386/fpu/e_fmod.S @@ -10,7 +10,7 @@ RCSID("$NetBSD: e_fmod.S,v 1.4 1995/05/08 23:47:56 jtc Exp $") ENTRY(__ieee754_fmod) fldl 12(%esp) fldl 4(%esp) -1: fprem1 +1: fprem fstsw %ax sahf jp 1b diff --git a/sysdeps/i386/fpu/e_fmodf.S b/sysdeps/i386/fpu/e_fmodf.S index 1850af098e..bbce40976d 100644 --- a/sysdeps/i386/fpu/e_fmodf.S +++ b/sysdeps/i386/fpu/e_fmodf.S @@ -11,7 +11,7 @@ RCSID("$NetBSD: $") ENTRY(__ieee754_fmodf) flds 8(%esp) flds 4(%esp) -1: fprem1 +1: fprem fstsw %ax sahf jp 1b diff --git a/sysdeps/i386/fpu/e_fmodl.c b/sysdeps/i386/fpu/e_fmodl.c index 97a06d0016..c7c9a60456 100644 --- a/sysdeps/i386/fpu/e_fmodl.c +++ b/sysdeps/i386/fpu/e_fmodl.c @@ -12,7 +12,7 @@ __ieee754_fmodl (long double x, long double y) { long double res; - asm ("1:\tfprem1\n" + asm ("1:\tfprem\n" "fstsw %%ax\n" "sahf\n" "jp 1b\n" diff --git a/sysdeps/i386/fpu/e_log.S b/sysdeps/i386/fpu/e_log.S index 5604e638f5..ce55b72292 100644 --- a/sysdeps/i386/fpu/e_log.S +++ b/sysdeps/i386/fpu/e_log.S @@ -36,11 +36,15 @@ limit: .double 0.29 ENTRY(__ieee754_log) fldln2 // log(2) fldl 4(%esp) // x : log(2) + fxam + fnstsw #ifdef PIC LOAD_PIC_REG (dx) #endif fld %st // x : x : log(2) - fsubl MO(one) // x-1 : x : log(2) + sahf + jc 3f // in case x is NaN or +-Inf +4: fsubl MO(one) // x-1 : x : log(2) fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) @@ -54,4 +58,9 @@ ENTRY(__ieee754_log) 2: fstp %st(0) // x : log(2) fyl2x // log(x) ret + +3: jp 4b // in case x is +-Inf + fstp %st(1) + fstp %st(1) + ret END (__ieee754_log) diff --git a/sysdeps/i386/fpu/e_logf.S b/sysdeps/i386/fpu/e_logf.S index 128bb2754c..cd4538b594 100644 --- a/sysdeps/i386/fpu/e_logf.S +++ b/sysdeps/i386/fpu/e_logf.S @@ -37,11 +37,15 @@ limit: .double 0.29 ENTRY(__ieee754_logf) fldln2 // log(2) flds 4(%esp) // x : log(2) + fxam + fnstsw #ifdef PIC LOAD_PIC_REG (dx) #endif fld %st // x : x : log(2) - fsubl MO(one) // x-1 : x : log(2) + sahf + jc 3f // in case x is NaN or +-Inf +4: fsubl MO(one) // x-1 : x : log(2) fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) @@ -55,4 +59,9 @@ ENTRY(__ieee754_logf) 2: fstp %st(0) // x : log(2) fyl2x // log(x) ret + +3: jp 4b // in case x is +-Inf + fstp %st(1) + fstp %st(1) + ret END (__ieee754_logf) diff --git a/sysdeps/i386/fpu/e_logl.S b/sysdeps/i386/fpu/e_logl.S index 5023d3012f..551dcf1e46 100644 --- a/sysdeps/i386/fpu/e_logl.S +++ b/sysdeps/i386/fpu/e_logl.S @@ -37,11 +37,15 @@ limit: .double 0.29 ENTRY(__ieee754_logl) fldln2 // log(2) fldt 4(%esp) // x : log(2) + fxam + fnstsw #ifdef PIC LOAD_PIC_REG (dx) #endif fld %st // x : x : log(2) - fsubl MO(one) // x-1 : x : log(2) + sahf + jc 3f // in case x is NaN or +-Inf +4: fsubl MO(one) // x-1 : x : log(2) fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) @@ -55,4 +59,9 @@ ENTRY(__ieee754_logl) 2: fstp %st(0) // x : log(2) fyl2x // log(x) ret + +3: jp 4b // in case x is +-Inf + fstp %st(1) + fstp %st(1) + ret END (__ieee754_logl) diff --git a/sysdeps/i386/fpu/e_pow.S b/sysdeps/i386/fpu/e_pow.S index c554ca4ecb..792f926902 100644 --- a/sysdeps/i386/fpu/e_pow.S +++ b/sysdeps/i386/fpu/e_pow.S @@ -1,5 +1,5 @@ /* ix87 specific implementation of pow function. - Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005 + Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -161,10 +161,11 @@ ENTRY(__ieee754_pow) 2: /* y is a real number. */ fxch // x : y fldl MO(one) // 1.0 : x : y - fld %st(1) // x : 1.0 : x : y - fsub %st(1) // x-1 : 1.0 : x : y - fabs // |x-1| : 1.0 : x : y - fcompl MO(limit) // 1.0 : x : y + fldl MO(limit) // 0.29 : 1.0 : x : y + fld %st(2) // x : 0.29 : 1.0 : x : y + fsub %st(2) // x-1 : 0.29 : 1.0 : x : y + fabs // |x-1| : 0.29 : 1.0 : x : y + fucompp // 1.0 : x : y fnstsw fxch // x : 1.0 : y sahf @@ -197,9 +198,10 @@ ENTRY(__ieee754_pow) // y == ħinf .align ALIGNARG(4) 12: fstp %st(0) // pop y - fldl 4(%esp) // x - fabs - fcompl MO(one) // < 1, == 1, or > 1 + fldl MO(one) // 1 + fldl 4(%esp) // x : 1 + fabs // abs(x) : 1 + fucompp // < 1, == 1, or > 1 fnstsw andb $0x45, %ah cmpb $0x45, %ah diff --git a/sysdeps/i386/fpu/e_powf.S b/sysdeps/i386/fpu/e_powf.S index c835b978b9..c91545418d 100644 --- a/sysdeps/i386/fpu/e_powf.S +++ b/sysdeps/i386/fpu/e_powf.S @@ -1,5 +1,5 @@ /* ix87 specific implementation of pow function. - Copyright (C) 1996, 1997, 1999, 2001, 2004, 2005 + Copyright (C) 1996, 1997, 1999, 2001, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -155,10 +155,11 @@ ENTRY(__ieee754_powf) 2: /* y is a real number. */ fxch // x : y fldl MO(one) // 1.0 : x : y - fld %st(1) // x : 1.0 : x : y - fsub %st(1) // x-1 : 1.0 : x : y - fabs // |x-1| : 1.0 : x : y - fcompl MO(limit) // 1.0 : x : y + fldl MO(limit) // 0.29 : 1.0 : x : y + fld %st(2) // x : 0.29 : 1.0 : x : y + fsub %st(2) // x-1 : 0.29 : 1.0 : x : y + fabs // |x-1| : 0.29 : 1.0 : x : y + fucompp // 1.0 : x : y fnstsw fxch // x : 1.0 : y sahf @@ -191,9 +192,10 @@ ENTRY(__ieee754_powf) // y == ħinf .align ALIGNARG(4) 12: fstp %st(0) // pop y - flds 4(%esp) // x - fabs - fcompl MO(one) // < 1, == 1, or > 1 + fldl MO(one) // 1 + flds 4(%esp) // x : 1 + fabs // abs(x) : 1 + fucompp // < 1, == 1, or > 1 fnstsw andb $0x45, %ah cmpb $0x45, %ah diff --git a/sysdeps/i386/fpu/e_powl.S b/sysdeps/i386/fpu/e_powl.S index 74f422816a..6215496207 100644 --- a/sysdeps/i386/fpu/e_powl.S +++ b/sysdeps/i386/fpu/e_powl.S @@ -1,5 +1,5 @@ /* ix87 specific implementation of pow function. - Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005 + Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -161,10 +161,11 @@ ENTRY(__ieee754_powl) 2: /* y is a real number. */ fxch // x : y fldl MO(one) // 1.0 : x : y - fld %st(1) // x : 1.0 : x : y - fsub %st(1) // x-1 : 1.0 : x : y - fabs // |x-1| : 1.0 : x : y - fcompl MO(limit) // 1.0 : x : y + fldl MO(limit) // 0.29 : 1.0 : x : y + fld %st(2) // x : 0.29 : 1.0 : x : y + fsub %st(2) // x-1 : 0.29 : 1.0 : x : y + fabs // |x-1| : 0.29 : 1.0 : x : y + fucompp // 1.0 : x : y fnstsw fxch // x : 1.0 : y sahf @@ -210,9 +211,10 @@ ENTRY(__ieee754_powl) // y == ħinf .align ALIGNARG(4) 12: fstp %st(0) // pop y - fldt 4(%esp) // x - fabs - fcompl MO(one) // < 1, == 1, or > 1 + fldl MO(one) // 1 + fldt 4(%esp) // x : 1 + fabs // abs(x) : 1 + fucompp // < 1, == 1, or > 1 fnstsw andb $0x45, %ah cmpb $0x45, %ah diff --git a/sysdeps/i386/i486/bits/string.h b/sysdeps/i386/i486/bits/string.h index 203907b146..2db9abc9e4 100644 --- a/sysdeps/i386/i486/bits/string.h +++ b/sysdeps/i386/i486/bits/string.h @@ -1,5 +1,5 @@ /* Optimized, inlined string functions. i486 version. - Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2004 + Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2004,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -35,7 +35,7 @@ # ifdef __cplusplus # define __STRING_INLINE inline # else -# define __STRING_INLINE extern __inline +# define __STRING_INLINE __extern_inline # endif #endif diff --git a/sysdeps/ia64/fpu/bits/mathinline.h b/sysdeps/ia64/fpu/bits/mathinline.h index 9bb5f1a710..1e90257182 100644 --- a/sysdeps/ia64/fpu/bits/mathinline.h +++ b/sysdeps/ia64/fpu/bits/mathinline.h @@ -1,5 +1,5 @@ /* Inline math functions for ia64. - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -24,7 +24,7 @@ #ifdef __cplusplus # define __MATH_INLINE __inline #else -# define __MATH_INLINE extern __inline +# define __MATH_INLINE __extern_inline #endif #if defined __USE_ISOC99 && defined __GNUC__ && __GNUC__ >= 2 diff --git a/sysdeps/ieee754/dbl-64/e_pow.c b/sysdeps/ieee754/dbl-64/e_pow.c index d9bd8b479f..1e159f2c0b 100644 --- a/sysdeps/ieee754/dbl-64/e_pow.c +++ b/sysdeps/ieee754/dbl-64/e_pow.c @@ -106,20 +106,28 @@ double __ieee754_pow(double x, double y) { else return y < 0 ? 1.0/ABS(x) : 0.0; /* return 0 */ } + + qx = u.i[HIGH_HALF]&0x7fffffff; /* no sign */ + qy = v.i[HIGH_HALF]&0x7fffffff; /* no sign */ + + if (qx >= 0x7ff00000 && (qx > 0x7ff00000 || u.i[LOW_HALF] != 0)) return NaNQ.x; + if (qy >= 0x7ff00000 && (qy > 0x7ff00000 || v.i[LOW_HALF] != 0)) + return x == 1.0 ? 1.0 : NaNQ.x; + /* if x<0 */ if (u.i[HIGH_HALF] < 0) { k = checkint(y); if (k==0) { - if ((v.i[HIGH_HALF] & 0x7fffffff) == 0x7ff00000 && v.i[LOW_HALF] == 0) { + if (qy == 0x7ff00000) { if (x == -1.0) return 1.0; else if (x > -1.0) return v.i[HIGH_HALF] < 0 ? INF.x : 0.0; else return v.i[HIGH_HALF] < 0 ? 0.0 : INF.x; } - else if (u.i[HIGH_HALF] == 0xfff00000 && u.i[LOW_HALF] == 0) + else if (qx == 0x7ff00000) return y < 0 ? 0.0 : INF.x; return NaNQ.x; /* y not integer and x<0 */ } - else if (u.i[HIGH_HALF] == 0xfff00000 && u.i[LOW_HALF] == 0) + else if (qx == 0x7ff00000) { if (k < 0) return y < 0 ? nZERO.x : nINF.x; @@ -129,14 +137,6 @@ double __ieee754_pow(double x, double y) { return (k==1)?__ieee754_pow(-x,y):-__ieee754_pow(-x,y); /* if y even or odd */ } /* x>0 */ - qx = u.i[HIGH_HALF]&0x7fffffff; /* no sign */ - qy = v.i[HIGH_HALF]&0x7fffffff; /* no sign */ - - if (qx > 0x7ff00000 || (qx == 0x7ff00000 && u.i[LOW_HALF] != 0)) return NaNQ.x; - /* if 0<x<2^-0x7fe */ - if (qy > 0x7ff00000 || (qy == 0x7ff00000 && v.i[LOW_HALF] != 0)) - return x == 1.0 ? 1.0 : NaNQ.x; - /* if y<2^-0x7fe */ if (qx == 0x7ff00000) /* x= 2^-0x3ff */ {if (y == 0) return NaNQ.x; diff --git a/sysdeps/ieee754/ldbl-128/Makefile b/sysdeps/ieee754/ldbl-128/Makefile new file mode 100644 index 0000000000..8fd6dad343 --- /dev/null +++ b/sysdeps/ieee754/ldbl-128/Makefile @@ -0,0 +1 @@ +long-double-fcts = yes diff --git a/sysdeps/mach/alpha/machine-lock.h b/sysdeps/mach/alpha/machine-lock.h index 80f8750c87..bd27d2a51f 100644 --- a/sysdeps/mach/alpha/machine-lock.h +++ b/sysdeps/mach/alpha/machine-lock.h @@ -1,5 +1,5 @@ /* Machine-specific definition for spin locks. Alpha version. - Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Copyright (C) 1994, 1997, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -30,7 +30,7 @@ typedef __volatile long int __spin_lock_t; #ifndef _EXTERN_INLINE -#define _EXTERN_INLINE extern __inline +#define _EXTERN_INLINE __extern_inline #endif /* Unlock LOCK. */ diff --git a/sysdeps/mach/alpha/machine-sp.h b/sysdeps/mach/alpha/machine-sp.h index b737525574..e6df63c9ac 100644 --- a/sysdeps/mach/alpha/machine-sp.h +++ b/sysdeps/mach/alpha/machine-sp.h @@ -1,5 +1,5 @@ /* Machine-specific function to return the stack pointer. Alpha version. - Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Copyright (C) 1994, 1997, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,7 +23,7 @@ /* Return the current stack pointer. */ #ifndef _EXTERN_INLINE -#define _EXTERN_INLINE extern __inline +#define _EXTERN_INLINE __extern_inline #endif _EXTERN_INLINE void * diff --git a/sysdeps/mach/i386/machine-lock.h b/sysdeps/mach/i386/machine-lock.h index 7c23fba8c5..d786628170 100644 --- a/sysdeps/mach/i386/machine-lock.h +++ b/sysdeps/mach/i386/machine-lock.h @@ -1,5 +1,5 @@ /* Machine-specific definition for spin locks. i386 version. - Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Copyright (C) 1994, 1997, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -30,7 +30,7 @@ typedef __volatile int __spin_lock_t; #ifndef _EXTERN_INLINE -#define _EXTERN_INLINE extern __inline +#define _EXTERN_INLINE __extern_inline #endif /* Unlock LOCK. */ diff --git a/sysdeps/mach/powerpc/machine-lock.h b/sysdeps/mach/powerpc/machine-lock.h index cba6b0a6e2..96af2219be 100644 --- a/sysdeps/mach/powerpc/machine-lock.h +++ b/sysdeps/mach/powerpc/machine-lock.h @@ -1,5 +1,5 @@ /* Machine-specific definition for spin locks. PowerPC version. - Copyright (C) 1994,97,2002 Free Software Foundation, Inc. + Copyright (C) 1994,97,2002,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -30,7 +30,7 @@ typedef __volatile long int __spin_lock_t; #ifndef _EXTERN_INLINE -#define _EXTERN_INLINE extern __inline +#define _EXTERN_INLINE __extern_inline #endif /* Unlock LOCK. */ diff --git a/sysdeps/mach/powerpc/machine-sp.h b/sysdeps/mach/powerpc/machine-sp.h index cf5341cb9b..267707bce0 100644 --- a/sysdeps/mach/powerpc/machine-sp.h +++ b/sysdeps/mach/powerpc/machine-sp.h @@ -1,5 +1,5 @@ /* Machine-specific function to return the stack pointer. PowerPC version. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -27,7 +27,7 @@ # ifdef _HURD_THREADVAR_H_EXTERN_INLINE # define _EXTERN_INLINE _HURD_THREADVAR_H_EXTERN_INLINE # else -# define _EXTERN_INLINE extern __inline +# define _EXTERN_INLINE __extern_inline # endif #endif diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index b4966852a7..da48d46afe 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -1157,7 +1157,7 @@ get_scope (const struct sockaddr_storage *ss) 169.254/16 and 127/8 are link-local. */ if ((addr[0] == 169 && addr[1] == 254) || addr[0] == 127) scope = 2; - else if (addr[0] == 10 || (addr[0] == 172 && addr[1] == 16) + else if (addr[0] == 10 || (addr[0] == 172 && (addr[1] & 0xf0) == 16) || (addr[0] == 192 && addr[1] == 168)) scope = 5; else diff --git a/sysdeps/powerpc/fpu/bits/mathinline.h b/sysdeps/powerpc/fpu/bits/mathinline.h index 04478309d9..6c01fa436c 100644 --- a/sysdeps/powerpc/fpu/bits/mathinline.h +++ b/sysdeps/powerpc/fpu/bits/mathinline.h @@ -1,5 +1,5 @@ /* Inline math functions for powerpc. - Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2004, 2006 + Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2004, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -25,7 +25,7 @@ #ifdef __cplusplus # define __MATH_INLINE __inline #else -# define __MATH_INLINE extern __inline +# define __MATH_INLINE __extern_inline #endif /* __cplusplus */ #if defined __GNUC__ && !defined _SOFT_FLOAT diff --git a/sysdeps/s390/bits/string.h b/sysdeps/s390/bits/string.h index d83df39bb2..e16c7cb829 100644 --- a/sysdeps/s390/bits/string.h +++ b/sysdeps/s390/bits/string.h @@ -1,5 +1,5 @@ /* Optimized, inlined string functions. S/390 version. - Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2007 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -34,7 +34,7 @@ # ifdef __cplusplus # define __STRING_INLINE inline # else -# define __STRING_INLINE extern __inline +# define __STRING_INLINE __extern_inline # endif #endif diff --git a/sysdeps/s390/fpu/bits/mathinline.h b/sysdeps/s390/fpu/bits/mathinline.h index 5c6b83ad06..06a6368450 100644 --- a/sysdeps/s390/fpu/bits/mathinline.h +++ b/sysdeps/s390/fpu/bits/mathinline.h @@ -1,5 +1,5 @@ /* Inline math functions for s390. - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -24,7 +24,7 @@ #ifdef __cplusplus # define __MATH_INLINE __inline #else -# define __MATH_INLINE extern __inline +# define __MATH_INLINE __extern_inline #endif #if (!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) \ diff --git a/sysdeps/sparc/fpu/bits/mathinline.h b/sysdeps/sparc/fpu/bits/mathinline.h index 9dd784d122..16ad22e666 100644 --- a/sysdeps/sparc/fpu/bits/mathinline.h +++ b/sysdeps/sparc/fpu/bits/mathinline.h @@ -1,5 +1,5 @@ /* Inline math functions for SPARC. - Copyright (C) 1999, 2000, 2001, 2002, 2004, 2006 + Copyright (C) 1999, 2000, 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>. @@ -131,7 +131,7 @@ # ifdef __cplusplus # define __MATH_INLINE __inline # else -# define __MATH_INLINE extern __inline +# define __MATH_INLINE __extern_inline # endif /* __cplusplus */ /* The gcc, version 2.7 or below, has problems with all this inlining diff --git a/sysdeps/unix/bsd/bsd4.4/bits/socket.h b/sysdeps/unix/bsd/bsd4.4/bits/socket.h index b2227f10d2..f74603f948 100644 --- a/sysdeps/unix/bsd/bsd4.4/bits/socket.h +++ b/sysdeps/unix/bsd/bsd4.4/bits/socket.h @@ -1,5 +1,5 @@ /* System-specific socket constants and types. 4.4 BSD version. - Copyright (C) 1991,92,1994-2002,2004 Free Software Foundation, Inc. + Copyright (C) 1991,92,1994-2002,2004,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -227,7 +227,7 @@ extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) __THROW; #ifdef __USE_EXTERN_INLINES # ifndef _EXTERN_INLINE -# define _EXTERN_INLINE extern __inline +# define _EXTERN_INLINE __extern_inline # endif _EXTERN_INLINE struct cmsghdr * __NTH (__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg)) diff --git a/sysdeps/unix/sysv/linux/alpha/alphaev6/fpu/Implies b/sysdeps/unix/sysv/linux/alpha/alphaev6/fpu/Implies new file mode 100644 index 0000000000..0d7000dc2d --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/alphaev6/fpu/Implies @@ -0,0 +1,2 @@ +# Override ldbl-opt with alpha specific routines. +alpha/alphaev6/fpu diff --git a/sysdeps/unix/sysv/linux/alpha/alphaev67/fpu/Implies b/sysdeps/unix/sysv/linux/alpha/alphaev67/fpu/Implies new file mode 100644 index 0000000000..617c388d2d --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/alphaev67/fpu/Implies @@ -0,0 +1,2 @@ +# Override ldbl-opt with alpha specific routines. +alpha/alphaev67/fpu diff --git a/sysdeps/unix/sysv/linux/alpha/dl-auxv.h b/sysdeps/unix/sysv/linux/alpha/dl-auxv.h new file mode 100644 index 0000000000..8afc4dba3b --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/dl-auxv.h @@ -0,0 +1,36 @@ +/* Auxiliary vector processing for Linux/Alpha. + Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Scan the Aux Vector for the cache shape entries. */ + +long __libc_alpha_cache_shape[4] = { -2, -2, -2, -2 }; + +#define DL_PLATFORM_AUXV \ + case AT_L1I_CACHESHAPE: \ + __libc_alpha_cache_shape[0] = av->a_un.a_val; \ + break; \ + case AT_L1D_CACHESHAPE: \ + __libc_alpha_cache_shape[1] = av->a_un.a_val; \ + break; \ + case AT_L2_CACHESHAPE: \ + __libc_alpha_cache_shape[2] = av->a_un.a_val; \ + break; \ + case AT_L3_CACHESHAPE: \ + __libc_alpha_cache_shape[3] = av->a_un.a_val; \ + break; diff --git a/sysdeps/unix/sysv/linux/alpha/dl-support.c b/sysdeps/unix/sysv/linux/alpha/dl-support.c new file mode 100644 index 0000000000..290217671c --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/dl-support.c @@ -0,0 +1,2 @@ +#include "dl-auxv.h" +#include <elf/dl-support.c> diff --git a/sysdeps/unix/sysv/linux/alpha/dl-sysdep.c b/sysdeps/unix/sysv/linux/alpha/dl-sysdep.c index d95e46f6f1..4034820f4d 100644 --- a/sysdeps/unix/sysv/linux/alpha/dl-sysdep.c +++ b/sysdeps/unix/sysv/linux/alpha/dl-sysdep.c @@ -1,59 +1,2 @@ -/* Operating system support for run-time dynamic linker. Linux/Alpha version. - Copyright (C) 1997, 1998, 2001, 2003, 2006 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <config.h> -#include <kernel-features.h> -#include <ldsodefs.h> - -extern long __libc_alpha_cache_shape[4]; -weak_extern (__libc_alpha_cache_shape); - - -/* Scan the Aux Vector for the cache shape entries. */ -#define DL_PLATFORM_AUXV \ - case AT_L1I_CACHESHAPE: \ - { \ - long *cls = __libc_alpha_cache_shape; \ - if (cls != NULL) \ - cls[0] = av->a_un.a_val; \ - break; \ - } \ - case AT_L1D_CACHESHAPE: \ - { \ - long *cls = __libc_alpha_cache_shape; \ - if (cls != NULL) \ - cls[1] = av->a_un.a_val; \ - break; \ - } \ - case AT_L2_CACHESHAPE: \ - { \ - long *cls = __libc_alpha_cache_shape; \ - if (cls != NULL) \ - cls[2] = av->a_un.a_val; \ - break; \ - } \ - case AT_L3_CACHESHAPE: \ - { \ - long *cls = __libc_alpha_cache_shape; \ - if (cls != NULL) \ - cls[3] = av->a_un.a_val; \ - break; \ - } - +#include "dl-auxv.h" #include <sysdeps/unix/sysv/linux/dl-sysdep.c> diff --git a/sysdeps/unix/sysv/linux/alpha/fpu/Implies b/sysdeps/unix/sysv/linux/alpha/fpu/Implies new file mode 100644 index 0000000000..d76f511c2e --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/fpu/Implies @@ -0,0 +1,2 @@ +# Override ldbl-opt with alpha specific routines. +alpha/fpu diff --git a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S index 48c3f271c7..6863c07ec1 100644 --- a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S +++ b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S @@ -20,6 +20,19 @@ /* sigsuspend is a special syscall since it needs to dereference the sigset. This will have to change when we have more than 64 signals. */ +#ifndef NO_CANCELLATION +#include <sysdep.h> + +#undef PSEUDO_PREPARE_ARGS +#define PSEUDO_PREPARE_ARGS ldq a0, 0(a0); + +PSEUDO(__sigsuspend_nocancel, sigsuspend, 1) + ret +/* Use END, not PSEUDO_END, so that we don't issue two $syscall_error + symbols; we'll jump into __sigsuspend for the error case. */ +END(__sigsuspend_nocancel) +#endif /* NO_CANCELLATION */ + #include <sysdep-cancel.h> #undef PSEUDO_PREPARE_ARGS diff --git a/sysdeps/unix/sysv/linux/alpha/sysconf.c b/sysdeps/unix/sysv/linux/alpha/sysconf.c index 2bbaf1f364..3e5b4ee85f 100644 --- a/sysdeps/unix/sysv/linux/alpha/sysconf.c +++ b/sysdeps/unix/sysv/linux/alpha/sysconf.c @@ -27,7 +27,7 @@ static long int linux_sysconf (int name); #define CSHAPE(totalsize, linesize, assoc) \ ((totalsize & ~0xff) | (linesize << 4) | assoc) -long __libc_alpha_cache_shape[4] = { -2, -2, -2, -2 }; +extern long __libc_alpha_cache_shape[4]; static inline unsigned long implver (void) diff --git a/sysdeps/unix/sysv/linux/bits/sigset.h b/sysdeps/unix/sysv/linux/bits/sigset.h index 7ccadda456..daec8ac494 100644 --- a/sysdeps/unix/sysv/linux/bits/sigset.h +++ b/sysdeps/unix/sysv/linux/bits/sigset.h @@ -1,5 +1,6 @@ /* __sig_atomic_t, __sigset_t, and related definitions. Linux version. - Copyright (C) 1991, 1992, 1994, 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1991, 1992, 1994, 1996, 1997, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -43,7 +44,7 @@ typedef struct # define _SIGSET_H_fns 1 # ifndef _EXTERN_INLINE -# define _EXTERN_INLINE extern __inline +# define _EXTERN_INLINE __extern_inline # endif /* Return a mask that includes the bit for SIG only. */ diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h index 356a2ece74..377f589bbd 100644 --- a/sysdeps/unix/sysv/linux/bits/socket.h +++ b/sysdeps/unix/sysv/linux/bits/socket.h @@ -1,5 +1,6 @@ /* System-specific socket constants and types. Linux version. - Copyright (C) 1991,1992,1994-2001,2004,2006 Free Software Foundation, Inc. + Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -264,7 +265,7 @@ extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) __THROW; #ifdef __USE_EXTERN_INLINES # ifndef _EXTERN_INLINE -# define _EXTERN_INLINE extern __inline +# define _EXTERN_INLINE __extern_inline # endif _EXTERN_INLINE struct cmsghdr * __NTH (__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg)) diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c index ebe4d699b1..2b6c158226 100644 --- a/sysdeps/unix/sysv/linux/check_pf.c +++ b/sysdeps/unix/sysv/linux/check_pf.c @@ -1,5 +1,5 @@ /* Determine protocol families for which interfaces exist. Linux version. - Copyright (C) 2003, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -68,17 +68,38 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, memset (&nladdr, '\0', sizeof (nladdr)); nladdr.nl_family = AF_NETLINK; +#ifdef PAGE_SIZE + /* Help the compiler optimize out the malloc call if PAGE_SIZE + is constant and smaller or equal to PTHREAD_STACK_MIN/4. */ + const size_t buf_size = PAGE_SIZE; +#else + const size_t buf_size = __getpagesize (); +#endif + bool use_malloc = false; + char *buf; + + if (__libc_use_alloca (buf_size)) + buf = alloca (buf_size); + else + { + buf = malloc (buf_size); + if (buf != NULL) + use_malloc = true; + else + goto out_fail; + } + + struct iovec iov = { buf, buf_size }; + if (TEMP_FAILURE_RETRY (__sendto (fd, (void *) &req, sizeof (req), 0, (struct sockaddr *) &nladdr, sizeof (nladdr))) < 0) - return -1; + goto out_fail; *seen_ipv4 = false; *seen_ipv6 = false; bool done = false; - char buf[4096]; - struct iovec iov = { buf, sizeof (buf) }; struct in6ailist { struct in6addrinfo info; @@ -98,10 +119,10 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, ssize_t read_len = TEMP_FAILURE_RETRY (__recvmsg (fd, &msg, 0)); if (read_len < 0) - return -1; + goto out_fail; if (msg.msg_flags & MSG_TRUNC) - return -1; + goto out_fail; struct nlmsghdr *nlmh; for (nlmh = (struct nlmsghdr *) buf; @@ -183,7 +204,7 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, { *in6ai = malloc (in6ailistlen * sizeof (**in6ai)); if (*in6ai == NULL) - return -1; + goto out_fail; *in6ailen = in6ailistlen; @@ -195,6 +216,13 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, while (in6ailist != NULL); } + if (use_malloc) + free (buf); + return 0; + +out_fail: + if (use_malloc) + free (buf); return 0; } diff --git a/sysdeps/unix/sysv/linux/ifaddrs.c b/sysdeps/unix/sysv/linux/ifaddrs.c index 82495de03e..02e6935538 100644 --- a/sysdeps/unix/sysv/linux/ifaddrs.c +++ b/sysdeps/unix/sysv/linux/ifaddrs.c @@ -1,5 +1,5 @@ /* getifaddrs -- get names and addresses of all network interfaces - Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -122,36 +122,36 @@ int __netlink_request (struct netlink_handle *h, int type) { struct netlink_res *nlm_next; - struct netlink_res **new_nlm_list; - static volatile size_t buf_size = 4096; - char *buf; struct sockaddr_nl nladdr; struct nlmsghdr *nlmh; ssize_t read_len; bool done = false; - bool use_malloc = false; - if (__netlink_sendreq (h, type) < 0) - return -1; +#ifdef PAGE_SIZE + /* Help the compiler optimize out the malloc call if PAGE_SIZE + is constant and smaller or equal to PTHREAD_STACK_MIN/4. */ + const size_t buf_size = PAGE_SIZE; +#else + const size_t buf_size = __getpagesize (); +#endif + bool use_malloc = false; + char *buf; - size_t this_buf_size = buf_size; - if (__libc_use_alloca (this_buf_size)) - buf = alloca (this_buf_size); + if (__libc_use_alloca (buf_size)) + buf = alloca (buf_size); else { - buf = malloc (this_buf_size); + buf = malloc (buf_size); if (buf != NULL) use_malloc = true; else goto out_fail; } - struct iovec iov = { buf, this_buf_size }; + struct iovec iov = { buf, buf_size }; - if (h->nlm_list != NULL) - new_nlm_list = &h->end_ptr->next; - else - new_nlm_list = &h->nlm_list; + if (__netlink_sendreq (h, type) < 0) + goto out_fail; while (! done) { @@ -171,48 +171,7 @@ __netlink_request (struct netlink_handle *h, int type) continue; if (__builtin_expect (msg.msg_flags & MSG_TRUNC, 0)) - { - if (this_buf_size >= SIZE_MAX / 2) - goto out_fail; - - nlm_next = *new_nlm_list; - while (nlm_next != NULL) - { - struct netlink_res *tmpptr; - - tmpptr = nlm_next->next; - free (nlm_next); - nlm_next = tmpptr; - } - *new_nlm_list = NULL; - - if (__libc_use_alloca (2 * this_buf_size)) - buf = extend_alloca (buf, this_buf_size, 2 * this_buf_size); - else - { - this_buf_size *= 2; - - char *new_buf = realloc (use_malloc ? buf : NULL, this_buf_size); - if (new_buf == NULL) - goto out_fail; - new_buf = buf; - - use_malloc = true; - } - buf_size = this_buf_size; - - iov.iov_base = buf; - iov.iov_len = this_buf_size; - - /* Increase sequence number, so that we can distinguish - between old and new request messages. */ - h->seq++; - - if (__netlink_sendreq (h, type) < 0) - goto out_fail; - - continue; - } + goto out_fail; size_t count = 0; size_t remaining_len = read_len; diff --git a/sysdeps/unix/sysv/linux/posix_madvise.c b/sysdeps/unix/sysv/linux/posix_madvise.c new file mode 100644 index 0000000000..880b17ef31 --- /dev/null +++ b/sysdeps/unix/sysv/linux/posix_madvise.c @@ -0,0 +1,38 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <sys/mman.h> + + +int +posix_madvise (void *addr, size_t len, int advice) +{ + /* We have one problem: the kernel's MADV_DONTNEED does not + correspond to POSIX's POSIX_MADV_DONTNEED. The former simply + discards changes made to the memory without writing it back to + disk, if this would be necessary. The POSIX behavior does not + allow this. There is no functionality mapping the POSIX behavior + so far so we ignore that advice for now. */ + if (advice == POSIX_MADV_DONTNEED) + return 0; + + INTERNAL_SYSCALL_DECL (err); + int result = INTERNAL_SYSCALL (madvise, err, 3, addr, len, advice); + return INTERNAL_SYSCALL_ERRNO (result, err); +} diff --git a/sysdeps/unix/sysv/linux/sh/Makefile b/sysdeps/unix/sysv/linux/sh/Makefile index 6d72cb0294..c1b436a6fb 100644 --- a/sysdeps/unix/sysv/linux/sh/Makefile +++ b/sysdeps/unix/sysv/linux/sh/Makefile @@ -2,10 +2,6 @@ ifeq ($(subdir),io) sysdep_routines += pipe endif -ifeq ($(subdir),misc) -sysdep_headers += sys/io.h -endif - ifeq ($(subdir),stdlib) gen-as-const-headers += ucontext_i.sym endif diff --git a/sysdeps/unix/sysv/linux/sys/sysmacros.h b/sysdeps/unix/sysv/linux/sys/sysmacros.h index 179642ff40..e59672980e 100644 --- a/sysdeps/unix/sysv/linux/sys/sysmacros.h +++ b/sysdeps/unix/sysv/linux/sys/sysmacros.h @@ -1,5 +1,6 @@ /* Definitions of macros to access `dev_t' values. - Copyright (C) 1996, 1997, 1999, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1999, 2003, 2004, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -27,30 +28,30 @@ they need. */ #ifdef __GLIBC_HAVE_LONG_LONG __extension__ -extern __inline unsigned int gnu_dev_major (unsigned long long int __dev) +__extern_inline unsigned int gnu_dev_major (unsigned long long int __dev) __THROW; __extension__ -extern __inline unsigned int gnu_dev_minor (unsigned long long int __dev) +__extern_inline unsigned int gnu_dev_minor (unsigned long long int __dev) __THROW; __extension__ -extern __inline unsigned long long int gnu_dev_makedev (unsigned int __major, +__extern_inline unsigned long long int gnu_dev_makedev (unsigned int __major, unsigned int __minor) __THROW; # if defined __GNUC__ && __GNUC__ >= 2 -__extension__ extern __inline unsigned int +__extension__ __extern_inline unsigned int __NTH (gnu_dev_major (unsigned long long int __dev)) { return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff); } -__extension__ extern __inline unsigned int +__extension__ __extern_inline unsigned int __NTH (gnu_dev_minor (unsigned long long int __dev)) { return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff); } -__extension__ extern __inline unsigned long long int +__extension__ __extern_inline unsigned long long int __NTH (gnu_dev_makedev (unsigned int __major, unsigned int __minor)) { return ((__minor & 0xff) | ((__major & 0xfff) << 8) diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 5776673733..38103f0c68 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -32,7 +32,6 @@ ioperm - ioperm i:iii ioperm iopl - iopl i:i iopl klogctl EXTRA syslog i:isi klogctl lchown - lchown i:sii __lchown lchown -posix_madvise - madvise Vi:pii posix_madvise madvise - madvise i:pii madvise mincore - mincore i:anV mincore mlock - mlock i:bn mlock diff --git a/sysdeps/x86_64/fpu/bits/mathinline.h b/sysdeps/x86_64/fpu/bits/mathinline.h index 39d11b678d..d08a9b033b 100644 --- a/sysdeps/x86_64/fpu/bits/mathinline.h +++ b/sysdeps/x86_64/fpu/bits/mathinline.h @@ -1,5 +1,5 @@ /* Inline math functions for x86-64. - Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger <aj@suse.de>, 2002. @@ -25,7 +25,7 @@ #ifdef __cplusplus # define __MATH_INLINE __inline #else -# define __MATH_INLINE extern __inline +# define __MATH_INLINE __extern_inline #endif diff --git a/sysdeps/x86_64/fpu/e_log10l.S b/sysdeps/x86_64/fpu/e_log10l.S index b4343bef45..633234b744 100644 --- a/sysdeps/x86_64/fpu/e_log10l.S +++ b/sysdeps/x86_64/fpu/e_log10l.S @@ -42,7 +42,7 @@ ENTRY(__ieee754_log10l) fxam fnstsw fld %st // x : x : log10(2) - andb $1,%ah + testb $1, %ah jnz 3f // in case x is NaN or ħInf 4: fsubl MO(one) // x-1 : x : log10(2) fld %st // x-1 : x-1 : x : log10(2) @@ -59,7 +59,8 @@ ENTRY(__ieee754_log10l) fyl2x // log10(x) ret -3: jp 4b // in case x is ħInf +3: testb $4, %ah + jnz 4b // in case x is ħInf fstp %st(1) fstp %st(1) ret diff --git a/sysdeps/x86_64/fpu/e_log2l.S b/sysdeps/x86_64/fpu/e_log2l.S index 7a89b94d9f..f04d30a05a 100644 --- a/sysdeps/x86_64/fpu/e_log2l.S +++ b/sysdeps/x86_64/fpu/e_log2l.S @@ -39,7 +39,7 @@ ENTRY(__ieee754_log2l) fxam fnstsw fld %st // x : x : 1 - andb $1,%ah + testb $1, %ah jnz 3f // in case x is NaN or ħInf 4: fsub %st(2), %st // x-1 : x : 1 fld %st // x-1 : x-1 : x : 1 @@ -56,7 +56,8 @@ ENTRY(__ieee754_log2l) fyl2x // log(x) ret -3: jp 4b // in case x is ħInf +3: testb $4, %ah + jnz 4b // in case x is ħInf fstp %st(1) fstp %st(1) ret diff --git a/sysdeps/x86_64/fpu/e_logl.S b/sysdeps/x86_64/fpu/e_logl.S index a0bed663c8..2ba91eedfd 100644 --- a/sysdeps/x86_64/fpu/e_logl.S +++ b/sysdeps/x86_64/fpu/e_logl.S @@ -38,8 +38,12 @@ limit: .double 0.29 ENTRY(__ieee754_logl) fldln2 // log(2) fldt 8(%rsp) // x : log(2) + fxam + fnstsw fld %st // x : x : log(2) - fsubl MO(one) // x-1 : x : log(2) + testb $1, %ah + jnz 3f // in case x is NaN or +-Inf +4: fsubl MO(one) // x-1 : x : log(2) fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) @@ -53,4 +57,10 @@ ENTRY(__ieee754_logl) 2: fstp %st(0) // x : log(2) fyl2x // log(x) ret + +3: testb $4, %ah + jnz 4b // in case x is +-Inf + fstp %st(1) + fstp %st(1) + ret END (__ieee754_logl) diff --git a/sysdeps/x86_64/fpu/e_powl.S b/sysdeps/x86_64/fpu/e_powl.S index 85f4deb3c7..4959bea7ac 100644 --- a/sysdeps/x86_64/fpu/e_powl.S +++ b/sysdeps/x86_64/fpu/e_powl.S @@ -1,5 +1,6 @@ /* ix87 specific implementation of pow function. - Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -146,10 +147,11 @@ ENTRY(__ieee754_powl) 2: /* y is a real number. */ fxch // x : y fldl MO(one) // 1.0 : x : y - fld %st(1) // x : 1.0 : x : y - fsub %st(1) // x-1 : 1.0 : x : y - fabs // |x-1| : 1.0 : x : y - fcompl MO(limit) // 1.0 : x : y + fldl MO(limit) // 0.29 : 1.0 : x : y + fld %st(2) // x : 0.29 : 1.0 : x : y + fsub %st(2) // x-1 : 0.29 : 1.0 : x : y + fabs // |x-1| : 0.29 : 1.0 : x : y + fucompp // 1.0 : x : y fnstsw fxch // x : 1.0 : y test $4500,%eax @@ -190,9 +192,10 @@ ENTRY(__ieee754_powl) // y == ħinf .align ALIGNARG(4) 12: fstp %st(0) // pop y - fldt 8(%rsp) // x - fabs - fcompl MO(one) // < 1, == 1, or > 1 + fldl MO(one) // 1 + fldt 8(%rsp) // x : 1 + fabs // abs(x) : 1 + fucompp // < 1, == 1, or > 1 fnstsw andb $0x45, %ah cmpb $0x45, %ah diff --git a/sysdeps/x86_64/fpu/s_log1pl.S b/sysdeps/x86_64/fpu/s_log1pl.S index 7fbd0e5aaa..ac2bd22a4f 100644 --- a/sysdeps/x86_64/fpu/s_log1pl.S +++ b/sysdeps/x86_64/fpu/s_log1pl.S @@ -45,7 +45,7 @@ ENTRY(__log1pl) fxam fnstsw fld %st - andb $1,%ah + testb $1, %ah jnz 3f // in case x is NaN or ħInf 4: fabs @@ -62,7 +62,8 @@ ENTRY(__log1pl) 2: fyl2xp1 ret -3: jp 4b // in case x is ħInf +3: testb $4, %ah + jnz 4b // in case x is ħInf fstp %st(1) fstp %st(1) ret |