summaryrefslogtreecommitdiff
path: root/libc/sysdeps
diff options
context:
space:
mode:
authorjoseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d>2012-06-18 13:44:49 +0000
committerjoseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d>2012-06-18 13:44:49 +0000
commit72c5cff8f745e77d8c84e826db2b3944414b9467 (patch)
tree06bc664d1dffaeb92e28b36d1afd55171a16dfb4 /libc/sysdeps
parent4076561cfa2a537917b2d6a38e337a4217b623a7 (diff)
downloadeglibc2-72c5cff8f745e77d8c84e826db2b3944414b9467.tar.gz
Merge changes between r19077 and r19162 from /fsf/trunk.
git-svn-id: svn://svn.eglibc.org/trunk@19163 7b3dc134-2b1b-0410-93df-9e9f96275f8d
Diffstat (limited to 'libc/sysdeps')
-rw-r--r--libc/sysdeps/ieee754/dbl-64/e_pow.c4
-rw-r--r--libc/sysdeps/x86/fpu/bits/mathinline.h (renamed from libc/sysdeps/i386/fpu/bits/mathinline.h)495
-rw-r--r--libc/sysdeps/x86_64/fpu/bits/mathinline.h289
-rw-r--r--libc/sysdeps/x86_64/strtok.S17
4 files changed, 375 insertions, 430 deletions
diff --git a/libc/sysdeps/ieee754/dbl-64/e_pow.c b/libc/sysdeps/ieee754/dbl-64/e_pow.c
index 6c41af93b..3fd5e6507 100644
--- a/libc/sysdeps/ieee754/dbl-64/e_pow.c
+++ b/libc/sysdeps/ieee754/dbl-64/e_pow.c
@@ -112,12 +112,12 @@ __ieee754_pow(double x, double y) {
if (((v.i[HIGH_HALF] & 0x7fffffff) == 0x7ff00000 && v.i[LOW_HALF] != 0)
|| (v.i[HIGH_HALF] & 0x7fffffff) > 0x7ff00000)
return y;
- if (ABS(y) > 1.0e20) return (y>0)?0:1.0/ABS(x);
+ if (ABS(y) > 1.0e20) return (y>0)?0:1.0/0.0;
k = checkint(y);
if (k == -1)
return y < 0 ? 1.0/x : x;
else
- return y < 0 ? 1.0/ABS(x) : 0.0; /* return 0 */
+ return y < 0 ? 1.0/0.0 : 0.0; /* return 0 */
}
qx = u.i[HIGH_HALF]&0x7fffffff; /* no sign */
diff --git a/libc/sysdeps/i386/fpu/bits/mathinline.h b/libc/sysdeps/x86/fpu/bits/mathinline.h
index 2a7e96ba3..6446b1d87 100644
--- a/libc/sysdeps/i386/fpu/bits/mathinline.h
+++ b/libc/sysdeps/x86/fpu/bits/mathinline.h
@@ -1,7 +1,6 @@
-/* Inline math functions for i387.
+/* Inline math functions for i387 and SSE.
Copyright (C) 1995-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by John C. Bowman <bowman@math.ualberta.ca>, 1995.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -21,10 +20,10 @@
# error "Never use <bits/mathinline.h> directly; include <math.h> instead."
#endif
-#ifndef __extern_inline
+#ifndef __extern_always_inline
# define __MATH_INLINE __inline
#else
-# define __MATH_INLINE __extern_inline
+# define __MATH_INLINE __extern_always_inline
#endif
@@ -121,18 +120,32 @@
/* The gcc, version 2.7 or below, has problems with all this inlining
code. So disable it for this version of the compiler. */
# if __GNUC_PREREQ (2, 8)
+__BEGIN_NAMESPACE_C99
+
/* Test for negative number. Used in the signbit() macro. */
__MATH_INLINE int
__NTH (__signbitf (float __x))
{
+# ifdef __SSE2_MATH__
+ int __m;
+ __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
+ return (__m & 0x8) != 0;
+# else
__extension__ union { float __f; int __i; } __u = { __f: __x };
return __u.__i < 0;
+# endif
}
__MATH_INLINE int
__NTH (__signbit (double __x))
{
+# ifdef __SSE2_MATH__
+ int __m;
+ __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
+ return (__m & 0x80) != 0;
+# else
__extension__ union { double __d; int __i[2]; } __u = { __d: __x };
return __u.__i[1] < 0;
+# endif
}
__MATH_INLINE int
__NTH (__signbitl (long double __x))
@@ -140,6 +153,8 @@ __NTH (__signbitl (long double __x))
__extension__ union { long double __l; int __i[3]; } __u = { __l: __x };
return (__u.__i[2] & 0x8000) != 0;
}
+
+__END_NAMESPACE_C99
# endif
#endif
@@ -147,13 +162,233 @@ __NTH (__signbitl (long double __x))
/* The gcc, version 2.7 or below, has problems with all this inlining
code. So disable it for this version of the compiler. */
#if __GNUC_PREREQ (2, 8)
+# if !__GNUC_PREREQ (3, 4) && !defined __NO_MATH_INLINES \
+ && defined __OPTIMIZE__
+/* GCC 3.4 introduced builtins for all functions below, so
+ there's no need to define any of these inline functions. */
+
+# ifdef __USE_ISOC99
+__BEGIN_NAMESPACE_C99
+
+/* Round to nearest integer. */
+# ifdef __SSE_MATH__
+__MATH_INLINE long int
+__NTH (lrintf (float __x))
+{
+ long int __res;
+ /* Mark as volatile since the result is dependent on the state of
+ the SSE control register (the rounding mode). Otherwise GCC might
+ remove these assembler instructions since it does not know about
+ the rounding mode change and cannot currently be told. */
+ __asm __volatile__ ("cvtss2si %1, %0" : "=r" (__res) : "xm" (__x));
+ return __res;
+}
+# endif
+# ifdef __SSE2_MATH__
+__MATH_INLINE long int
+__NTH (lrint (double __x))
+{
+ long int __res;
+ /* Mark as volatile since the result is dependent on the state of
+ the SSE control register (the rounding mode). Otherwise GCC might
+ remove these assembler instructions since it does not know about
+ the rounding mode change and cannot currently be told. */
+ __asm __volatile__ ("cvtsd2si %1, %0" : "=r" (__res) : "xm" (__x));
+ return __res;
+}
+# endif
+# ifdef __x86_64__
+__MATH_INLINE long long int
+__NTH (llrintf (float __x))
+{
+ long long int __res;
+ /* Mark as volatile since the result is dependent on the state of
+ the SSE control register (the rounding mode). Otherwise GCC might
+ remove these assembler instructions since it does not know about
+ the rounding mode change and cannot currently be told. */
+ __asm __volatile__ ("cvtss2si %1, %0" : "=r" (__res) : "xm" (__x));
+ return __res;
+}
+__MATH_INLINE long long int
+__NTH (llrint (double __x))
+{
+ long long int __res;
+ /* Mark as volatile since the result is dependent on the state of
+ the SSE control register (the rounding mode). Otherwise GCC might
+ remove these assembler instructions since it does not know about
+ the rounding mode change and cannot currently be told. */
+ __asm __volatile__ ("cvtsd2si %1, %0" : "=r" (__res) : "xm" (__x));
+ return __res;
+}
+# endif
+
+# if defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0 \
+ && defined __SSE2_MATH__
+/* Determine maximum of two values. */
+__MATH_INLINE float
+__NTH (fmaxf (float __x, float __y))
+{
+# ifdef __AVX__
+ float __res;
+ __asm ("vmaxss %2, %1, %0" : "=x" (__res) : "x" (x), "xm" (__y));
+ return __res;
+# else
+ __asm ("maxss %1, %0" : "+x" (__x) : "xm" (__y));
+ return __x;
+# endif
+}
+__MATH_INLINE double
+__NTH (fmax (double __x, double __y))
+{
+# ifdef __AVX__
+ float __res;
+ __asm ("vmaxsd %2, %1, %0" : "=x" (__res) : "x" (x), "xm" (__y));
+ return __res;
+# else
+ __asm ("maxsd %1, %0" : "+x" (__x) : "xm" (__y));
+ return __x;
+# endif
+}
+
+/* Determine minimum of two values. */
+__MATH_INLINE float
+__NTH (fminf (float __x, float __y))
+{
+# ifdef __AVX__
+ float __res;
+ __asm ("vminss %2, %1, %0" : "=x" (__res) : "x" (x), "xm" (__y));
+ return __res;
+# else
+ __asm ("minss %1, %0" : "+x" (__x) : "xm" (__y));
+ return __x;
+# endif
+}
+__MATH_INLINE double
+__NTH (fmin (double __x, double __y))
+{
+# ifdef __AVX__
+ float __res;
+ __asm ("vminsd %2, %1, %0" : "=x" (__res) : "x" (x), "xm" (__y));
+ return __res;
+# else
+ __asm ("minsd %1, %0" : "+x" (__x) : "xm" (__y));
+ return __x;
+# endif
+}
+# endif
+
+__END_NAMESPACE_C99
+# endif
+
+# if defined __SSE4_1__ && defined __SSE2_MATH__
+# if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
+__BEGIN_NAMESPACE_C99
+
+/* Round to nearest integer. */
+__MATH_INLINE double
+__NTH (rint (double __x))
+{
+ double __res;
+ /* Mark as volatile since the result is dependent on the state of
+ the SSE control register (the rounding mode). Otherwise GCC might
+ remove these assembler instructions since it does not know about
+ the rounding mode change and cannot currently be told. */
+ __asm __volatile__ ("roundsd $4, %1, %0" : "=x" (__res) : "xm" (__x));
+ return __res;
+}
+__MATH_INLINE float
+__NTH (rintf (float __x))
+{
+ float __res;
+ /* Mark as volatile since the result is dependent on the state of
+ the SSE control register (the rounding mode). Otherwise GCC might
+ remove these assembler instructions since it does not know about
+ the rounding mode change and cannot currently be told. */
+ __asm __volatile__ ("roundss $4, %1, %0" : "=x" (__res) : "xm" (__x));
+ return __res;
+}
+
+# ifdef __USE_ISOC99
+/* Round to nearest integer without raising inexact exception. */
+__MATH_INLINE double
+__NTH (nearbyint (double __x))
+{
+ double __res;
+ /* Mark as volatile since the result is dependent on the state of
+ the SSE control register (the rounding mode). Otherwise GCC might
+ remove these assembler instructions since it does not know about
+ the rounding mode change and cannot currently be told. */
+ __asm __volatile__ ("roundsd $0xc, %1, %0" : "=x" (__res) : "xm" (__x));
+ return __res;
+}
+__MATH_INLINE float
+__NTH (nearbyintf (float __x))
+{
+ float __res;
+ /* Mark as volatile since the result is dependent on the state of
+ the SSE control register (the rounding mode). Otherwise GCC might
+ remove these assembler instructions since it does not know about
+ the rounding mode change and cannot currently be told. */
+ __asm __volatile__ ("roundss $0xc, %1, %0" : "=x" (__res) : "xm" (__x));
+ return __res;
+}
+# endif
+
+__END_NAMESPACE_C99
+# endif
+
+__BEGIN_NAMESPACE_STD
+/* Smallest integral value not less than X. */
+__MATH_INLINE double
+__NTH (ceil (double __x))
+{
+ double __res;
+ __asm ("roundsd $2, %1, %0" : "=x" (__res) : "xm" (__x));
+ return __res;
+}
+__END_NAMESPACE_STD
+
+__BEGIN_NAMESPACE_C99
+__MATH_INLINE float
+__NTH (ceilf (float __x))
+{
+ float __res;
+ __asm ("roundss $2, %1, %0" : "=x" (__res) : "xm" (__x));
+ return __res;
+}
+__END_NAMESPACE_C99
-#if ((!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) \
+__BEGIN_NAMESPACE_STD
+/* Largest integer not greater than X. */
+__MATH_INLINE double
+__NTH (floor (double __x))
+{
+ double __res;
+ __asm ("roundsd $1, %1, %0" : "=x" (__res) : "xm" (__x));
+ return __res;
+}
+__END_NAMESPACE_STD
+
+__BEGIN_NAMESPACE_C99
+__MATH_INLINE float
+__NTH (floorf (float __x))
+{
+ float __res;
+ __asm ("roundss $1, %1, %0" : "=x" (__res) : "xm" (__x));
+ return __res;
+}
+__END_NAMESPACE_C99
+# endif
+# endif
+#endif
+
+#ifndef __x86_64__
+# if ((!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) \
&& defined __OPTIMIZE__)
/* The inline functions do not set errno or raise necessarily the
correct exceptions. */
-# undef math_errhandling
+# undef math_errhandling
/* A macro to define float, double, and long double versions of various
math functions for the ix87 FPU. FUNC is the function name (which will
@@ -162,49 +397,49 @@ __NTH (__signbitl (long double __x))
We define two sets of macros. The set with the additional NP
doesn't add a prototype declaration. */
-#if defined __USE_MISC || defined __USE_ISOC99
-# define __inline_mathop(func, op) \
+# if defined __USE_MISC || defined __USE_ISOC99
+# define __inline_mathop(func, op) \
__inline_mathop_ (double, func, op) \
__inline_mathop_ (float, __CONCAT(func,f), op) \
__inline_mathop_ (long double, __CONCAT(func,l), op)
-# define __inline_mathopNP(func, op) \
+# define __inline_mathopNP(func, op) \
__inline_mathopNP_ (double, func, op) \
__inline_mathopNP_ (float, __CONCAT(func,f), op) \
__inline_mathopNP_ (long double, __CONCAT(func,l), op)
-#else
-# define __inline_mathop(func, op) \
+# else
+# define __inline_mathop(func, op) \
__inline_mathop_ (double, func, op)
-# define __inline_mathopNP(func, op) \
+# define __inline_mathopNP(func, op) \
__inline_mathopNP_ (double, func, op)
-#endif
+# endif
-#define __inline_mathop_(float_type, func, op) \
+# define __inline_mathop_(float_type, func, op) \
__inline_mathop_decl_ (float_type, func, op, "0" (__x))
-#define __inline_mathopNP_(float_type, func, op) \
+# define __inline_mathopNP_(float_type, func, op) \
__inline_mathop_declNP_ (float_type, func, op, "0" (__x))
-#if defined __USE_MISC || defined __USE_ISOC99
-# define __inline_mathop_decl(func, op, params...) \
+# if defined __USE_MISC || defined __USE_ISOC99
+# define __inline_mathop_decl(func, op, params...) \
__inline_mathop_decl_ (double, func, op, params) \
__inline_mathop_decl_ (float, __CONCAT(func,f), op, params) \
__inline_mathop_decl_ (long double, __CONCAT(func,l), op, params)
-# define __inline_mathop_declNP(func, op, params...) \
+# define __inline_mathop_declNP(func, op, params...) \
__inline_mathop_declNP_ (double, func, op, params) \
__inline_mathop_declNP_ (float, __CONCAT(func,f), op, params) \
__inline_mathop_declNP_ (long double, __CONCAT(func,l), op, params)
-#else
-# define __inline_mathop_decl(func, op, params...) \
+# else
+# define __inline_mathop_decl(func, op, params...) \
__inline_mathop_decl_ (double, func, op, params)
-# define __inline_mathop_declNP(func, op, params...) \
+# define __inline_mathop_declNP(func, op, params...) \
__inline_mathop_declNP_ (double, func, op, params)
-#endif
+# endif
-#define __inline_mathop_decl_(float_type, func, op, params...) \
+# define __inline_mathop_decl_(float_type, func, op, params...) \
__MATH_INLINE float_type func (float_type) __THROW; \
__inline_mathop_declNP_ (float_type, func, op, params)
-#define __inline_mathop_declNP_(float_type, func, op, params...) \
+# define __inline_mathop_declNP_(float_type, func, op, params...) \
__MATH_INLINE float_type __NTH (func (float_type __x)) \
{ \
register float_type __result; \
@@ -213,87 +448,87 @@ __NTH (__signbitl (long double __x))
}
-#if defined __USE_MISC || defined __USE_ISOC99
-# define __inline_mathcode(func, arg, code) \
+# if defined __USE_MISC || defined __USE_ISOC99
+# define __inline_mathcode(func, arg, code) \
__inline_mathcode_ (double, func, arg, code) \
__inline_mathcode_ (float, __CONCAT(func,f), arg, code) \
__inline_mathcode_ (long double, __CONCAT(func,l), arg, code)
-# define __inline_mathcodeNP(func, arg, code) \
+# define __inline_mathcodeNP(func, arg, code) \
__inline_mathcodeNP_ (double, func, arg, code) \
__inline_mathcodeNP_ (float, __CONCAT(func,f), arg, code) \
__inline_mathcodeNP_ (long double, __CONCAT(func,l), arg, code)
-# define __inline_mathcode2(func, arg1, arg2, code) \
+# define __inline_mathcode2(func, arg1, arg2, code) \
__inline_mathcode2_ (double, func, arg1, arg2, code) \
__inline_mathcode2_ (float, __CONCAT(func,f), arg1, arg2, code) \
__inline_mathcode2_ (long double, __CONCAT(func,l), arg1, arg2, code)
-# define __inline_mathcodeNP2(func, arg1, arg2, code) \
+# define __inline_mathcodeNP2(func, arg1, arg2, code) \
__inline_mathcodeNP2_ (double, func, arg1, arg2, code) \
__inline_mathcodeNP2_ (float, __CONCAT(func,f), arg1, arg2, code) \
__inline_mathcodeNP2_ (long double, __CONCAT(func,l), arg1, arg2, code)
-# define __inline_mathcode3(func, arg1, arg2, arg3, code) \
+# define __inline_mathcode3(func, arg1, arg2, arg3, code) \
__inline_mathcode3_ (double, func, arg1, arg2, arg3, code) \
__inline_mathcode3_ (float, __CONCAT(func,f), arg1, arg2, arg3, code) \
__inline_mathcode3_ (long double, __CONCAT(func,l), arg1, arg2, arg3, code)
-# define __inline_mathcodeNP3(func, arg1, arg2, arg3, code) \
+# define __inline_mathcodeNP3(func, arg1, arg2, arg3, code) \
__inline_mathcodeNP3_ (double, func, arg1, arg2, arg3, code) \
__inline_mathcodeNP3_ (float, __CONCAT(func,f), arg1, arg2, arg3, code) \
__inline_mathcodeNP3_ (long double, __CONCAT(func,l), arg1, arg2, arg3, code)
-#else
-# define __inline_mathcode(func, arg, code) \
+# else
+# define __inline_mathcode(func, arg, code) \
__inline_mathcode_ (double, func, (arg), code)
-# define __inline_mathcodeNP(func, arg, code) \
+# define __inline_mathcodeNP(func, arg, code) \
__inline_mathcodeNP_ (double, func, (arg), code)
-# define __inline_mathcode2(func, arg1, arg2, code) \
+# define __inline_mathcode2(func, arg1, arg2, code) \
__inline_mathcode2_ (double, func, arg1, arg2, code)
-# define __inline_mathcodeNP2(func, arg1, arg2, code) \
+# define __inline_mathcodeNP2(func, arg1, arg2, code) \
__inline_mathcodeNP2_ (double, func, arg1, arg2, code)
-# define __inline_mathcode3(func, arg1, arg2, arg3, code) \
+# define __inline_mathcode3(func, arg1, arg2, arg3, code) \
__inline_mathcode3_ (double, func, arg1, arg2, arg3, code)
-# define __inline_mathcodeNP3(func, arg1, arg2, arg3, code) \
+# define __inline_mathcodeNP3(func, arg1, arg2, arg3, code) \
__inline_mathcodeNP3_ (double, func, arg1, arg2, arg3, code)
-#endif
+# endif
-#define __inline_mathcode_(float_type, func, arg, code) \
+# define __inline_mathcode_(float_type, func, arg, code) \
__MATH_INLINE float_type func (float_type) __THROW; \
__inline_mathcodeNP_(float_type, func, arg, code)
-#define __inline_mathcodeNP_(float_type, func, arg, code) \
+# define __inline_mathcodeNP_(float_type, func, arg, code) \
__MATH_INLINE float_type __NTH (func (float_type arg)) \
{ \
code; \
}
-#define __inline_mathcode2_(float_type, func, arg1, arg2, code) \
+# define __inline_mathcode2_(float_type, func, arg1, arg2, code) \
__MATH_INLINE float_type func (float_type, float_type) __THROW; \
__inline_mathcodeNP2_ (float_type, func, arg1, arg2, code)
-#define __inline_mathcodeNP2_(float_type, func, arg1, arg2, code) \
+# define __inline_mathcodeNP2_(float_type, func, arg1, arg2, code) \
__MATH_INLINE float_type __NTH (func (float_type arg1, float_type arg2)) \
{ \
code; \
}
-#define __inline_mathcode3_(float_type, func, arg1, arg2, arg3, code) \
+# define __inline_mathcode3_(float_type, func, arg1, arg2, arg3, code) \
__MATH_INLINE float_type func (float_type, float_type, float_type) __THROW; \
__inline_mathcodeNP3_(float_type, func, arg1, arg2, arg3, code)
-#define __inline_mathcodeNP3_(float_type, func, arg1, arg2, arg3, code) \
+# define __inline_mathcodeNP3_(float_type, func, arg1, arg2, arg3, code) \
__MATH_INLINE float_type __NTH (func (float_type arg1, float_type arg2, \
float_type arg3)) \
{ \
code; \
}
-#endif
+# endif
-#if !defined __NO_MATH_INLINES && defined __OPTIMIZE__
-/* Miscellaneous functions */
+# if !defined __NO_MATH_INLINES && defined __OPTIMIZE__
+/* Miscellaneous functions */
/* __FAST_MATH__ is defined by gcc -ffast-math. */
-#ifdef __FAST_MATH__
-# ifdef __USE_GNU
-# define __sincos_code \
+# ifdef __FAST_MATH__
+# ifdef __USE_GNU
+# define __sincos_code \
register long double __cosr; \
register long double __sinr; \
register unsigned int __swtmp; \
@@ -333,19 +568,19 @@ __NTH (__sincosl (long double __x, long double *__sinx, long double *__cosx))
{
__sincos_code;
}
-# endif
+# endif
/* Optimized inline implementation, sometimes with reduced precision
and/or argument range. */
-# if __GNUC_PREREQ (3, 5)
-# define __expm1_code \
+# if __GNUC_PREREQ (3, 5)
+# define __expm1_code \
register long double __temp; \
__temp = __builtin_expm1l (__x); \
return __temp ? __temp : __x
-# else
-# define __expm1_code \
+# else
+# define __expm1_code \
register long double __value; \
register long double __exponent; \
register long double __temp; \
@@ -365,13 +600,13 @@ __NTH (__sincosl (long double __x, long double *__sinx, long double *__cosx))
__temp -= 1.0; \
__temp += __value; \
return __temp ? __temp : __x
-# endif
+# endif
__inline_mathcodeNP_ (long double, __expm1l, __x, __expm1_code)
-# if __GNUC_PREREQ (3, 4)
+# if __GNUC_PREREQ (3, 4)
__inline_mathcodeNP_ (long double, __expl, __x, return __builtin_expl (__x))
-# else
-# define __exp_code \
+# else
+# define __exp_code \
register long double __value; \
register long double __exponent; \
__asm __volatile__ \
@@ -390,10 +625,10 @@ __inline_mathcodeNP_ (long double, __expl, __x, return __builtin_expl (__x))
return __value
__inline_mathcodeNP (exp, __x, __exp_code)
__inline_mathcodeNP_ (long double, __expl, __x, __exp_code)
-# endif
+# endif
-# if !__GNUC_PREREQ (3, 5)
+# if !__GNUC_PREREQ (3, 5)
__inline_mathcodeNP (tan, __x, \
register long double __value; \
register long double __value2 __attribute__ ((__unused__)); \
@@ -401,28 +636,28 @@ __inline_mathcodeNP (tan, __x, \
("fptan" \
: "=t" (__value2), "=u" (__value) : "0" (__x)); \
return __value)
-# endif
-#endif /* __FAST_MATH__ */
+# endif
+# endif /* __FAST_MATH__ */
-#if __GNUC_PREREQ (3, 4)
+# if __GNUC_PREREQ (3, 4)
__inline_mathcodeNP2_ (long double, __atan2l, __y, __x,
return __builtin_atan2l (__y, __x))
-#else
-# define __atan2_code \
+# else
+# define __atan2_code \
register long double __value; \
__asm __volatile__ \
("fpatan" \
: "=t" (__value) : "0" (__x), "u" (__y) : "st(1)"); \
return __value
-# ifdef __FAST_MATH__
+# ifdef __FAST_MATH__
__inline_mathcodeNP2 (atan2, __y, __x, __atan2_code)
-# endif
+# endif
__inline_mathcodeNP2_ (long double, __atan2l, __y, __x, __atan2_code)
-#endif
+# endif
-#if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)
+# if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)
__inline_mathcodeNP2 (fmod, __x, __y, \
register long double __value; \
__asm __volatile__ \
@@ -432,52 +667,52 @@ __inline_mathcodeNP2 (fmod, __x, __y, \
"jp 1b" \
: "=t" (__value) : "0" (__x), "u" (__y) : "ax", "cc"); \
return __value)
-#endif
+# endif
-#ifdef __FAST_MATH__
-# if !__GNUC_PREREQ (3,3)
+# ifdef __FAST_MATH__
+# if !__GNUC_PREREQ (3,3)
__inline_mathopNP (sqrt, "fsqrt")
__inline_mathopNP_ (long double, __sqrtl, "fsqrt")
-# define __libc_sqrtl(n) __sqrtl (n)
-# else
-# define __libc_sqrtl(n) __builtin_sqrtl (n)
-# endif
-#endif
+# define __libc_sqrtl(n) __sqrtl (n)
+# else
+# define __libc_sqrtl(n) __builtin_sqrtl (n)
+# endif
+# endif
-#if __GNUC_PREREQ (2, 8)
+# if __GNUC_PREREQ (2, 8)
__inline_mathcodeNP_ (double, fabs, __x, return __builtin_fabs (__x))
-# if defined __USE_MISC || defined __USE_ISOC99
+# if defined __USE_MISC || defined __USE_ISOC99
__inline_mathcodeNP_ (float, fabsf, __x, return __builtin_fabsf (__x))
__inline_mathcodeNP_ (long double, fabsl, __x, return __builtin_fabsl (__x))
-# endif
+# endif
__inline_mathcodeNP_ (long double, __fabsl, __x, return __builtin_fabsl (__x))
-#else
+# else
__inline_mathop (fabs, "fabs")
__inline_mathop_ (long double, __fabsl, "fabs")
-#endif
+# endif
-#ifdef __FAST_MATH__
-# if !__GNUC_PREREQ (3, 4)
+# ifdef __FAST_MATH__
+# if !__GNUC_PREREQ (3, 4)
/* The argument range of this inline version is reduced. */
__inline_mathopNP (sin, "fsin")
/* The argument range of this inline version is reduced. */
__inline_mathopNP (cos, "fcos")
__inline_mathop_declNP (log, "fldln2; fxch; fyl2x", "0" (__x) : "st(1)")
-# endif
+# endif
-# if !__GNUC_PREREQ (3, 5)
+# if !__GNUC_PREREQ (3, 5)
__inline_mathop_declNP (log10, "fldlg2; fxch; fyl2x", "0" (__x) : "st(1)")
__inline_mathcodeNP (asin, __x, return __atan2l (__x, __libc_sqrtl (1.0 - __x * __x)))
__inline_mathcodeNP (acos, __x, return __atan2l (__libc_sqrtl (1.0 - __x * __x), __x))
-# endif
+# endif
-# if !__GNUC_PREREQ (3, 4)
+# if !__GNUC_PREREQ (3, 4)
__inline_mathop_declNP (atan, "fld1; fpatan", "0" (__x) : "st(1)")
-# endif
-#endif /* __FAST_MATH__ */
+# endif
+# endif /* __FAST_MATH__ */
__inline_mathcode_ (long double, __sgn1l, __x, \
__extension__ union { long double __xld; unsigned int __xi[3]; } __n = \
@@ -488,7 +723,7 @@ __inline_mathcode_ (long double, __sgn1l, __x, \
return __n.__xld)
-#ifdef __FAST_MATH__
+# ifdef __FAST_MATH__
/* The argument range of the inline version of sinhl is slightly reduced. */
__inline_mathcodeNP (sinh, __x, \
register long double __exm1 = __expm1l (__fabsl (__x)); \
@@ -501,7 +736,7 @@ __inline_mathcodeNP (cosh, __x, \
__inline_mathcodeNP (tanh, __x, \
register long double __exm1 = __expm1l (-__fabsl (__x + __x)); \
return __exm1 / (__exm1 + 2.0) * __sgn1l (-__x))
-#endif
+# endif
__inline_mathcodeNP (floor, __x, \
register long double __value; \
@@ -539,8 +774,8 @@ __inline_mathcodeNP (ceil, __x, \
: "0" (__x)); \
return __value)
-#ifdef __FAST_MATH__
-# define __ldexp_code \
+# ifdef __FAST_MATH__
+# define __ldexp_code \
register long double __value; \
__asm __volatile__ \
("fscale" \
@@ -552,20 +787,20 @@ __NTH (ldexp (double __x, int __y))
{
__ldexp_code;
}
-#endif
+# endif
/* Optimized versions for some non-standardized functions. */
-#if defined __USE_ISOC99 || defined __USE_MISC
+# if defined __USE_ISOC99 || defined __USE_MISC
-# ifdef __FAST_MATH__
+# ifdef __FAST_MATH__
__inline_mathcodeNP (expm1, __x, __expm1_code)
/* We cannot rely on M_SQRT being defined. So we do it for ourself
here. */
-# define __M_SQRT2 1.41421356237309504880L /* sqrt(2) */
+# define __M_SQRT2 1.41421356237309504880L /* sqrt(2) */
-# if !__GNUC_PREREQ (3, 5)
+# if !__GNUC_PREREQ (3, 5)
__inline_mathcodeNP (log1p, __x, \
register long double __value; \
if (__fabsl (__x) >= 1.0 - 0.5 * __M_SQRT2) \
@@ -577,7 +812,7 @@ __inline_mathcodeNP (log1p, __x, \
"fyl2xp1" \
: "=t" (__value) : "0" (__x) : "st(1)"); \
return __value)
-# endif
+# endif
/* The argument range of the inline version of asinhl is slightly reduced. */
@@ -597,7 +832,7 @@ __inline_mathcodeNP (atanh, __x, \
__inline_mathcodeNP2 (hypot, __x, __y,
return __libc_sqrtl (__x * __x + __y * __y))
-# if !__GNUC_PREREQ (3, 5)
+# if !__GNUC_PREREQ (3, 5)
__inline_mathcodeNP(logb, __x, \
register long double __value; \
register long double __junk; \
@@ -605,17 +840,17 @@ __inline_mathcodeNP(logb, __x, \
("fxtract\n\t" \
: "=t" (__junk), "=u" (__value) : "0" (__x)); \
return __value)
-# endif
+# endif
-# endif
-#endif
+# endif
+# endif
-#ifdef __USE_ISOC99
-# ifdef __FAST_MATH__
+# ifdef __USE_ISOC99
+# ifdef __FAST_MATH__
-# if !__GNUC_PREREQ (3, 5)
+# if !__GNUC_PREREQ (3, 5)
__inline_mathop_declNP (log2, "fld1; fxch; fyl2x", "0" (__x) : "st(1)")
-# endif
+# endif
__MATH_INLINE float
__NTH (ldexpf (float __x, int __y))
@@ -630,9 +865,9 @@ __NTH (ldexpl (long double __x, int __y))
}
__inline_mathopNP (rint, "frndint")
-# endif /* __FAST_MATH__ */
+# endif /* __FAST_MATH__ */
-# define __lrint_code \
+# define __lrint_code \
long int __lrintres; \
__asm__ __volatile__ \
("fistpl %0" \
@@ -653,9 +888,9 @@ __NTH (lrintl (long double __x))
{
__lrint_code;
}
-# undef __lrint_code
+# undef __lrint_code
-# define __llrint_code \
+# define __llrint_code \
long long int __llrintres; \
__asm__ __volatile__ \
("fistpll %0" \
@@ -676,14 +911,14 @@ __NTH (llrintl (long double __x))
{
__llrint_code;
}
-# undef __llrint_code
+# undef __llrint_code
-#endif
+# endif
-#ifdef __USE_MISC
+# ifdef __USE_MISC
-# if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)
+# if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)
__inline_mathcodeNP2 (drem, __x, __y, \
register double __value; \
register int __clobbered; \
@@ -694,7 +929,7 @@ __inline_mathcodeNP2 (drem, __x, __y, \
"jp 1b" \
: "=t" (__value), "=&a" (__clobbered) : "0" (__x), "u" (__y) : "cc"); \
return __value)
-# endif
+# endif
/* This function is used in the `isfinite' macro. */
@@ -706,21 +941,21 @@ __NTH (__finite (double __x))
| 0x800fffffu) + 1) >> 31));
}
-#endif /* __USE_MISC */
+# endif /* __USE_MISC */
/* Undefine some of the large macros which are not used anymore. */
-#undef __atan2_code
-#ifdef __FAST_MATH__
-# undef __expm1_code
-# undef __exp_code
-# undef __sincos_code
-#endif /* __FAST_MATH__ */
+# undef __atan2_code
+# ifdef __FAST_MATH__
+# undef __expm1_code
+# undef __exp_code
+# undef __sincos_code
+# endif /* __FAST_MATH__ */
-#endif /* __NO_MATH_INLINES */
+# endif /* __NO_MATH_INLINES */
/* This code is used internally in the GNU libc. */
-#ifdef __LIBC_INTERNAL_MATH_INLINES
+# ifdef __LIBC_INTERNAL_MATH_INLINES
__inline_mathop (__ieee754_sqrt, "fsqrt")
__inline_mathcode2 (__ieee754_atan2, __y, __x,
register long double __value;
@@ -728,6 +963,6 @@ __inline_mathcode2 (__ieee754_atan2, __y, __x,
: "=t" (__value)
: "0" (__x), "u" (__y) : "st(1)");
return __value;)
-#endif
+# endif
-#endif /* __GNUC__ */
+#endif /* !__x86_64__ */
diff --git a/libc/sysdeps/x86_64/fpu/bits/mathinline.h b/libc/sysdeps/x86_64/fpu/bits/mathinline.h
deleted file mode 100644
index 7cfe68874..000000000
--- a/libc/sysdeps/x86_64/fpu/bits/mathinline.h
+++ /dev/null
@@ -1,289 +0,0 @@
-/* Inline math functions for x86-64.
- Copyright (C) 2002-2012 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, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _MATH_H
-# error "Never use <bits/mathinline.h> directly; include <math.h> instead."
-#endif
-
-#ifndef __extern_always_inline
-# define __MATH_INLINE __inline
-#else
-# define __MATH_INLINE __extern_always_inline
-#endif
-
-
-/* The gcc, version 2.7 or below, has problems with all this inlining
- code. So disable it for this version of the compiler. */
-#if __GNUC_PREREQ (2, 8) && defined __USE_ISOC99
-__BEGIN_NAMESPACE_C99
-
-/* Test for negative number. Used in the signbit() macro. */
-__MATH_INLINE int
-__NTH (__signbitf (float __x))
-{
-# ifndef __x86_64__
- __extension__ union { float __f; int __i; } __u = { __f: __x };
- return __u.__i < 0;
-# else
- int __m;
- __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
- return __m & 0x8;
-# endif
-}
-__MATH_INLINE int
-__NTH (__signbit (double __x))
-{
-# ifndef __x86_64__
- __extension__ union { double __d; int __i[2]; } __u = { __d: __x };
- return __u.__i[1] < 0;
-# else
- int __m;
- __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
- return __m & 0x80;
-# endif
-}
-__MATH_INLINE int
-__NTH (__signbitl (long double __x))
-{
- __extension__ union { long double __l; int __i[3]; } __u = { __l: __x };
- return __u.__i[2] & 0x8000;
-}
-
-__END_NAMESPACE_C99
-#endif
-
-
-#if __GNUC_PREREQ (2, 8) && !__GNUC_PREREQ (3, 4) \
- && !defined __NO_MATH_INLINES && defined __OPTIMIZE__
-/* GCC 3.4 introduced builtins for all functions below, so
- there's no need to define any of these inline functions. */
-
-# ifdef __USE_ISOC99
-__BEGIN_NAMESPACE_C99
-
-/* Round to nearest integer. */
-# ifdef __SSE_MATH__
-__MATH_INLINE long int
-__NTH (lrintf (float __x))
-{
- long int __res;
- /* Mark as volatile since the result is dependend on the state of
- the SSE control register (the rounding mode). Otherwise GCC might
- remove these assembler instructions since it does not know about
- the rounding mode change and cannot currently be told. */
- __asm __volatile__ ("cvtss2si %1, %0" : "=r" (__res) : "xm" (__x));
- return __res;
-}
-# endif
-# ifdef __SSE2_MATH__
-__MATH_INLINE long int
-__NTH (lrint (double __x))
-{
- long int __res;
- /* Mark as volatile since the result is dependend on the state of
- the SSE control register (the rounding mode). Otherwise GCC might
- remove these assembler instructions since it does not know about
- the rounding mode change and cannot currently be told. */
- __asm __volatile__ ("cvtsd2si %1, %0" : "=r" (__res) : "xm" (__x));
- return __res;
-}
-# endif
-# ifdef __x86_64__
-__MATH_INLINE long long int
-__NTH (llrintf (float __x))
-{
- long long int __res;
- /* Mark as volatile since the result is dependend on the state of
- the SSE control register (the rounding mode). Otherwise GCC might
- remove these assembler instructions since it does not know about
- the rounding mode change and cannot currently be told. */
- __asm __volatile__ ("cvtss2si %1, %0" : "=r" (__res) : "xm" (__x));
- return __res;
-}
-__MATH_INLINE long long int
-__NTH (llrint (double __x))
-{
- long long int __res;
- /* Mark as volatile since the result is dependend on the state of
- the SSE control register (the rounding mode). Otherwise GCC might
- remove these assembler instructions since it does not know about
- the rounding mode change and cannot currently be told. */
- __asm __volatile__ ("cvtsd2si %1, %0" : "=r" (__res) : "xm" (__x));
- return __res;
-}
-# endif
-
-# if defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0 \
- && defined __SSE2_MATH__
-/* Determine maximum of two values. */
-__MATH_INLINE float
-__NTH (fmaxf (float __x, float __y))
-{
-# ifdef __AVX__
- float __res;
- __asm ("vmaxss %2, %1, %0" : "=x" (__res) : "x" (x), "xm" (__y));
- return __res;
-# else
- __asm ("maxss %1, %0" : "+x" (__x) : "xm" (__y));
- return __x;
-# endif
-}
-__MATH_INLINE double
-__NTH (fmax (double __x, double __y))
-{
-# ifdef __AVX__
- float __res;
- __asm ("vmaxsd %2, %1, %0" : "=x" (__res) : "x" (x), "xm" (__y));
- return __res;
-# else
- __asm ("maxsd %1, %0" : "+x" (__x) : "xm" (__y));
- return __x;
-# endif
-}
-
-/* Determine minimum of two values. */
-__MATH_INLINE float
-__NTH (fminf (float __x, float __y))
-{
-# ifdef __AVX__
- float __res;
- __asm ("vminss %2, %1, %0" : "=x" (__res) : "x" (x), "xm" (__y));
- return __res;
-# else
- __asm ("minss %1, %0" : "+x" (__x) : "xm" (__y));
- return __x;
-# endif
-}
-__MATH_INLINE double
-__NTH (fmin (double __x, double __y))
-{
-# ifdef __AVX__
- float __res;
- __asm ("vminsd %2, %1, %0" : "=x" (__res) : "x" (x), "xm" (__y));
- return __res;
-# else
- __asm ("minsd %1, %0" : "+x" (__x) : "xm" (__y));
- return __x;
-# endif
-}
-# endif
-
-__END_NAMESPACE_C99
-# endif
-
-# if defined __SSE4_1__ && defined __SSE2_MATH__
-# if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
-__BEGIN_NAMESPACE_C99
-
-/* Round to nearest integer. */
-__MATH_INLINE double
-__NTH (rint (double __x))
-{
- double __res;
- /* Mark as volatile since the result is dependend on the state of
- the SSE control register (the rounding mode). Otherwise GCC might
- remove these assembler instructions since it does not know about
- the rounding mode change and cannot currently be told. */
- __asm __volatile__ ("roundsd $4, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-__MATH_INLINE float
-__NTH (rintf (float __x))
-{
- float __res;
- /* Mark as volatile since the result is dependend on the state of
- the SSE control register (the rounding mode). Otherwise GCC might
- remove these assembler instructions since it does not know about
- the rounding mode change and cannot currently be told. */
- __asm __volatile__ ("roundss $4, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-
-# ifdef __USE_ISOC99
-/* Round to nearest integer without raising inexact exception. */
-__MATH_INLINE double
-__NTH (nearbyint (double __x))
-{
- double __res;
- /* Mark as volatile since the result is dependend on the state of
- the SSE control register (the rounding mode). Otherwise GCC might
- remove these assembler instructions since it does not know about
- the rounding mode change and cannot currently be told. */
- __asm __volatile__ ("roundsd $0xc, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-__MATH_INLINE float
-__NTH (nearbyintf (float __x))
-{
- float __res;
- /* Mark as volatile since the result is dependend on the state of
- the SSE control register (the rounding mode). Otherwise GCC might
- remove these assembler instructions since it does not know about
- the rounding mode change and cannot currently be told. */
- __asm __volatile__ ("roundss $0xc, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-# endif
-
-__END_NAMESPACE_C99
-# endif
-
-__BEGIN_NAMESPACE_STD
-/* Smallest integral value not less than X. */
-__MATH_INLINE double
-__NTH (ceil (double __x))
-{
- double __res;
- __asm ("roundsd $2, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-__END_NAMESPACE_STD
-
-__BEGIN_NAMESPACE_C99
-__MATH_INLINE float
-__NTH (ceilf (float __x))
-{
- float __res;
- __asm ("roundss $2, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-__END_NAMESPACE_C99
-
-__BEGIN_NAMESPACE_STD
-/* Largest integer not greater than X. */
-__MATH_INLINE double
-__NTH (floor (double __x))
-{
- double __res;
- __asm ("roundsd $1, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-__END_NAMESPACE_STD
-
-__BEGIN_NAMESPACE_C99
-__MATH_INLINE float
-__NTH (floorf (float __x))
-{
- float __res;
- __asm ("roundss $1, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-__END_NAMESPACE_C99
-# endif
-
-#endif
diff --git a/libc/sysdeps/x86_64/strtok.S b/libc/sysdeps/x86_64/strtok.S
index 150f4d642..fe4a9475b 100644
--- a/libc/sysdeps/x86_64/strtok.S
+++ b/libc/sysdeps/x86_64/strtok.S
@@ -1,6 +1,6 @@
/* strtok (str, delim) -- Return next DELIM separated token from STR.
For AMD x86-64.
- Copyright (C) 1998,2000-2003,2005,2006 Free Software Foundation, Inc.
+ Copyright (C) 1998-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Based on i686 version contributed by Ulrich Drepper
<drepper@cygnus.com>, 1998.
@@ -45,9 +45,9 @@
.bss
.local save_ptr
ASM_TYPE_DIRECTIVE (save_ptr, @object)
- .size save_ptr, 8
+ .size save_ptr, LP_SIZE
save_ptr:
- .space 8
+ .space LP_SIZE
# ifdef PIC
# define SAVE_PTR save_ptr(%rip)
@@ -79,13 +79,12 @@ ENTRY (BP_SYM (FUNCTION))
#ifdef USE_AS_STRTOK_R
/* The value is stored in the third argument. */
- movq %rdx, %rax
- movq %rdx, %r9 /* Save value - see def. of SAVE_PTR. */
- movq (%rax), %rax
+ mov %RDX_LP, %R9_LP /* Save value - see def. of SAVE_PTR. */
+ mov (%rdx), %RAX_LP
#else
/* The value is in the local variable defined above. But
we have to take care for PIC code. */
- movq SAVE_PTR, %rax
+ mov SAVE_PTR, %RAX_LP
#endif
movq %r8, %rdx /* Get start of string. */
@@ -194,7 +193,7 @@ L(8): cmpq %rax, %rdx
cmovne %rcx, %rdx
/* Store the pointer to the next character. */
- movq %rdx, SAVE_PTR
+ mov %RDX_LP, SAVE_PTR
L(epilogue):
/* Remove the stopset table. */
@@ -205,7 +204,7 @@ L(epilogue):
L(returnNULL):
xorl %eax, %eax
/* Store the pointer to the next character. */
- movq %rdx, SAVE_PTR
+ mov %RDX_LP, SAVE_PTR
jmp L(epilogue)
END (BP_SYM (FUNCTION))