summaryrefslogtreecommitdiff
path: root/sysdeps/x86/fpu
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/x86/fpu')
-rw-r--r--sysdeps/x86/fpu/Makefile11
-rw-r--r--sysdeps/x86/fpu/bits/fenv.h168
-rw-r--r--sysdeps/x86/fpu/bits/math-vector.h63
-rw-r--r--sysdeps/x86/fpu/bits/mathinline.h962
-rw-r--r--sysdeps/x86/fpu/fix-fp-int-compare-invalid.h28
-rw-r--r--sysdeps/x86/fpu/include/bits/fenv.h48
-rw-r--r--sysdeps/x86/fpu/powl_helper.c236
-rw-r--r--sysdeps/x86/fpu/test-fenv-clear-sse.c45
-rw-r--r--sysdeps/x86/fpu/test-fenv-sse-2.c176
-rw-r--r--sysdeps/x86/fpu/test-fenv-sse.c138
-rw-r--r--sysdeps/x86/fpu/test-fenv-x87.c169
-rw-r--r--sysdeps/x86/fpu/test-flt-eval-method-387.c1
-rw-r--r--sysdeps/x86/fpu/test-flt-eval-method-sse.c1
-rw-r--r--sysdeps/x86/fpu/test-math-vector-sincos.h98
14 files changed, 0 insertions, 2144 deletions
diff --git a/sysdeps/x86/fpu/Makefile b/sysdeps/x86/fpu/Makefile
deleted file mode 100644
index a8047a4504..0000000000
--- a/sysdeps/x86/fpu/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-ifeq ($(subdir),math)
-libm-support += powl_helper
-tests += test-fenv-sse test-fenv-clear-sse test-fenv-x87 test-fenv-sse-2 \
- test-flt-eval-method-387 test-flt-eval-method-sse
-CFLAGS-test-fenv-sse.c += -msse2 -mfpmath=sse
-CFLAGS-test-fenv-clear-sse.c += -msse2 -mfpmath=sse
-CFLAGS-test-fenv-sse-2.c += -msse2 -mfpmath=sse
-CFLAGS-test-flt-eval-method-387.c += -fexcess-precision=standard -mfpmath=387
-CFLAGS-test-flt-eval-method-sse.c += -fexcess-precision=standard -msse2 \
- -mfpmath=sse
-endif
diff --git a/sysdeps/x86/fpu/bits/fenv.h b/sysdeps/x86/fpu/bits/fenv.h
deleted file mode 100644
index fd7327902c..0000000000
--- a/sysdeps/x86/fpu/bits/fenv.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/* Copyright (C) 1997-2017 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 _FENV_H
-# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
-#endif
-
-/* Define bits representing the exception. We use the bit positions
- of the appropriate bits in the FPU control word. */
-enum
- {
- FE_INVALID =
-#define FE_INVALID 0x01
- FE_INVALID,
- __FE_DENORM = 0x02,
- FE_DIVBYZERO =
-#define FE_DIVBYZERO 0x04
- FE_DIVBYZERO,
- FE_OVERFLOW =
-#define FE_OVERFLOW 0x08
- FE_OVERFLOW,
- FE_UNDERFLOW =
-#define FE_UNDERFLOW 0x10
- FE_UNDERFLOW,
- FE_INEXACT =
-#define FE_INEXACT 0x20
- FE_INEXACT
- };
-
-#define FE_ALL_EXCEPT \
- (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
-
-/* The ix87 FPU supports all of the four defined rounding modes. We
- use again the bit positions in the FPU control word as the values
- for the appropriate macros. */
-enum
- {
- FE_TONEAREST =
-#define FE_TONEAREST 0
- FE_TONEAREST,
- FE_DOWNWARD =
-#define FE_DOWNWARD 0x400
- FE_DOWNWARD,
- FE_UPWARD =
-#define FE_UPWARD 0x800
- FE_UPWARD,
- FE_TOWARDZERO =
-#define FE_TOWARDZERO 0xc00
- FE_TOWARDZERO
- };
-
-
-/* Type representing exception flags. */
-typedef unsigned short int fexcept_t;
-
-
-/* Type representing floating-point environment. This structure
- corresponds to the layout of the block written by the `fstenv'
- instruction and has additional fields for the contents of the MXCSR
- register as written by the `stmxcsr' instruction. */
-typedef struct
- {
- unsigned short int __control_word;
- unsigned short int __glibc_reserved1;
- unsigned short int __status_word;
- unsigned short int __glibc_reserved2;
- unsigned short int __tags;
- unsigned short int __glibc_reserved3;
- unsigned int __eip;
- unsigned short int __cs_selector;
- unsigned int __opcode:11;
- unsigned int __glibc_reserved4:5;
- unsigned int __data_offset;
- unsigned short int __data_selector;
- unsigned short int __glibc_reserved5;
-#ifdef __x86_64__
- unsigned int __mxcsr;
-#endif
- }
-fenv_t;
-
-/* If the default argument is used we use this value. */
-#define FE_DFL_ENV ((const fenv_t *) -1)
-
-#ifdef __USE_GNU
-/* Floating-point environment where none of the exception is masked. */
-# define FE_NOMASK_ENV ((const fenv_t *) -2)
-#endif
-
-#if __GLIBC_USE (IEC_60559_BFP_EXT)
-/* Type representing floating-point control modes. */
-typedef struct
- {
- unsigned short int __control_word;
- unsigned short int __glibc_reserved;
- unsigned int __mxcsr;
- }
-femode_t;
-
-/* Default floating-point control modes. */
-# define FE_DFL_MODE ((const femode_t *) -1L)
-#endif
-
-
-#ifdef __USE_EXTERN_INLINES
-__BEGIN_DECLS
-
-/* Optimized versions. */
-extern int __REDIRECT_NTH (__feraiseexcept_renamed, (int), feraiseexcept);
-__extern_always_inline void
-__NTH (__feraiseexcept_invalid_divbyzero (int __excepts))
-{
- if ((FE_INVALID & __excepts) != 0)
- {
- /* One example of an invalid operation is 0.0 / 0.0. */
- float __f = 0.0;
-
-# ifdef __SSE_MATH__
- __asm__ __volatile__ ("divss %0, %0 " : : "x" (__f));
-# else
- __asm__ __volatile__ ("fdiv %%st, %%st(0); fwait"
- : "=t" (__f) : "0" (__f));
-# endif
- (void) &__f;
- }
- if ((FE_DIVBYZERO & __excepts) != 0)
- {
- float __f = 1.0;
- float __g = 0.0;
-
-# ifdef __SSE_MATH__
- __asm__ __volatile__ ("divss %1, %0" : : "x" (__f), "x" (__g));
-# else
- __asm__ __volatile__ ("fdivp %%st, %%st(1); fwait"
- : "=t" (__f) : "0" (__f), "u" (__g) : "st(1)");
-# endif
- (void) &__f;
- }
-}
-__extern_inline int
-__NTH (feraiseexcept (int __excepts))
-{
- if (__builtin_constant_p (__excepts)
- && (__excepts & ~(FE_INVALID | FE_DIVBYZERO)) == 0)
- {
- __feraiseexcept_invalid_divbyzero (__excepts);
- return 0;
- }
-
- return __feraiseexcept_renamed (__excepts);
-}
-
-__END_DECLS
-#endif
diff --git a/sysdeps/x86/fpu/bits/math-vector.h b/sysdeps/x86/fpu/bits/math-vector.h
deleted file mode 100644
index 419af076a7..0000000000
--- a/sysdeps/x86/fpu/bits/math-vector.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Platform-specific SIMD declarations of math functions.
- Copyright (C) 2014-2017 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 include <bits/math-vector.h> directly;\
- include <math.h> instead."
-#endif
-
-/* Get default empty definitions for simd declarations. */
-#include <bits/libm-simd-decl-stubs.h>
-
-#if defined __x86_64__ && defined __FAST_MATH__
-# if defined _OPENMP && _OPENMP >= 201307
-/* OpenMP case. */
-# define __DECL_SIMD_x86_64 _Pragma ("omp declare simd notinbranch")
-# elif __GNUC_PREREQ (6,0)
-/* W/o OpenMP use GCC 6.* __attribute__ ((__simd__)). */
-# define __DECL_SIMD_x86_64 __attribute__ ((__simd__ ("notinbranch")))
-# endif
-
-# ifdef __DECL_SIMD_x86_64
-# undef __DECL_SIMD_cos
-# define __DECL_SIMD_cos __DECL_SIMD_x86_64
-# undef __DECL_SIMD_cosf
-# define __DECL_SIMD_cosf __DECL_SIMD_x86_64
-# undef __DECL_SIMD_sin
-# define __DECL_SIMD_sin __DECL_SIMD_x86_64
-# undef __DECL_SIMD_sinf
-# define __DECL_SIMD_sinf __DECL_SIMD_x86_64
-# undef __DECL_SIMD_sincos
-# define __DECL_SIMD_sincos __DECL_SIMD_x86_64
-# undef __DECL_SIMD_sincosf
-# define __DECL_SIMD_sincosf __DECL_SIMD_x86_64
-# undef __DECL_SIMD_log
-# define __DECL_SIMD_log __DECL_SIMD_x86_64
-# undef __DECL_SIMD_logf
-# define __DECL_SIMD_logf __DECL_SIMD_x86_64
-# undef __DECL_SIMD_exp
-# define __DECL_SIMD_exp __DECL_SIMD_x86_64
-# undef __DECL_SIMD_expf
-# define __DECL_SIMD_expf __DECL_SIMD_x86_64
-# undef __DECL_SIMD_pow
-# define __DECL_SIMD_pow __DECL_SIMD_x86_64
-# undef __DECL_SIMD_powf
-# define __DECL_SIMD_powf __DECL_SIMD_x86_64
-
-# endif
-#endif
diff --git a/sysdeps/x86/fpu/bits/mathinline.h b/sysdeps/x86/fpu/bits/mathinline.h
deleted file mode 100644
index bcd99bdf74..0000000000
--- a/sysdeps/x86/fpu/bits/mathinline.h
+++ /dev/null
@@ -1,962 +0,0 @@
-/* Inline math functions for i387 and SSE.
- Copyright (C) 1995-2017 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
-
-
-#if defined __USE_ISOC99 && defined __GNUC__ && __GNUC__ >= 2
-/* GCC 2.97 and up have builtins that actually can be used. */
-# if !__GNUC_PREREQ (2,97)
-/* ISO C99 defines some macros to perform unordered comparisons. The
- ix87 FPU supports this with special opcodes and we should use them.
- These must not be inline functions since we have to be able to handle
- all floating-point types. */
-# undef isgreater
-# undef isgreaterequal
-# undef isless
-# undef islessequal
-# undef islessgreater
-# undef isunordered
-# ifdef __i686__
-/* For the PentiumPro and more recent processors we can provide
- better code. */
-# define isgreater(x, y) \
- ({ register char __result; \
- __asm__ ("fucomip %%st(1), %%st; seta %%al" \
- : "=a" (__result) : "u" (y), "t" (x) : "cc", "st"); \
- __result; })
-# define isgreaterequal(x, y) \
- ({ register char __result; \
- __asm__ ("fucomip %%st(1), %%st; setae %%al" \
- : "=a" (__result) : "u" (y), "t" (x) : "cc", "st"); \
- __result; })
-
-# define isless(x, y) \
- ({ register char __result; \
- __asm__ ("fucomip %%st(1), %%st; seta %%al" \
- : "=a" (__result) : "u" (x), "t" (y) : "cc", "st"); \
- __result; })
-
-# define islessequal(x, y) \
- ({ register char __result; \
- __asm__ ("fucomip %%st(1), %%st; setae %%al" \
- : "=a" (__result) : "u" (x), "t" (y) : "cc", "st"); \
- __result; })
-
-# define islessgreater(x, y) \
- ({ register char __result; \
- __asm__ ("fucomip %%st(1), %%st; setne %%al" \
- : "=a" (__result) : "u" (y), "t" (x) : "cc", "st"); \
- __result; })
-
-# define isunordered(x, y) \
- ({ register char __result; \
- __asm__ ("fucomip %%st(1), %%st; setp %%al" \
- : "=a" (__result) : "u" (y), "t" (x) : "cc", "st"); \
- __result; })
-# else
-/* This is the dumb, portable code for i386 and above. */
-# define isgreater(x, y) \
- ({ register char __result; \
- __asm__ ("fucompp; fnstsw; testb $0x45, %%ah; setz %%al" \
- : "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
- __result; })
-
-# define isgreaterequal(x, y) \
- ({ register char __result; \
- __asm__ ("fucompp; fnstsw; testb $0x05, %%ah; setz %%al" \
- : "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
- __result; })
-
-# define isless(x, y) \
- ({ register char __result; \
- __asm__ ("fucompp; fnstsw; testb $0x45, %%ah; setz %%al" \
- : "=a" (__result) : "u" (x), "t" (y) : "cc", "st", "st(1)"); \
- __result; })
-
-# define islessequal(x, y) \
- ({ register char __result; \
- __asm__ ("fucompp; fnstsw; testb $0x05, %%ah; setz %%al" \
- : "=a" (__result) : "u" (x), "t" (y) : "cc", "st", "st(1)"); \
- __result; })
-
-# define islessgreater(x, y) \
- ({ register char __result; \
- __asm__ ("fucompp; fnstsw; testb $0x44, %%ah; setz %%al" \
- : "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
- __result; })
-
-# define isunordered(x, y) \
- ({ register char __result; \
- __asm__ ("fucompp; fnstsw; sahf; setp %%al" \
- : "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
- __result; })
-# endif /* __i686__ */
-# endif /* GCC 2.97 */
-
-/* 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)
-
-/* 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))
-{
- __extension__ union { long double __l; int __i[3]; } __u = { __l: __x };
- return (__u.__i[2] & 0x8000) != 0;
-}
-
-# endif
-#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)
-# 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
-
-/* 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__
-__extension__
-__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;
-}
-__extension__
-__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
-
-# endif
-
-# if defined __SSE4_1__ && defined __SSE2_MATH__
-# if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
-
-/* 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
-
-# endif
-
-/* 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;
-}
-
-__MATH_INLINE float
-__NTH (ceilf (float __x))
-{
- float __res;
- __asm ("roundss $2, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-
-/* 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;
-}
-
-__MATH_INLINE float
-__NTH (floorf (float __x))
-{
- float __res;
- __asm ("roundss $1, %1, %0" : "=x" (__res) : "xm" (__x));
- return __res;
-}
-# endif
-# endif
-#endif
-
-/* Disable x87 inlines when -fpmath=sse is passed and also when we're building
- on x86_64. Older gcc (gcc-3.2 for example) does not define __SSE2_MATH__
- for x86_64. */
-#if !defined __SSE2_MATH__ && !defined __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
-
-/* 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
- be suffixed with f and l for the float and long double version,
- respectively). OP is the name of the FPU operation.
- We define two sets of macros. The set with the additional NP
- doesn't add a prototype declaration. */
-
-# ifdef __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) \
- __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) \
- __inline_mathop_ (double, func, op)
-# define __inline_mathopNP(func, op) \
- __inline_mathopNP_ (double, func, op)
-# endif
-
-# define __inline_mathop_(float_type, func, op) \
- __inline_mathop_decl_ (float_type, func, op, "0" (__x))
-# define __inline_mathopNP_(float_type, func, op) \
- __inline_mathop_declNP_ (float_type, func, op, "0" (__x))
-
-
-# ifdef __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...) \
- __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...) \
- __inline_mathop_decl_ (double, func, op, params)
-# define __inline_mathop_declNP(func, op, params...) \
- __inline_mathop_declNP_ (double, func, op, params)
-# endif
-
-# 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...) \
- __MATH_INLINE float_type __NTH (func (float_type __x)) \
- { \
- register float_type __result; \
- __asm __volatile__ (op : "=t" (__result) : params); \
- return __result; \
- }
-
-
-# ifdef __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) \
- __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) \
- __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) \
- __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) \
- __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) \
- __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) \
- __inline_mathcode_ (double, func, (arg), code)
-# define __inline_mathcodeNP(func, arg, code) \
- __inline_mathcodeNP_ (double, func, (arg), code)
-# define __inline_mathcode2(func, arg1, arg2, code) \
- __inline_mathcode2_ (double, 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) \
- __inline_mathcode3_ (double, func, arg1, arg2, arg3, code)
-# define __inline_mathcodeNP3(func, arg1, arg2, arg3, code) \
- __inline_mathcodeNP3_ (double, func, arg1, arg2, arg3, code)
-# endif
-
-# 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) \
- __MATH_INLINE float_type __NTH (func (float_type arg)) \
- { \
- 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) \
- __MATH_INLINE float_type __NTH (func (float_type arg1, float_type arg2)) \
- { \
- 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) \
- __MATH_INLINE float_type __NTH (func (float_type arg1, float_type arg2, \
- float_type arg3)) \
- { \
- code; \
- }
-# endif
-
-
-# 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 \
- register long double __cosr; \
- register long double __sinr; \
- register unsigned int __swtmp; \
- __asm __volatile__ \
- ("fsincos\n\t" \
- "fnstsw %w2\n\t" \
- "testl $0x400, %2\n\t" \
- "jz 1f\n\t" \
- "fldpi\n\t" \
- "fadd %%st(0)\n\t" \
- "fxch %%st(1)\n\t" \
- "2: fprem1\n\t" \
- "fnstsw %w2\n\t" \
- "testl $0x400, %2\n\t" \
- "jnz 2b\n\t" \
- "fstp %%st(1)\n\t" \
- "fsincos\n\t" \
- "1:" \
- : "=t" (__cosr), "=u" (__sinr), "=a" (__swtmp) : "0" (__x)); \
- *__sinx = __sinr; \
- *__cosx = __cosr
-
-__MATH_INLINE void
-__NTH (__sincos (double __x, double *__sinx, double *__cosx))
-{
- __sincos_code;
-}
-
-__MATH_INLINE void
-__NTH (__sincosf (float __x, float *__sinx, float *__cosx))
-{
- __sincos_code;
-}
-
-__MATH_INLINE void
-__NTH (__sincosl (long double __x, long double *__sinx, long double *__cosx))
-{
- __sincos_code;
-}
-# endif
-
-
-/* Optimized inline implementation, sometimes with reduced precision
- and/or argument range. */
-
-# if __GNUC_PREREQ (3, 5)
-# define __expm1_code \
- register long double __temp; \
- __temp = __builtin_expm1l (__x); \
- return __temp ? __temp : __x
-# else
-# define __expm1_code \
- register long double __value; \
- register long double __exponent; \
- register long double __temp; \
- __asm __volatile__ \
- ("fldl2e # e^x - 1 = 2^(x * log2(e)) - 1\n\t" \
- "fmul %%st(1) # x * log2(e)\n\t" \
- "fst %%st(1)\n\t" \
- "frndint # int(x * log2(e))\n\t" \
- "fxch\n\t" \
- "fsub %%st(1) # fract(x * log2(e))\n\t" \
- "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" \
- "fscale # 2^(x * log2(e)) - 2^(int(x * log2(e)))\n\t" \
- : "=t" (__value), "=u" (__exponent) : "0" (__x)); \
- __asm __volatile__ \
- ("fscale # 2^int(x * log2(e))\n\t" \
- : "=t" (__temp) : "0" (1.0), "u" (__exponent)); \
- __temp -= 1.0; \
- __temp += __value; \
- return __temp ? __temp : __x
-# endif
-__inline_mathcodeNP_ (long double, __expm1l, __x, __expm1_code)
-
-# if __GNUC_PREREQ (3, 4)
-__inline_mathcodeNP_ (long double, __expl, __x, return __builtin_expl (__x))
-# else
-# define __exp_code \
- register long double __value; \
- register long double __exponent; \
- __asm __volatile__ \
- ("fldl2e # e^x = 2^(x * log2(e))\n\t" \
- "fmul %%st(1) # x * log2(e)\n\t" \
- "fst %%st(1)\n\t" \
- "frndint # int(x * log2(e))\n\t" \
- "fxch\n\t" \
- "fsub %%st(1) # fract(x * log2(e))\n\t" \
- "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" \
- : "=t" (__value), "=u" (__exponent) : "0" (__x)); \
- __value += 1.0; \
- __asm __volatile__ \
- ("fscale" \
- : "=t" (__value) : "0" (__value), "u" (__exponent)); \
- return __value
-__inline_mathcodeNP (exp, __x, __exp_code)
-__inline_mathcodeNP_ (long double, __expl, __x, __exp_code)
-# endif
-
-
-# if !__GNUC_PREREQ (3, 5)
-__inline_mathcodeNP (tan, __x, \
- register long double __value; \
- register long double __value2 __attribute__ ((__unused__)); \
- __asm __volatile__ \
- ("fptan" \
- : "=t" (__value2), "=u" (__value) : "0" (__x)); \
- return __value)
-# endif
-# endif /* __FAST_MATH__ */
-
-
-# if __GNUC_PREREQ (3, 4)
-__inline_mathcodeNP2_ (long double, __atan2l, __y, __x,
- return __builtin_atan2l (__y, __x))
-# else
-# define __atan2_code \
- register long double __value; \
- __asm __volatile__ \
- ("fpatan" \
- : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)"); \
- return __value
-# ifdef __FAST_MATH__
-__inline_mathcodeNP2 (atan2, __y, __x, __atan2_code)
-# endif
-__inline_mathcodeNP2_ (long double, __atan2l, __y, __x, __atan2_code)
-# endif
-
-
-# if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)
-__inline_mathcodeNP2 (fmod, __x, __y, \
- register long double __value; \
- __asm __volatile__ \
- ("1: fprem\n\t" \
- "fnstsw %%ax\n\t" \
- "sahf\n\t" \
- "jp 1b" \
- : "=t" (__value) : "0" (__x), "u" (__y) : "ax", "cc"); \
- return __value)
-# endif
-
-
-# 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
-
-# if __GNUC_PREREQ (2, 8)
-__inline_mathcodeNP_ (double, fabs, __x, return __builtin_fabs (__x))
-# ifdef __USE_ISOC99
-__inline_mathcodeNP_ (float, fabsf, __x, return __builtin_fabsf (__x))
-__inline_mathcodeNP_ (long double, fabsl, __x, return __builtin_fabsl (__x))
-# endif
-__inline_mathcodeNP_ (long double, __fabsl, __x, return __builtin_fabsl (__x))
-# else
-__inline_mathop (fabs, "fabs")
-__inline_mathop_ (long double, __fabsl, "fabs")
-# endif
-
-# 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
-
-# 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
-
-# if !__GNUC_PREREQ (3, 4)
-__inline_mathop_declNP (atan, "fld1; fpatan", "0" (__x) : "st(1)")
-# endif
-# endif /* __FAST_MATH__ */
-
-__inline_mathcode_ (long double, __sgn1l, __x, \
- __extension__ union { long double __xld; unsigned int __xi[3]; } __n = \
- { __xld: __x }; \
- __n.__xi[2] = (__n.__xi[2] & 0x8000) | 0x3fff; \
- __n.__xi[1] = 0x80000000; \
- __n.__xi[0] = 0; \
- return __n.__xld)
-
-
-# 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)); \
- return 0.5 * (__exm1 / (__exm1 + 1.0) + __exm1) * __sgn1l (__x))
-
-__inline_mathcodeNP (cosh, __x, \
- register long double __ex = __expl (__x); \
- return 0.5 * (__ex + 1.0 / __ex))
-
-__inline_mathcodeNP (tanh, __x, \
- register long double __exm1 = __expm1l (-__fabsl (__x + __x)); \
- return __exm1 / (__exm1 + 2.0) * __sgn1l (-__x))
-# endif
-
-__inline_mathcodeNP (floor, __x, \
- register long double __value; \
- register int __ignore; \
- unsigned short int __cw; \
- unsigned short int __cwtmp; \
- __asm __volatile ("fnstcw %3\n\t" \
- "movzwl %3, %1\n\t" \
- "andl $0xf3ff, %1\n\t" \
- "orl $0x0400, %1\n\t" /* rounding down */ \
- "movw %w1, %2\n\t" \
- "fldcw %2\n\t" \
- "frndint\n\t" \
- "fldcw %3" \
- : "=t" (__value), "=&q" (__ignore), "=m" (__cwtmp), \
- "=m" (__cw) \
- : "0" (__x)); \
- return __value)
-
-__inline_mathcodeNP (ceil, __x, \
- register long double __value; \
- register int __ignore; \
- unsigned short int __cw; \
- unsigned short int __cwtmp; \
- __asm __volatile ("fnstcw %3\n\t" \
- "movzwl %3, %1\n\t" \
- "andl $0xf3ff, %1\n\t" \
- "orl $0x0800, %1\n\t" /* rounding up */ \
- "movw %w1, %2\n\t" \
- "fldcw %2\n\t" \
- "frndint\n\t" \
- "fldcw %3" \
- : "=t" (__value), "=&q" (__ignore), "=m" (__cwtmp), \
- "=m" (__cw) \
- : "0" (__x)); \
- return __value)
-
-# ifdef __FAST_MATH__
-# define __ldexp_code \
- register long double __value; \
- __asm __volatile__ \
- ("fscale" \
- : "=t" (__value) : "0" (__x), "u" ((long double) __y)); \
- return __value
-
-__MATH_INLINE double
-__NTH (ldexp (double __x, int __y))
-{
- __ldexp_code;
-}
-# endif
-
-
-/* Optimized versions for some non-standardized functions. */
-# ifdef __USE_ISOC99
-
-# 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) */
-
-# if !__GNUC_PREREQ (3, 5)
-__inline_mathcodeNP (log1p, __x, \
- register long double __value; \
- if (__fabsl (__x) >= 1.0 - 0.5 * __M_SQRT2) \
- __value = logl (1.0 + __x); \
- else \
- __asm __volatile__ \
- ("fldln2\n\t" \
- "fxch\n\t" \
- "fyl2xp1" \
- : "=t" (__value) : "0" (__x) : "st(1)"); \
- return __value)
-# endif
-
-
-/* The argument range of the inline version of asinhl is slightly reduced. */
-__inline_mathcodeNP (asinh, __x, \
- register long double __y = __fabsl (__x); \
- return (log1pl (__y * __y / (__libc_sqrtl (__y * __y + 1.0) + 1.0) + __y) \
- * __sgn1l (__x)))
-
-__inline_mathcodeNP (acosh, __x, \
- return logl (__x + __libc_sqrtl (__x - 1.0) * __libc_sqrtl (__x + 1.0)))
-
-__inline_mathcodeNP (atanh, __x, \
- register long double __y = __fabsl (__x); \
- return -0.5 * log1pl (-(__y + __y) / (1.0 + __y)) * __sgn1l (__x))
-
-/* The argument range of the inline version of hypotl is slightly reduced. */
-__inline_mathcodeNP2 (hypot, __x, __y,
- return __libc_sqrtl (__x * __x + __y * __y))
-
-# if !__GNUC_PREREQ (3, 5)
-__inline_mathcodeNP(logb, __x, \
- register long double __value; \
- register long double __junk; \
- __asm __volatile__ \
- ("fxtract\n\t" \
- : "=t" (__junk), "=u" (__value) : "0" (__x)); \
- return __value)
-# endif
-
-# endif
-# endif
-
-# ifdef __USE_ISOC99
-# ifdef __FAST_MATH__
-
-# if !__GNUC_PREREQ (3, 5)
-__inline_mathop_declNP (log2, "fld1; fxch; fyl2x", "0" (__x) : "st(1)")
-# endif
-
-__MATH_INLINE float
-__NTH (ldexpf (float __x, int __y))
-{
- __ldexp_code;
-}
-
-__MATH_INLINE long double
-__NTH (ldexpl (long double __x, int __y))
-{
- __ldexp_code;
-}
-
-__inline_mathopNP (rint, "frndint")
-# endif /* __FAST_MATH__ */
-
-# define __lrint_code \
- long int __lrintres; \
- __asm__ __volatile__ \
- ("fistpl %0" \
- : "=m" (__lrintres) : "t" (__x) : "st"); \
- return __lrintres
-__MATH_INLINE long int
-__NTH (lrintf (float __x))
-{
- __lrint_code;
-}
-__MATH_INLINE long int
-__NTH (lrint (double __x))
-{
- __lrint_code;
-}
-__MATH_INLINE long int
-__NTH (lrintl (long double __x))
-{
- __lrint_code;
-}
-# undef __lrint_code
-
-# define __llrint_code \
- long long int __llrintres; \
- __asm__ __volatile__ \
- ("fistpll %0" \
- : "=m" (__llrintres) : "t" (__x) : "st"); \
- return __llrintres
-__extension__
-__MATH_INLINE long long int
-__NTH (llrintf (float __x))
-{
- __llrint_code;
-}
-__extension__
-__MATH_INLINE long long int
-__NTH (llrint (double __x))
-{
- __llrint_code;
-}
-__extension__
-__MATH_INLINE long long int
-__NTH (llrintl (long double __x))
-{
- __llrint_code;
-}
-# undef __llrint_code
-
-# endif
-
-
-# ifdef __USE_MISC
-
-# if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)
-__inline_mathcodeNP2 (drem, __x, __y, \
- register double __value; \
- register int __clobbered; \
- __asm __volatile__ \
- ("1: fprem1\n\t" \
- "fstsw %%ax\n\t" \
- "sahf\n\t" \
- "jp 1b" \
- : "=t" (__value), "=&a" (__clobbered) : "0" (__x), "u" (__y) : "cc"); \
- return __value)
-# endif
-
-
-/* This function is used in the `isfinite' macro. */
-__MATH_INLINE int
-__NTH (__finite (double __x))
-{
- return (__extension__
- (((((union { double __d; int __i[2]; }) {__d: __x}).__i[1]
- | 0x800fffffu) + 1) >> 31));
-}
-
-# 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__ */
-
-# endif /* __NO_MATH_INLINES */
-
-
-/* This code is used internally in the GNU libc. */
-# ifdef __LIBC_INTERNAL_MATH_INLINES
-__inline_mathop (__ieee754_sqrt, "fsqrt")
-__inline_mathcode2_ (long double, __ieee754_atan2l, __y, __x,
- register long double __value;
- __asm __volatile__ ("fpatan\n\t"
- : "=t" (__value)
- : "0" (__x), "u" (__y) : "st(1)");
- return __value;)
-# endif
-
-#endif /* !__SSE2_MATH__ && !__x86_64__ */
diff --git a/sysdeps/x86/fpu/fix-fp-int-compare-invalid.h b/sysdeps/x86/fpu/fix-fp-int-compare-invalid.h
deleted file mode 100644
index bda247d51f..0000000000
--- a/sysdeps/x86/fpu/fix-fp-int-compare-invalid.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Fix for missing "invalid" exceptions from floating-point
- comparisons. x86 version.
- Copyright (C) 2016-2017 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 FIX_FP_INT_COMPARE_INVALID_H
-#define FIX_FP_INT_COMPARE_INVALID_H 1
-
-/* As of GCC 5, both x87 and SSE comparisons use unordered comparison
- instructions when they should use ordered comparisons
- <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52451>. */
-#define FIX_COMPARE_INVALID 1
-
-#endif /* fix-fp-int-compare-invalid.h */
diff --git a/sysdeps/x86/fpu/include/bits/fenv.h b/sysdeps/x86/fpu/include/bits/fenv.h
deleted file mode 100644
index a39b6fa85d..0000000000
--- a/sysdeps/x86/fpu/include/bits/fenv.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Wrapper for x86 bits/fenv.h for use when building glibc.
- Copyright (C) 1997-2017 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 _BITS_FENV_H
-#include_next <bits/fenv.h>
-
-# ifndef _ISOMAC
-
-/* Ensure __feraiseexcept calls in glibc are optimized the same as
- feraiseexcept calls. */
-
-#ifdef __USE_EXTERN_INLINES
-__BEGIN_DECLS
-
-extern int __REDIRECT_NTH (____feraiseexcept_renamed, (int), __feraiseexcept);
-__extern_inline int
-__NTH (__feraiseexcept (int __excepts))
-{
- if (__builtin_constant_p (__excepts)
- && (__excepts & ~(FE_INVALID | FE_DIVBYZERO)) == 0)
- {
- __feraiseexcept_invalid_divbyzero (__excepts);
- return 0;
- }
-
- return ____feraiseexcept_renamed (__excepts);
-}
-
-__END_DECLS
-#endif
-
-# endif /* _ISOMAC */
-#endif /* bits/fenv.h */
diff --git a/sysdeps/x86/fpu/powl_helper.c b/sysdeps/x86/fpu/powl_helper.c
deleted file mode 100644
index 46f8cd9318..0000000000
--- a/sysdeps/x86/fpu/powl_helper.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* Implement powl for x86 using extra-precision log.
- Copyright (C) 2012-2017 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/>. */
-
-#include <math.h>
-#include <math_private.h>
-#include <stdbool.h>
-
-/* High parts and low parts of -log (k/16), for integer k from 12 to
- 24. */
-
-static const long double powl_log_table[] =
- {
- 0x4.9a58844d36e49e1p-4L, -0x1.0522624fd558f574p-68L,
- 0x3.527da7915b3c6de4p-4L, 0x1.7d4ef4b901b99b9ep-68L,
- 0x2.22f1d044fc8f7bc8p-4L, -0x1.8e97c071a42fc388p-68L,
- 0x1.08598b59e3a0688ap-4L, 0x3.fd9bf503372c12fcp-72L,
- -0x0p+0L, 0x0p+0L,
- -0xf.85186008b15330cp-8L, 0x1.9b47488a6687672cp-72L,
- -0x1.e27076e2af2e5e9ep-4L, -0xa.87ffe1fe9e155dcp-72L,
- -0x2.bfe60e14f27a791p-4L, 0x1.83bebf1bdb88a032p-68L,
- -0x3.91fef8f353443584p-4L, -0xb.b03de5ff734495cp-72L,
- -0x4.59d72aeae98380e8p-4L, 0xc.e0aa3be4747dc1p-72L,
- -0x5.1862f08717b09f4p-4L, -0x2.decdeccf1cd10578p-68L,
- -0x5.ce75fdaef401a738p-4L, -0x9.314feb4fbde5aaep-72L,
- -0x6.7cc8fb2fe612fcbp-4L, 0x2.5ca2642feb779f98p-68L,
- };
-
-/* High 32 bits of log2 (e), and remainder rounded to 64 bits. */
-static const long double log2e_hi = 0x1.71547652p+0L;
-static const long double log2e_lo = 0xb.82fe1777d0ffda1p-36L;
-
-/* Given a number with high part HI and low part LO, add the number X
- to it and store the result in *RHI and *RLO. It is given that
- either |X| < |0.7 * HI|, or HI == LO == 0, and that the values are
- small enough that no overflow occurs. The result does not need to
- be exact to 128 bits; 78-bit accuracy of the final accumulated
- result suffices. */
-
-static inline void
-acc_split (long double *rhi, long double *rlo, long double hi, long double lo,
- long double x)
-{
- long double thi = hi + x;
- long double tlo = (hi - thi) + x + lo;
- *rhi = thi + tlo;
- *rlo = (thi - *rhi) + tlo;
-}
-
-extern long double __powl_helper (long double x, long double y);
-libm_hidden_proto (__powl_helper)
-
-/* Given X a value that is finite and nonzero, or a NaN, and Y a
- finite nonzero value with 0x1p-79 <= |Y| <= 0x1p78, compute X to
- the power Y. */
-
-long double
-__powl_helper (long double x, long double y)
-{
- if (isnan (x))
- return __ieee754_expl (y * __ieee754_logl (x));
- bool negate;
- if (x < 0)
- {
- long double absy = fabsl (y);
- if (absy >= 0x1p64L)
- negate = false;
- else
- {
- unsigned long long yll = absy;
- if (yll != absy)
- return __ieee754_expl (y * __ieee754_logl (x));
- negate = (yll & 1) != 0;
- }
- x = fabsl (x);
- }
- else
- negate = false;
-
- /* We need to compute Y * log2 (X) to at least 64 bits after the
- point for normal results (that is, to at least 78 bits
- precision). */
- int x_int_exponent;
- long double x_frac;
- x_frac = __frexpl (x, &x_int_exponent);
- if (x_frac <= 0x0.aaaaaaaaaaaaaaaap0L) /* 2.0L / 3.0L, rounded down */
- {
- x_frac *= 2.0;
- x_int_exponent--;
- }
-
- long double log_x_frac_hi, log_x_frac_lo;
- /* Determine an initial approximation to log (X_FRAC) using
- POWL_LOG_TABLE, and multiply by a value K/16 to reduce to an
- interval (24/25, 26/25). */
- int k = (int) ((16.0L / x_frac) + 0.5L);
- log_x_frac_hi = powl_log_table[2 * k - 24];
- log_x_frac_lo = powl_log_table[2 * k - 23];
- long double x_frac_low;
- if (k == 16)
- x_frac_low = 0.0L;
- else
- {
- /* Mask off low 5 bits of X_FRAC so the multiplication by K/16
- is exact. These bits are small enough that they can be
- corrected for by adding log2 (e) * X_FRAC_LOW to the final
- result. */
- int32_t se;
- u_int32_t i0, i1;
- GET_LDOUBLE_WORDS (se, i0, i1, x_frac);
- x_frac_low = x_frac;
- i1 &= 0xffffffe0;
- SET_LDOUBLE_WORDS (x_frac, se, i0, i1);
- x_frac_low -= x_frac;
- x_frac_low /= x_frac;
- x_frac *= k / 16.0L;
- }
-
- /* Now compute log (X_FRAC) for X_FRAC in (24/25, 26/25). Separate
- W = X_FRAC - 1 into high 16 bits and remaining bits, so that
- multiplications for low-order power series terms are exact. The
- remaining bits are small enough that adding a 64-bit value of
- log2 (1 + W_LO / (1 + W_HI)) will be a sufficient correction for
- them. */
- long double w = x_frac - 1;
- long double w_hi, w_lo;
- int32_t se;
- u_int32_t i0, i1;
- GET_LDOUBLE_WORDS (se, i0, i1, w);
- i0 &= 0xffff0000;
- i1 = 0;
- SET_LDOUBLE_WORDS (w_hi, se, i0, i1);
- w_lo = w - w_hi;
- long double wp = w_hi;
- acc_split (&log_x_frac_hi, &log_x_frac_lo, log_x_frac_hi, log_x_frac_lo, wp);
- wp *= -w_hi;
- acc_split (&log_x_frac_hi, &log_x_frac_lo, log_x_frac_hi, log_x_frac_lo,
- wp / 2.0L);
- wp *= -w_hi;
- acc_split (&log_x_frac_hi, &log_x_frac_lo, log_x_frac_hi, log_x_frac_lo,
- wp * 0x0.5555p0L); /* -W_HI**3 / 3, high part. */
- acc_split (&log_x_frac_hi, &log_x_frac_lo, log_x_frac_hi, log_x_frac_lo,
- wp * 0x0.5555555555555555p-16L); /* -W_HI**3 / 3, low part. */
- wp *= -w_hi;
- acc_split (&log_x_frac_hi, &log_x_frac_lo, log_x_frac_hi, log_x_frac_lo,
- wp / 4.0L);
- /* Subsequent terms are small enough that they only need be computed
- to 64 bits. */
- for (int i = 5; i <= 17; i++)
- {
- wp *= -w_hi;
- acc_split (&log_x_frac_hi, &log_x_frac_lo, log_x_frac_hi, log_x_frac_lo,
- wp / i);
- }
-
- /* Convert LOG_X_FRAC_HI + LOG_X_FRAC_LO to a base-2 logarithm. */
- long double log2_x_frac_hi, log2_x_frac_lo;
- long double log_x_frac_hi32, log_x_frac_lo64;
- GET_LDOUBLE_WORDS (se, i0, i1, log_x_frac_hi);
- i1 = 0;
- SET_LDOUBLE_WORDS (log_x_frac_hi32, se, i0, i1);
- log_x_frac_lo64 = (log_x_frac_hi - log_x_frac_hi32) + log_x_frac_lo;
- long double log2_x_frac_hi1 = log_x_frac_hi32 * log2e_hi;
- long double log2_x_frac_lo1
- = log_x_frac_lo64 * log2e_hi + log_x_frac_hi * log2e_lo;
- log2_x_frac_hi = log2_x_frac_hi1 + log2_x_frac_lo1;
- log2_x_frac_lo = (log2_x_frac_hi1 - log2_x_frac_hi) + log2_x_frac_lo1;
-
- /* Correct for the masking off of W_LO. */
- long double log2_1p_w_lo;
- asm ("fyl2xp1"
- : "=t" (log2_1p_w_lo)
- : "0" (w_lo / (1.0L + w_hi)), "u" (1.0L)
- : "st(1)");
- acc_split (&log2_x_frac_hi, &log2_x_frac_lo, log2_x_frac_hi, log2_x_frac_lo,
- log2_1p_w_lo);
-
- /* Correct for the masking off of X_FRAC_LOW. */
- acc_split (&log2_x_frac_hi, &log2_x_frac_lo, log2_x_frac_hi, log2_x_frac_lo,
- x_frac_low * M_LOG2El);
-
- /* Add the integer and fractional parts of the base-2 logarithm. */
- long double log2_x_hi, log2_x_lo;
- log2_x_hi = x_int_exponent + log2_x_frac_hi;
- log2_x_lo = ((x_int_exponent - log2_x_hi) + log2_x_frac_hi) + log2_x_frac_lo;
-
- /* Compute the base-2 logarithm of the result. */
- long double log2_res_hi, log2_res_lo;
- long double log2_x_hi32, log2_x_lo64;
- GET_LDOUBLE_WORDS (se, i0, i1, log2_x_hi);
- i1 = 0;
- SET_LDOUBLE_WORDS (log2_x_hi32, se, i0, i1);
- log2_x_lo64 = (log2_x_hi - log2_x_hi32) + log2_x_lo;
- long double y_hi32, y_lo32;
- GET_LDOUBLE_WORDS (se, i0, i1, y);
- i1 = 0;
- SET_LDOUBLE_WORDS (y_hi32, se, i0, i1);
- y_lo32 = y - y_hi32;
- log2_res_hi = log2_x_hi32 * y_hi32;
- log2_res_lo = log2_x_hi32 * y_lo32 + log2_x_lo64 * y;
-
- /* Split the base-2 logarithm of the result into integer and
- fractional parts. */
- long double log2_res_int = __roundl (log2_res_hi);
- long double log2_res_frac = log2_res_hi - log2_res_int + log2_res_lo;
- /* If the integer part is very large, the computed fractional part
- may be outside the valid range for f2xm1. */
- if (fabsl (log2_res_int) > 16500)
- log2_res_frac = 0;
-
- /* Compute the final result. */
- long double res;
- asm ("f2xm1" : "=t" (res) : "0" (log2_res_frac));
- res += 1.0L;
- if (negate)
- res = -res;
- asm ("fscale" : "=t" (res) : "0" (res), "u" (log2_res_int));
- math_check_force_underflow (res);
- return res;
-}
-
-libm_hidden_def (__powl_helper)
diff --git a/sysdeps/x86/fpu/test-fenv-clear-sse.c b/sysdeps/x86/fpu/test-fenv-clear-sse.c
deleted file mode 100644
index 52a1b63c0b..0000000000
--- a/sysdeps/x86/fpu/test-fenv-clear-sse.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Test fesetenv (FE_DFL_ENV) and fesetenv (FE_NOMASK_ENV) clear
- exceptions (bug 19181). SSE version.
- Copyright (C) 2015-2017 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/>. */
-
-#include <cpuid.h>
-#include <stdbool.h>
-
-static bool
-have_sse2 (void)
-{
- unsigned int eax, ebx, ecx, edx;
-
- if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
- return false;
-
- return (edx & bit_SSE2) != 0;
-}
-
-#define CHECK_CAN_TEST \
- do \
- { \
- if (!have_sse2 ()) \
- { \
- puts ("CPU does not support SSE2, cannot test"); \
- return 0; \
- } \
- } \
- while (0)
-
-#include <test-fenv-clear-main.c>
diff --git a/sysdeps/x86/fpu/test-fenv-sse-2.c b/sysdeps/x86/fpu/test-fenv-sse-2.c
deleted file mode 100644
index b5f96850f9..0000000000
--- a/sysdeps/x86/fpu/test-fenv-sse-2.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Test x86-specific floating-point environment (bug 16068): SSE part.
- Copyright (C) 2015-2017 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/>. */
-
-#include <cpuid.h>
-#include <fenv.h>
-#include <float.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-
-static bool
-have_sse2 (void)
-{
- unsigned int eax, ebx, ecx, edx;
-
- if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
- return false;
-
- return (edx & bit_SSE2) != 0;
-}
-
-static uint32_t
-get_sse_mxcsr (void)
-{
- uint32_t temp;
- __asm__ __volatile__ ("stmxcsr %0" : "=m" (temp));
- return temp;
-}
-
-static void
-set_sse_mxcsr (uint32_t val)
-{
- __asm__ __volatile__ ("ldmxcsr %0" : : "m" (val));
-}
-
-static void
-set_sse_mxcsr_bits (uint32_t mask, uint32_t bits)
-{
- uint32_t mxcsr = get_sse_mxcsr ();
- mxcsr = (mxcsr & ~mask) | bits;
- set_sse_mxcsr (mxcsr);
-}
-
-static int
-test_sse_mxcsr_bits (const char *test, uint32_t mask, uint32_t bits)
-{
- uint32_t mxcsr = get_sse_mxcsr ();
- printf ("Testing %s: mxcsr = %x\n", test, mxcsr);
- if ((mxcsr & mask) == bits)
- {
- printf ("PASS: %s\n", test);
- return 0;
- }
- else
- {
- printf ("FAIL: %s\n", test);
- return 1;
- }
-}
-
-#define MXCSR_FZ 0x8000
-#define MXCSR_DAZ 0x40
-#define MXCSR_DE 0x2
-#define MXCSR_DM 0x100
-
-static __attribute__ ((noinline)) int
-sse_tests (void)
-{
- int result = 0;
- fenv_t env1, env2;
- /* Test FZ bit. */
- fegetenv (&env1);
- set_sse_mxcsr_bits (MXCSR_FZ, MXCSR_FZ);
- fegetenv (&env2);
- fesetenv (&env1);
- result |= test_sse_mxcsr_bits ("fesetenv FZ restoration",
- MXCSR_FZ, 0);
- set_sse_mxcsr_bits (MXCSR_FZ, 0);
- fesetenv (&env2);
- result |= test_sse_mxcsr_bits ("fesetenv FZ restoration 2",
- MXCSR_FZ, MXCSR_FZ);
- set_sse_mxcsr_bits (MXCSR_FZ, MXCSR_FZ);
- fesetenv (FE_NOMASK_ENV);
- result |= test_sse_mxcsr_bits ("fesetenv (FE_NOMASK_ENV) FZ restoration",
- MXCSR_FZ, 0);
- set_sse_mxcsr_bits (MXCSR_FZ, MXCSR_FZ);
- fesetenv (FE_DFL_ENV);
- result |= test_sse_mxcsr_bits ("fesetenv (FE_DFL_ENV) FZ restoration",
- MXCSR_FZ, 0);
- /* Test DAZ bit. */
- set_sse_mxcsr_bits (MXCSR_DAZ, MXCSR_DAZ);
- fegetenv (&env2);
- fesetenv (&env1);
- result |= test_sse_mxcsr_bits ("fesetenv DAZ restoration",
- MXCSR_DAZ, 0);
- set_sse_mxcsr_bits (MXCSR_DAZ, 0);
- fesetenv (&env2);
- result |= test_sse_mxcsr_bits ("fesetenv DAZ restoration 2",
- MXCSR_DAZ, MXCSR_DAZ);
- set_sse_mxcsr_bits (MXCSR_DAZ, MXCSR_DAZ);
- fesetenv (FE_NOMASK_ENV);
- result |= test_sse_mxcsr_bits ("fesetenv (FE_NOMASK_ENV) DAZ restoration",
- MXCSR_DAZ, 0);
- set_sse_mxcsr_bits (MXCSR_DAZ, MXCSR_DAZ);
- fesetenv (FE_DFL_ENV);
- result |= test_sse_mxcsr_bits ("fesetenv (FE_DFL_ENV) DAZ restoration",
- MXCSR_DAZ, 0);
- /* Test DM bit. */
- set_sse_mxcsr_bits (MXCSR_DM, 0);
- fegetenv (&env2);
- fesetenv (&env1);
- result |= test_sse_mxcsr_bits ("fesetenv DM restoration",
- MXCSR_DM, MXCSR_DM);
- set_sse_mxcsr_bits (MXCSR_DM, MXCSR_DM);
- fesetenv (&env2);
- result |= test_sse_mxcsr_bits ("fesetenv DM restoration 2",
- MXCSR_DM, 0);
- set_sse_mxcsr_bits (MXCSR_DM, 0);
- /* Presume FE_NOMASK_ENV should leave the "denormal operand"
- exception masked, as not a standard exception. */
- fesetenv (FE_NOMASK_ENV);
- result |= test_sse_mxcsr_bits ("fesetenv (FE_NOMASK_ENV) DM restoration",
- MXCSR_DM, MXCSR_DM);
- set_sse_mxcsr_bits (MXCSR_DM, 0);
- fesetenv (FE_DFL_ENV);
- result |= test_sse_mxcsr_bits ("fesetenv (FE_DFL_ENV) DM restoration",
- MXCSR_DM, MXCSR_DM);
- /* Test DE bit. */
- set_sse_mxcsr_bits (MXCSR_DE, MXCSR_DE);
- fegetenv (&env2);
- fesetenv (&env1);
- result |= test_sse_mxcsr_bits ("fesetenv DE restoration",
- MXCSR_DE, 0);
- set_sse_mxcsr_bits (MXCSR_DE, 0);
- fesetenv (&env2);
- result |= test_sse_mxcsr_bits ("fesetenv DE restoration 2",
- MXCSR_DE, MXCSR_DE);
- set_sse_mxcsr_bits (MXCSR_DE, MXCSR_DE);
- fesetenv (FE_NOMASK_ENV);
- result |= test_sse_mxcsr_bits ("fesetenv (FE_NOMASK_ENV) DE restoration",
- MXCSR_DE, 0);
- set_sse_mxcsr_bits (MXCSR_DE, MXCSR_DE);
- fesetenv (FE_DFL_ENV);
- result |= test_sse_mxcsr_bits ("fesetenv (FE_DFL_ENV) DE restoration",
- MXCSR_DE, 0);
- return result;
-}
-
-static int
-do_test (void)
-{
- if (!have_sse2 ())
- {
- puts ("CPU does not support SSE2, cannot test");
- return 0;
- }
- return sse_tests ();
-}
-
-#define TEST_FUNCTION do_test ()
-#include <test-skeleton.c>
diff --git a/sysdeps/x86/fpu/test-fenv-sse.c b/sysdeps/x86/fpu/test-fenv-sse.c
deleted file mode 100644
index 569db9a674..0000000000
--- a/sysdeps/x86/fpu/test-fenv-sse.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/* Test floating-point environment includes SSE state (bug 16064).
- Copyright (C) 2014-2017 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/>. */
-
-#include <cpuid.h>
-#include <fenv.h>
-#include <float.h>
-#include <stdbool.h>
-#include <stdio.h>
-
-static bool
-have_sse2 (void)
-{
- unsigned int eax, ebx, ecx, edx;
-
- if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
- return false;
-
- return (edx & bit_SSE2) != 0;
-}
-
-static __attribute__ ((noinline)) int
-sse_tests (void)
-{
- int ret = 0;
- fenv_t base_env;
- if (fegetenv (&base_env) != 0)
- {
- puts ("fegetenv (&base_env) failed");
- return 1;
- }
- if (fesetround (FE_UPWARD) != 0)
- {
- puts ("fesetround (FE_UPWARD) failed");
- return 1;
- }
- if (fesetenv (&base_env) != 0)
- {
- puts ("fesetenv (&base_env) failed");
- return 1;
- }
- volatile float a = 1.0f, b = FLT_MIN, c;
- c = a + b;
- if (c != 1.0f)
- {
- puts ("fesetenv did not restore rounding mode");
- ret = 1;
- }
- if (fesetround (FE_DOWNWARD) != 0)
- {
- puts ("fesetround (FE_DOWNWARD) failed");
- return 1;
- }
- if (feupdateenv (&base_env) != 0)
- {
- puts ("feupdateenv (&base_env) failed");
- return 1;
- }
- volatile float d = -FLT_MIN, e;
- e = a + d;
- if (e != 1.0f)
- {
- puts ("feupdateenv did not restore rounding mode");
- ret = 1;
- }
- if (fesetround (FE_UPWARD) != 0)
- {
- puts ("fesetround (FE_UPWARD) failed");
- return 1;
- }
- fenv_t upward_env;
- if (feholdexcept (&upward_env) != 0)
- {
- puts ("feholdexcept (&upward_env) failed");
- return 1;
- }
- if (fesetround (FE_DOWNWARD) != 0)
- {
- puts ("fesetround (FE_DOWNWARD) failed");
- return 1;
- }
- if (fesetenv (&upward_env) != 0)
- {
- puts ("fesetenv (&upward_env) failed");
- return 1;
- }
- e = a + d;
- if (e != 1.0f)
- {
- puts ("fesetenv did not restore rounding mode from feholdexcept");
- ret = 1;
- }
- if (fesetround (FE_UPWARD) != 0)
- {
- puts ("fesetround (FE_UPWARD) failed");
- return 1;
- }
- if (fesetenv (FE_DFL_ENV) != 0)
- {
- puts ("fesetenv (FE_DFL_ENV) failed");
- return 1;
- }
- c = a + b;
- if (c != 1.0f)
- {
- puts ("fesetenv (FE_DFL_ENV) did not restore rounding mode");
- ret = 1;
- }
- return ret;
-}
-
-static int
-do_test (void)
-{
- if (!have_sse2 ())
- {
- puts ("CPU does not support SSE2, cannot test");
- return 0;
- }
- return sse_tests ();
-}
-
-#define TEST_FUNCTION do_test ()
-#include <test-skeleton.c>
diff --git a/sysdeps/x86/fpu/test-fenv-x87.c b/sysdeps/x86/fpu/test-fenv-x87.c
deleted file mode 100644
index 29ae1c8a7e..0000000000
--- a/sysdeps/x86/fpu/test-fenv-x87.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/* Test x86-specific floating-point environment (bug 16068): x87 part.
- Copyright (C) 2015-2017 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/>. */
-
-#include <fenv.h>
-#include <float.h>
-#include <fpu_control.h>
-#include <stdint.h>
-#include <stdio.h>
-
-static uint16_t
-get_x87_cw (void)
-{
- fpu_control_t cw;
- _FPU_GETCW (cw);
- return cw;
-}
-
-static void
-set_x87_cw (uint16_t val)
-{
- fpu_control_t cw = val;
- _FPU_SETCW (cw);
-}
-
-static void
-set_x87_cw_bits (uint16_t mask, uint16_t bits)
-{
- uint16_t cw = get_x87_cw ();
- cw = (cw & ~mask) | bits;
- set_x87_cw (cw);
-}
-
-static int
-test_x87_cw_bits (const char *test, uint16_t mask, uint16_t bits)
-{
- uint16_t cw = get_x87_cw ();
- printf ("Testing %s: cw = %x\n", test, cw);
- if ((cw & mask) == bits)
- {
- printf ("PASS: %s\n", test);
- return 0;
- }
- else
- {
- printf ("FAIL: %s\n", test);
- return 1;
- }
-}
-
-static uint16_t
-get_x87_sw (void)
-{
- uint16_t temp;
- __asm__ __volatile__ ("fnstsw %0" : "=a" (temp));
- return temp;
-}
-
-static void
-set_x87_sw_bits (uint16_t mask, uint16_t bits)
-{
- fenv_t temp;
- __asm__ __volatile__ ("fnstenv %0" : "=m" (temp));
- temp.__status_word = (temp.__status_word & ~mask) | bits;
- __asm__ __volatile__ ("fldenv %0" : : "m" (temp));
-}
-
-static int
-test_x87_sw_bits (const char *test, uint16_t mask, uint16_t bits)
-{
- uint16_t sw = get_x87_sw ();
- printf ("Testing %s: sw = %x\n", test, sw);
- if ((sw & mask) == bits)
- {
- printf ("PASS: %s\n", test);
- return 0;
- }
- else
- {
- printf ("FAIL: %s\n", test);
- return 1;
- }
-}
-
-#define X87_CW_PREC_MASK _FPU_EXTENDED
-
-static int
-do_test (void)
-{
- int result = 0;
- fenv_t env1, env2;
- /* Test precision mask. */
- fegetenv (&env1);
- set_x87_cw_bits (X87_CW_PREC_MASK, _FPU_SINGLE);
- fegetenv (&env2);
- fesetenv (&env1);
- result |= test_x87_cw_bits ("fesetenv precision restoration",
- X87_CW_PREC_MASK, _FPU_EXTENDED);
- set_x87_cw_bits (X87_CW_PREC_MASK, _FPU_EXTENDED);
- fesetenv (&env2);
- result |= test_x87_cw_bits ("fesetenv precision restoration 2",
- X87_CW_PREC_MASK, _FPU_SINGLE);
- set_x87_cw_bits (X87_CW_PREC_MASK, _FPU_DOUBLE);
- fesetenv (FE_NOMASK_ENV);
- result |= test_x87_cw_bits ("fesetenv (FE_NOMASK_ENV) precision restoration",
- X87_CW_PREC_MASK, _FPU_EXTENDED);
- set_x87_cw_bits (X87_CW_PREC_MASK, _FPU_SINGLE);
- fesetenv (FE_DFL_ENV);
- result |= test_x87_cw_bits ("fesetenv (FE_DFL_ENV) precision restoration",
- X87_CW_PREC_MASK, _FPU_EXTENDED);
- /* Test x87 denormal operand masking. */
- set_x87_cw_bits (_FPU_MASK_DM, 0);
- fegetenv (&env2);
- fesetenv (&env1);
- result |= test_x87_cw_bits ("fesetenv denormal mask restoration",
- _FPU_MASK_DM, _FPU_MASK_DM);
- set_x87_cw_bits (_FPU_MASK_DM, _FPU_MASK_DM);
- fesetenv (&env2);
- result |= test_x87_cw_bits ("fesetenv denormal mask restoration 2",
- _FPU_MASK_DM, 0);
- set_x87_cw_bits (_FPU_MASK_DM, 0);
- /* Presume FE_NOMASK_ENV should leave the "denormal operand"
- exception masked, as not a standard exception. */
- fesetenv (FE_NOMASK_ENV);
- result |= test_x87_cw_bits ("fesetenv (FE_NOMASK_ENV) denormal mask "
- "restoration",
- _FPU_MASK_DM, _FPU_MASK_DM);
- set_x87_cw_bits (_FPU_MASK_DM, 0);
- fesetenv (FE_DFL_ENV);
- result |= test_x87_cw_bits ("fesetenv (FE_DFL_ENV) denormal mask "
- "restoration",
- _FPU_MASK_DM, _FPU_MASK_DM);
- /* Test x87 denormal operand exception. */
- set_x87_sw_bits (__FE_DENORM, __FE_DENORM);
- fegetenv (&env2);
- fesetenv (&env1);
- result |= test_x87_sw_bits ("fesetenv denormal exception restoration",
- __FE_DENORM, 0);
- set_x87_sw_bits (__FE_DENORM, 0);
- fesetenv (&env2);
- result |= test_x87_sw_bits ("fesetenv denormal exception restoration 2",
- __FE_DENORM, __FE_DENORM);
- set_x87_sw_bits (__FE_DENORM, __FE_DENORM);
- fesetenv (FE_NOMASK_ENV);
- result |= test_x87_sw_bits ("fesetenv (FE_NOMASK_ENV) exception restoration",
- __FE_DENORM, 0);
- set_x87_sw_bits (__FE_DENORM, __FE_DENORM);
- fesetenv (FE_DFL_ENV);
- result |= test_x87_sw_bits ("fesetenv (FE_DFL_ENV) exception restoration",
- __FE_DENORM, 0);
- return result;
-}
-
-#define TEST_FUNCTION do_test ()
-#include <test-skeleton.c>
diff --git a/sysdeps/x86/fpu/test-flt-eval-method-387.c b/sysdeps/x86/fpu/test-flt-eval-method-387.c
deleted file mode 100644
index 2fb7acfb76..0000000000
--- a/sysdeps/x86/fpu/test-flt-eval-method-387.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <test-flt-eval-method.c>
diff --git a/sysdeps/x86/fpu/test-flt-eval-method-sse.c b/sysdeps/x86/fpu/test-flt-eval-method-sse.c
deleted file mode 100644
index 2fb7acfb76..0000000000
--- a/sysdeps/x86/fpu/test-flt-eval-method-sse.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <test-flt-eval-method.c>
diff --git a/sysdeps/x86/fpu/test-math-vector-sincos.h b/sysdeps/x86/fpu/test-math-vector-sincos.h
deleted file mode 100644
index 95282a3ac7..0000000000
--- a/sysdeps/x86/fpu/test-math-vector-sincos.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* Wrappers definitions for tests of ABI of vector sincos/sincosf having
- vector declaration "#pragma omp declare simd notinbranch".
- Copyright (C) 2016-2017 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 INIT_VEC_PTRS_LOOP(vec, val, len) \
- do \
- { \
- union { VEC_INT_TYPE v; __typeof__ ((val)[0]) *a[(len)]; } u; \
- for (i = 0; i < len; i++) \
- u.a[i] = &(val)[i]; \
- (vec) = u.v; \
- } \
- while (0)
-
-/* Wrapper for vector sincos/sincosf compatible with x86_64 and x32 variants
- of _ZGVbN2vvv_sincos, _ZGVdN4vvv_sincos, _ZGVeN8vvv_sincos;
- x32 variants of _ZGVbN4vvv_sincosf, _ZGVcN4vvv_sincos, _ZGVdN8vvv_sincosf,
- _ZGVeN16vvv_sincosf. */
-#define VECTOR_WRAPPER_fFF_2(scalar_func, vector_func) \
-extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE); \
-void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1) \
-{ \
- int i; \
- FLOAT r_loc[VEC_LEN], r1_loc[VEC_LEN]; \
- VEC_TYPE mx; \
- VEC_INT_TYPE mr, mr1; \
- INIT_VEC_LOOP (mx, x, VEC_LEN); \
- INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN); \
- INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN); \
- vector_func (mx, mr, mr1); \
- TEST_VEC_LOOP (r_loc, VEC_LEN); \
- TEST_VEC_LOOP (r1_loc, VEC_LEN); \
- *r = r_loc[0]; \
- *r1 = r1_loc[0]; \
- return; \
-}
-
-/* Wrapper for vector sincos/sincosf compatible with x86_64 variants of
- _ZGVcN4vvv_sincos, _ZGVeN16vvv_sincosf, _ZGVbN4vvv_sincosf,
- _ZGVdN8vvv_sincosf, _ZGVcN8vvv_sincosf. */
-#define VECTOR_WRAPPER_fFF_3(scalar_func, vector_func) \
-extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE, \
- VEC_INT_TYPE, VEC_INT_TYPE); \
-void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1) \
-{ \
- int i; \
- FLOAT r_loc[VEC_LEN/2], r1_loc[VEC_LEN/2]; \
- VEC_TYPE mx; \
- VEC_INT_TYPE mr, mr1; \
- INIT_VEC_LOOP (mx, x, VEC_LEN); \
- INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN/2); \
- INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN/2); \
- vector_func (mx, mr, mr, mr1, mr1); \
- TEST_VEC_LOOP (r_loc, VEC_LEN/2); \
- TEST_VEC_LOOP (r1_loc, VEC_LEN/2); \
- *r = r_loc[0]; \
- *r1 = r1_loc[0]; \
- return; \
-}
-
-/* Wrapper for vector sincosf compatible with x86_64 variant of
- _ZGVcN8vvv_sincosf. */
-#define VECTOR_WRAPPER_fFF_4(scalar_func, vector_func) \
-extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE, \
- VEC_INT_TYPE, VEC_INT_TYPE, \
- VEC_INT_TYPE, VEC_INT_TYPE, \
- VEC_INT_TYPE, VEC_INT_TYPE); \
-void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1) \
-{ \
- int i; \
- FLOAT r_loc[VEC_LEN/4], r1_loc[VEC_LEN/4]; \
- VEC_TYPE mx; \
- VEC_INT_TYPE mr, mr1; \
- INIT_VEC_LOOP (mx, x, VEC_LEN); \
- INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN/4); \
- INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN/4); \
- vector_func (mx, mr, mr, mr, mr, mr1, mr1, mr1, mr1); \
- TEST_VEC_LOOP (r_loc, VEC_LEN/4); \
- TEST_VEC_LOOP (r1_loc, VEC_LEN/4); \
- *r = r_loc[0]; \
- *r1 = r1_loc[0]; \
- return; \
-}