mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
x86_64: Convert __rint* and __floor* from macros to inlines.
This commit is contained in:
parent
64e21edef1
commit
15194b4b3d
@ -1,5 +1,9 @@
|
||||
2012-03-08 Richard Henderson <rth@twiddle.net>
|
||||
|
||||
* sysdeps/x86_64/fpu/math_private.h (__rint): Convert from macro
|
||||
to inline function.
|
||||
(__rintf, __floor, __floorf): Likewise.
|
||||
|
||||
* sysdeps/x86_64/fpu/math_private.h (__ieee754_sqrt): Convert from
|
||||
macro to inline function.
|
||||
(__ieee754_sqrtf, __ieee754_sqrtl): Likewise.
|
||||
|
@ -123,60 +123,54 @@ __ieee754_sqrtl (long double d)
|
||||
}
|
||||
|
||||
#ifdef __SSE4_1__
|
||||
# ifndef __rint
|
||||
# if defined __AVX__ || defined SSE2AVX
|
||||
# define __rint(d) \
|
||||
({ double __res; \
|
||||
asm ("vroundsd $4, %1, %0, %0" : "=x" (__res) : "xm" ((double) (d))); \
|
||||
__res; })
|
||||
# else
|
||||
# define __rint(d) \
|
||||
({ double __res; \
|
||||
asm ("roundsd $4, %1, %0" : "=x" (__res) : "xm" ((double) (d))); \
|
||||
__res; })
|
||||
# endif
|
||||
# endif
|
||||
# ifndef __rintf
|
||||
# if defined __AVX__ || defined SSE2AVX
|
||||
# define __rintf(d) \
|
||||
({ float __res; \
|
||||
asm ("vroundss $4, %1, %0, %0" : "=x" (__res) : "xm" ((float) (d))); \
|
||||
__res; })
|
||||
# else
|
||||
# define __rintf(d) \
|
||||
({ float __res; \
|
||||
asm ("roundss $4, %1, %0" : "=x" (__res) : "xm" ((float) (d))); \
|
||||
__res; })
|
||||
# endif
|
||||
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;
|
||||
}
|
||||
|
||||
# ifndef __floor
|
||||
# if defined __AVX__ || defined SSE2AVX
|
||||
# define __floor(d) \
|
||||
({ double __res; \
|
||||
asm ("vroundsd $1, %1, %0, %0" : "=x" (__res) : "xm" ((double) (d))); \
|
||||
__res; })
|
||||
# else
|
||||
# define __floor(d) \
|
||||
({ double __res; \
|
||||
asm ("roundsd $1, %1, %0" : "=x" (__res) : "xm" ((double) (d))); \
|
||||
__res; })
|
||||
# endif
|
||||
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
|
||||
# ifndef __floorf
|
||||
# if defined __AVX__ || defined SSE2AVX
|
||||
# define __floorf(d) \
|
||||
({ float __res; \
|
||||
asm ("vroundss $1, %1, %0, %0" : "=x" (__res) : "xm" ((float) (d))); \
|
||||
__res; })
|
||||
# else
|
||||
# define __floorf(d) \
|
||||
({ float __res; \
|
||||
asm ("roundss $1, %1, %0" : "=x" (__res) : "xm" ((float) (d))); \
|
||||
__res; })
|
||||
# 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
|
||||
#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__ */
|
||||
|
||||
|
||||
/* Specialized variants of the <fenv.h> interfaces which only handle
|
||||
|
Loading…
Reference in New Issue
Block a user