summaryrefslogtreecommitdiff
path: root/libc
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
parent4076561cfa2a537917b2d6a38e337a4217b623a7 (diff)
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')
-rw-r--r--libc/ChangeLog95
-rw-r--r--libc/NEWS26
-rw-r--r--libc/debug/fdelt_chk.c8
-rw-r--r--libc/manual/contrib.texi11
-rw-r--r--libc/math/libm-test.inc16
-rw-r--r--libc/misc/bits/select2.h13
-rw-r--r--libc/po/Makefile1
-rw-r--r--libc/string/Makefile3
-rw-r--r--libc/string/endian.h2
-rw-r--r--libc/string/string.h5
-rw-r--r--libc/string/tst-strtok_r.c38
-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
15 files changed, 562 insertions, 461 deletions
diff --git a/libc/ChangeLog b/libc/ChangeLog
index e352549ea..3b7f98869 100644
--- a/libc/ChangeLog
+++ b/libc/ChangeLog
@@ -1,3 +1,98 @@
+2012-06-15 H.J. Lu <hongjiu.lu@intel.com>
+
+ [BZ #14117]
+ * sysdeps/i386/fpu/bits/mathinline.h: Renamed to ...
+ * sysdeps/x86/fpu/bits/mathinline.h: This.
+ * sysdeps/x86_64/fpu/bits/mathinline.h: Removed.
+
+ [BZ #14050]
+ [BZ #14117]
+ * sysdeps/i386/fpu/bits/mathinline.h: Disable x87 inline
+ functions if __x86_64__ is defined.
+
+2012-06-15 Chung-Lin Tang <cltang@codesourcery.com>
+
+ * string/endian.h: Add !__ASSEMBLER__ condition for including
+ conversion interfaces.
+
+2012-06-15 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #14241]
+ * sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Use 0.0 instead
+ of ABS(x) in calculating zero to negative powers other than odd
+ integers.
+ * math/libm-test.inc (pow_test): Add more tests.
+
+2012-06-15 Andreas Jaeger <aj@suse.de>
+
+ * manual/contrib.texi (Contributors): Update entry of Liubov
+ Dmitrieva and add entries for Will Schmidt and Tulio Magno Quites
+ Machado Filho.
+
+2012-06-15 Cyril Hrubis <metan@ucw.cz>
+
+ * string/string.h: Add __wur to GNU version of strerror_r.
+
+2012-06-14 H.J. Lu <hongjiu.lu@intel.com>
+
+ [BZ #14229]
+ * string/Makefile (tests): Add tst-strtok_r.
+ * string/tst-strtok_r.c: New file.
+ * sysdeps/x86_64/strtok.S: Use LP_SIZE on save_ptr and use
+ RAX_LP/RDX_LP on SAVE_PTR.
+
+2012-06-14 Roland McGrath <roland@hack.frob.com>
+
+ * manual/Makefile ($(objpfx)texis): Do $(make-target-directory).
+
+2012-06-14 Joseph Myers <joseph@codesourcery.com>
+
+ * libm_test.inc (csqrt_test): Allow more spurious underflow
+ exceptions.
+ (j0_test): Likewise.
+ (j1_test): Likewise.
+ (y0_test): Likewise.
+ (y1_test): Likewise.
+
+2012-06-13 Carlos O'Donell <carlos_odonell@mentor.com>
+
+ * po/Makefile (libc.pot): Use UTF-8 charset.
+
+2012-06-13 Paul Pluzhnikov <ppluzhnikov@google.com>
+
+ [BZ #14210]
+ Suppress sign-conversion warning from FD_SET.
+ See <http://sourceware.org/ml/libc-alpha/2012-05/msg01794.html>.
+ * debug/fdelt_chk.c (__fdelt_chk): Accept and return long int,
+ not unsigned long int.
+ * misc/bits/select2.h (__fdelt_chk, __fdelt_warn, __FD_ELT): Likewise.
+
+2012-06-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ [BZ #14050]
+ [BZ #14117]
+ * sysdeps/i386/fpu/bits/mathinline.h (__MATH_INLINE): Check
+ __extern_always_inline instead of __extern_inline.
+ (__signbitf): Support __SSE2_MATH__ and C++ namespace.
+ (__signbit): Likewise.
+ (__signbitl): Support C++ namespace.
+ (lrintf): New inline function.
+ (lrint): Likewise.
+ (llrintf): Likewise.
+ (llrint): Likewise.
+ (fmaxf): Likewise.
+ (fmax): Likewise.
+ (fminf): Likewise.
+ (fmin): Likewise.
+ (rint): Likewise.
+ (rintf): Likewise.
+ (ceil): Likewise.
+ (ceilf): Likewise.
+ (floor): Likewise.
+ (floorf): Likewise.
+ (nearbyint): Likewise.
+ (nearbyintf): Likewise.
+
2012-06-12 Thomas Schwinge <thomas@codesourcery.com>
* sysdeps/unix/Makefile ($(objpfx)stub-syscalls.c): Fix case for
diff --git a/libc/NEWS b/libc/NEWS
index 1cb50ef65..b46122bc1 100644
--- a/libc/NEWS
+++ b/libc/NEWS
@@ -20,16 +20,17 @@ Version 2.16
13361, 13525, 13526, 13527, 13528, 13529, 13530, 13531, 13532, 13533,
13547, 13551, 13552, 13553, 13555, 13556, 13559, 13563, 13566, 13576,
13583, 13592, 13594, 13613, 13618, 13637, 13656, 13658, 13673, 13691,
- 13695, 13704, 13705, 13706, 13726, 13738, 13739, 13743, 13750, 13758,
- 13760, 13761, 13775, 13786, 13787, 13792, 13806, 13824, 13840, 13841,
- 13844, 13846, 13851, 13852, 13854, 13871, 13872, 13873, 13879, 13883,
- 13884, 13885, 13886, 13892, 13895, 13908, 13910, 13911, 13912, 13913,
- 13914, 13915, 13916, 13917, 13918, 13919, 13920, 13921, 13922, 13923,
- 13924, 13926, 13927, 13928, 13938, 13941, 13942, 13954, 13955, 13956,
- 13963, 13967, 13968, 13970, 13973, 13979, 13983, 13986, 13996, 14012,
- 14027, 14033, 14034, 14036, 14040, 14043, 14044, 14048, 14049, 14053,
- 14055, 14059, 14064, 14075, 14080, 14083, 14103, 14104, 14109, 14112,
- 14122, 14123, 14134, 14153, 14183, 14188, 14199, 14218
+ 13695, 13704, 13705, 13706, 13718, 13726, 13738, 13739, 13743, 13750,
+ 13758, 13760, 13761, 13775, 13786, 13787, 13792, 13806, 13824, 13840,
+ 13841, 13844, 13846, 13848, 13851, 13852, 13854, 13871, 13872, 13873,
+ 13879, 13883, 13884, 13885, 13886, 13892, 13895, 13908, 13910, 13911,
+ 13912, 13913, 13914, 13915, 13916, 13917, 13918, 13919, 13920, 13921,
+ 13922, 13923, 13924, 13926, 13927, 13928, 13938, 13941, 13942, 13954,
+ 13955, 13956, 13963, 13967, 13968, 13970, 13973, 13979, 13983, 13986,
+ 13996, 14012, 14027, 14033, 14034, 14036, 14040, 14043, 14044, 14048,
+ 14049, 14050, 14053, 14055, 14059, 14064, 14075, 14080, 14083, 14103,
+ 14104, 14109, 14112, 14117, 14122, 14123, 14134, 14153, 14183, 14188,
+ 14199, 14210, 14218, 14229, 14241
* Support for the x32 ABI on x86-64 added. The x32 target is selected by
configuring glibc with:
@@ -116,6 +117,11 @@ Version 2.16
platform-specific functionality. PowerPC added the first instance with a
function to provide time base register access. Contributed by Tulio
Magno Quites Machado Filho.
+
+* ix86 configurations now install header files that are consistent with
+ what x86-64 configurations install. These same header files can be used
+ for -m32, -m64, or -mx32 builds.
+ Contributed by H.J. Lu.
Version 2.15
diff --git a/libc/debug/fdelt_chk.c b/libc/debug/fdelt_chk.c
index 5e06f8f6a..ded3f2f64 100644
--- a/libc/debug/fdelt_chk.c
+++ b/libc/debug/fdelt_chk.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011 Free Software Foundation, Inc.
+/* Copyright (C) 2011, 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
@@ -18,10 +18,10 @@
#include <sys/select.h>
-unsigned long int
-__fdelt_chk (unsigned long int d)
+long int
+__fdelt_chk (long int d)
{
- if (d >= FD_SETSIZE)
+ if (d < 0 || d >= FD_SETSIZE)
__chk_fail ();
return d / __NFDBITS;
diff --git a/libc/manual/contrib.texi b/libc/manual/contrib.texi
index 00e13ab31..1445c7823 100644
--- a/libc/manual/contrib.texi
+++ b/libc/manual/contrib.texi
@@ -50,7 +50,8 @@ committee.
Thomas Bushnell for his contributions to Hurd.
@item
-Liubov Dmitrieva for optimzed string functions on x86-64 and x86.
+Liubov Dmitrieva for optimzed string and math functions on x86-64 and
+x86.
@item
Ulrich Drepper for his many contributions in almost all parts of
@@ -80,6 +81,11 @@ Paul Eggert for the @code{mktime} function and for his direction as
part of @theglibc{} steering committee.
@item
+Tulio Magno Quites Machado Filho for adding a new class of installed
+headers for low-level platform-specific functionality and one such for
+PowerPC.
+
+@item
Mike Frysinger for his maintaining of the IA64 architecture and for
testing and bug fixing.
@@ -233,6 +239,9 @@ Siddhesh Poyarekar for various fixes.
Pravin Satpute for writing sorting rules for some Indian languages.
@item
+Will Schmidt for optimized string functions on PowerPC.
+
+@item
Martin Schwidefsky for porting to Linux on s390
(@code{s390-@var{anything}-linux}) and s390x
(@code{s390x-@var{anything}-linux}).
diff --git a/libc/math/libm-test.inc b/libc/math/libm-test.inc
index 0eed5978a..578cba245 100644
--- a/libc/math/libm-test.inc
+++ b/libc/math/libm-test.inc
@@ -3219,7 +3219,7 @@ csqrt_test (void)
TEST_c_c (csqrt, 0x1.fffffffffffffp+1023L, 0x1p+1023L, 1.379778091031440685006200821918878702861e+154L, 3.257214233483129514781233066898042490248e+153L);
/* Bug 14157: spurious exception may occur. */
TEST_c_c (csqrt, 0x1p-1074L, 0x1p-1074L, 2.442109726130830256743814843868934877597e-162L, 1.011554969366634726113090867589031782487e-162L, UNDERFLOW_EXCEPTION_OK);
- TEST_c_c (csqrt, 0x1p-1073L, 0x1p-1073L, 3.453664695497464982856905711457966660085e-162L, 1.430554756764195530630723976279903095110e-162L);
+ TEST_c_c (csqrt, 0x1p-1073L, 0x1p-1073L, 3.453664695497464982856905711457966660085e-162L, 1.430554756764195530630723976279903095110e-162L, UNDERFLOW_EXCEPTION_OK);
#endif
#if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384
@@ -4365,7 +4365,8 @@ j0_test (void)
TEST_f_f (j0, 0x1.d7ce3ap+107L, 2.775523647291230802651040996274861694514e-17L, UNDERFLOW_EXCEPTION_OK);
#ifndef TEST_FLOAT
- TEST_f_f (j0, -0x1.001000001p+593L, -3.927269966354206207832593635798954916263e-90L);
+ /* Bug 14155: spurious exception may occur. */
+ TEST_f_f (j0, -0x1.001000001p+593L, -3.927269966354206207832593635798954916263e-90L, UNDERFLOW_EXCEPTION_OK);
#endif
END (j0);
@@ -4406,7 +4407,8 @@ j1_test (void)
TEST_f_f (j1, 0x1.3ffp+74L, 1.818984347516051243459364437186082741567e-12L);
#ifndef TEST_FLOAT
- TEST_f_f (j1, 0x1.ff00000000002p+840L, 1.846591691699331493194965158699937660696e-127L);
+ /* Bug 14155: spurious exception may occur. */
+ TEST_f_f (j1, 0x1.ff00000000002p+840L, 1.846591691699331493194965158699937660696e-127L, UNDERFLOW_EXCEPTION_OK);
#endif
END (j1);
@@ -6301,6 +6303,8 @@ pow_test (void)
TEST_ff_f (pow, minus_zero, 11.1L, 0);
TEST_ff_f (pow, 0, plus_infty, 0);
TEST_ff_f (pow, minus_zero, plus_infty, 0);
+ TEST_ff_f (pow, 0, minus_infty, plus_infty, DIVIDE_BY_ZERO_EXCEPTION_OK);
+ TEST_ff_f (pow, minus_zero, minus_infty, plus_infty, DIVIDE_BY_ZERO_EXCEPTION_OK);
#ifndef TEST_INLINE
/* pow (x, +inf) == +inf for |x| > 1. */
@@ -8454,7 +8458,8 @@ y0_test (void)
TEST_f_f (y0, 0x1.3ffp+74L, 1.818984347516051243459467456433028748678e-12L);
#ifndef TEST_FLOAT
- TEST_f_f (y0, 0x1.ff00000000002p+840L, 1.846591691699331493194965158699937660696e-127L);
+ /* Bug 14155: spurious exception may occur. */
+ TEST_f_f (y0, 0x1.ff00000000002p+840L, 1.846591691699331493194965158699937660696e-127L, UNDERFLOW_EXCEPTION_OK);
#endif
END (y0);
@@ -8496,7 +8501,8 @@ y1_test (void)
TEST_f_f (y1, 0x1.27e204p+99L, -8.881610148467797208469612080785210013461e-16L, UNDERFLOW_EXCEPTION_OK);
#ifndef TEST_FLOAT
- TEST_f_f (y1, 0x1.001000001p+593L, 3.927269966354206207832593635798954916263e-90L);
+ /* Bug 14155: spurious exception may occur. */
+ TEST_f_f (y1, 0x1.001000001p+593L, 3.927269966354206207832593635798954916263e-90L, UNDERFLOW_EXCEPTION_OK);
#endif
END (y1);
diff --git a/libc/misc/bits/select2.h b/libc/misc/bits/select2.h
index 9679925b0..76ae36877 100644
--- a/libc/misc/bits/select2.h
+++ b/libc/misc/bits/select2.h
@@ -1,5 +1,5 @@
/* Checking macros for select functions.
- Copyright (C) 2011 Free Software Foundation, Inc.
+ Copyright (C) 2011, 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
@@ -21,14 +21,15 @@
#endif
/* Helper functions to issue warnings and errors when needed. */
-extern unsigned long int __fdelt_chk (unsigned long int __d);
-extern unsigned long int __fdelt_warn (unsigned long int __d)
+extern long int __fdelt_chk (long int __d);
+extern long int __fdelt_warn (long int __d)
__warnattr ("bit outside of fd_set selected");
#undef __FD_ELT
#define __FD_ELT(d) \
__extension__ \
- ({ unsigned long int __d = (d); \
+ ({ long int __d = (d); \
(__builtin_constant_p (__d) \
- ? (__d >= __FD_SETSIZE \
- ? __fdelt_warn (__d) : (__d / __NFDBITS)) \
+ ? (0 <= __d && __d < __FD_SETSIZE \
+ ? (__d / __NFDBITS) \
+ : __fdelt_warn (__d)) \
: __fdelt_chk (__d)); })
diff --git a/libc/po/Makefile b/libc/po/Makefile
index 4ca0d1c4d..3e3f909b9 100644
--- a/libc/po/Makefile
+++ b/libc/po/Makefile
@@ -56,6 +56,7 @@ libc.pot: header.pot libc.pot.files
set `date -R`; disp="$$6"; \
sed -e 's/VERSION/$(version)/' \
-e "s/DATE/`date +'%Y-%m-%d %H:%M'$$disp`/" \
+ -e "s/CHARSET/UTF-8/" \
$< > $@.new
egrep -v '\.ksh$$' $(word 2,$^) > $(objdir)/tmp-libc.pot-files
cd ..; $(XGETTEXT) --keyword=_ --keyword=N_ \
diff --git a/libc/string/Makefile b/libc/string/Makefile
index 041db92f9..8b53de85e 100644
--- a/libc/string/Makefile
+++ b/libc/string/Makefile
@@ -59,7 +59,8 @@ tests := tester inl-tester noinl-tester testcopy test-ffs \
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \
tst-strtok tst-strfry \
bug-strtok1 $(addprefix test-,$(strop-tests)) \
- tst-strxfrm2 tst-endian tst-svc2 bug-strstr1 bug-strchr1
+ tst-strxfrm2 tst-endian tst-svc2 bug-strstr1 bug-strchr1 \
+ tst-strtok_r
tests-$(OPTION_EGLIBC_ENVZ) += bug-envz1
tests-$(OPTION_EGLIBC_LOCALE_CODE) \
+= tst-strxfrm bug-strcoll1
diff --git a/libc/string/endian.h b/libc/string/endian.h
index 0c293f637..51084f1e9 100644
--- a/libc/string/endian.h
+++ b/libc/string/endian.h
@@ -55,7 +55,7 @@
#endif
-#ifdef __USE_BSD
+#if defined __USE_BSD && !defined __ASSEMBLER__
/* Conversion interfaces. */
# include <bits/byteswap.h>
diff --git a/libc/string/string.h b/libc/string/string.h
index 7bb505fc6..879410aee 100644
--- a/libc/string/string.h
+++ b/libc/string/string.h
@@ -1,5 +1,4 @@
-/* Copyright (C) 1991-1993,1995-2004,2007,2009,2010,2012
- Free Software Foundation, Inc.
+/* Copyright (C) 1991-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
@@ -433,7 +432,7 @@ extern int __xpg_strerror_r (int __errnum, char *__buf, size_t __buflen)
/* If a temporary buffer is required, at most BUFLEN bytes of BUF will be
used. */
extern char *strerror_r (int __errnum, char *__buf, size_t __buflen)
- __THROW __nonnull ((2));
+ __THROW __nonnull ((2)) __wur;
# endif
#endif
diff --git a/libc/string/tst-strtok_r.c b/libc/string/tst-strtok_r.c
new file mode 100644
index 000000000..5f1cee37f
--- /dev/null
+++ b/libc/string/tst-strtok_r.c
@@ -0,0 +1,38 @@
+/* Test strtok_r regression for BZ #14229.
+ Copyright (C) 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/>. */
+
+#define TEST_MAIN
+#define BUF1PAGES 1
+#include "test-string.h"
+
+int
+test_main (void)
+{
+ char line[] = "udf 75868 1 - Live 0xffffffffa0bfb000\n";
+ char **saveptrp;
+ char *tok;
+
+ test_init ();
+
+ /* Check strtok_r won't write beyond the size of (*saveptrp). */
+ saveptrp = (char **) (buf1 + page_size - sizeof (*saveptrp));
+ tok = strtok_r (line, " \t", saveptrp);
+ return strcmp (tok, "udf") != 0;
+}
+
+#include "../test-skeleton.c"
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))