mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-02 09:40:13 +00:00
700593fdd7
Remove the now unused target specific__ieee754_sqrt(f/l) inlines. Also remove inlines of sqrt which are for really old GCC versions. Removing these is desirable, under the general principle of leaving such inlining to the compiler rather than trying to do it in installed headers, especially when only very old compilers are affected. Note that removing inlines for __ieee754_sqrt disables inlining in the sqrt wrapper functions. Given the sqrt function will typically only be called for negative arguments, it doesn't matter whether the inlining happens or not. * sysdeps/aarch64/fpu/math_private.h (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. * sysdeps/alpha/fpu/math_private.h (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. * sysdeps/generic/math-type-macros.h (M_SQRT): Use sqrt. * sysdeps/m68k/m680x0/fpu/mathimpl.h (__ieee754_sqrt): Remove. * sysdeps/powerpc/fpu/math_private.h (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. * sysdeps/s390/fpu/bits/mathinline.h: Remove file. * sysdeps/sparc/fpu/bits/mathinline.h (sqrt) Remove. (sqrtf): Remove. (sqrtl): Remove. (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. (__ieee754_sqrtl): Remove. * sysdeps/m68k/m680x0/fpu/mathimpl.h (__ieee754_sqrt): Remove. * sysdeps/x86/fpu/math_private.h (__ieee754_sqrt): Remove. * sysdeps/x86_64/fpu/math_private.h (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. (__ieee754_sqrtl): Remove.
102 lines
2.3 KiB
C
102 lines
2.3 KiB
C
#ifndef X86_64_MATH_PRIVATE_H
|
|
#define X86_64_MATH_PRIVATE_H 1
|
|
|
|
/* We can do a few things better on x86-64. */
|
|
|
|
#if defined __AVX__ || defined SSE2AVX
|
|
# define MOVD "vmovd"
|
|
# define MOVQ "vmovq"
|
|
#else
|
|
# define MOVD "movd"
|
|
# define MOVQ "movq"
|
|
#endif
|
|
|
|
/* Direct movement of float into integer register. */
|
|
#define EXTRACT_WORDS64(i, d) \
|
|
do { \
|
|
int64_t i_; \
|
|
asm (MOVQ " %1, %0" : "=rm" (i_) : "x" ((double) (d))); \
|
|
(i) = i_; \
|
|
} while (0)
|
|
|
|
/* And the reverse. */
|
|
#define INSERT_WORDS64(d, i) \
|
|
do { \
|
|
int64_t i_ = i; \
|
|
double d__; \
|
|
asm (MOVQ " %1, %0" : "=x" (d__) : "rm" (i_)); \
|
|
d = d__; \
|
|
} while (0)
|
|
|
|
/* Direct movement of float into integer register. */
|
|
#define GET_FLOAT_WORD(i, d) \
|
|
do { \
|
|
int i_; \
|
|
asm (MOVD " %1, %0" : "=rm" (i_) : "x" ((float) (d))); \
|
|
(i) = i_; \
|
|
} while (0)
|
|
|
|
/* And the reverse. */
|
|
#define SET_FLOAT_WORD(f, i) \
|
|
do { \
|
|
int i_ = i; \
|
|
float f__; \
|
|
asm (MOVD " %1, %0" : "=x" (f__) : "rm" (i_)); \
|
|
f = f__; \
|
|
} while (0)
|
|
|
|
#include <sysdeps/i386/fpu/fenv_private.h>
|
|
#include_next <math_private.h>
|
|
|
|
#ifdef __SSE4_1__
|
|
extern __always_inline double
|
|
__rint (double d)
|
|
{
|
|
double res;
|
|
# if defined __AVX__ || defined SSE2AVX
|
|
asm ("vroundsd $4, %1, %0, %0" : "=x" (res) : "xm" (d));
|
|
# else
|
|
asm ("roundsd $4, %1, %0" : "=x" (res) : "xm" (d));
|
|
# endif
|
|
return res;
|
|
}
|
|
|
|
extern __always_inline float
|
|
__rintf (float d)
|
|
{
|
|
float res;
|
|
# if defined __AVX__ || defined SSE2AVX
|
|
asm ("vroundss $4, %1, %0, %0" : "=x" (res) : "xm" (d));
|
|
# else
|
|
asm ("roundss $4, %1, %0" : "=x" (res) : "xm" (d));
|
|
# endif
|
|
return res;
|
|
}
|
|
|
|
extern __always_inline double
|
|
__floor (double d)
|
|
{
|
|
double res;
|
|
# if defined __AVX__ || defined SSE2AVX
|
|
asm ("vroundsd $1, %1, %0, %0" : "=x" (res) : "xm" (d));
|
|
# else
|
|
asm ("roundsd $1, %1, %0" : "=x" (res) : "xm" (d));
|
|
# endif
|
|
return res;
|
|
}
|
|
|
|
extern __always_inline float
|
|
__floorf (float d)
|
|
{
|
|
float res;
|
|
# if defined __AVX__ || defined SSE2AVX
|
|
asm ("vroundss $1, %1, %0, %0" : "=x" (res) : "xm" (d));
|
|
# else
|
|
asm ("roundss $1, %1, %0" : "=x" (res) : "xm" (d));
|
|
# endif
|
|
return res;
|
|
}
|
|
#endif /* __SSE4_1__ */
|
|
|
|
#endif /* X86_64_MATH_PRIVATE_H */
|