1 #ifndef X86_64_MATH_PRIVATE_H
2 #define X86_64_MATH_PRIVATE_H 1
4 /* We can do a few things better on x86-64. */
6 #if defined __AVX__ || defined SSE2AVX
14 /* Direct movement of float into integer register. */
15 #define EXTRACT_WORDS64(i, d) \
18 asm (MOVQ " %1, %0" : "=rm" (i_) : "x" ((double) (d))); \
22 /* And the reverse. */
23 #define INSERT_WORDS64(d, i) \
27 asm (MOVQ " %1, %0" : "=x" (d__) : "rm" (i_)); \
31 /* Direct movement of float into integer register. */
32 #define GET_FLOAT_WORD(i, d) \
35 asm (MOVD " %1, %0" : "=rm" (i_) : "x" ((float) (d))); \
39 /* And the reverse. */
40 #define SET_FLOAT_WORD(f, i) \
44 asm (MOVD " %1, %0" : "=x" (f__) : "rm" (i_)); \
48 #include <sysdeps/i386/fpu/fenv_private.h>
49 #include_next <math_private.h>
51 extern __always_inline
double
52 __ieee754_sqrt (double d
)
55 #if defined __AVX__ || defined SSE2AVX
56 asm ("vsqrtsd %1, %0, %0" : "=x" (res
) : "xm" (d
));
58 asm ("sqrtsd %1, %0" : "=x" (res
) : "xm" (d
));
63 extern __always_inline
float
64 __ieee754_sqrtf (float d
)
67 #if defined __AVX__ || defined SSE2AVX
68 asm ("vsqrtss %1, %0, %0" : "=x" (res
) : "xm" (d
));
70 asm ("sqrtss %1, %0" : "=x" (res
) : "xm" (d
));
75 extern __always_inline
long double
76 __ieee754_sqrtl (long double d
)
79 asm ("fsqrt" : "=t" (res
) : "0" (d
));
84 extern __always_inline
double
88 # if defined __AVX__ || defined SSE2AVX
89 asm ("vroundsd $4, %1, %0, %0" : "=x" (res
) : "xm" (d
));
91 asm ("roundsd $4, %1, %0" : "=x" (res
) : "xm" (d
));
96 extern __always_inline
float
100 # if defined __AVX__ || defined SSE2AVX
101 asm ("vroundss $4, %1, %0, %0" : "=x" (res
) : "xm" (d
));
103 asm ("roundss $4, %1, %0" : "=x" (res
) : "xm" (d
));
108 extern __always_inline
double
112 # if defined __AVX__ || defined SSE2AVX
113 asm ("vroundsd $1, %1, %0, %0" : "=x" (res
) : "xm" (d
));
115 asm ("roundsd $1, %1, %0" : "=x" (res
) : "xm" (d
));
120 extern __always_inline
float
124 # if defined __AVX__ || defined SSE2AVX
125 asm ("vroundss $1, %1, %0, %0" : "=x" (res
) : "xm" (d
));
127 asm ("roundss $1, %1, %0" : "=x" (res
) : "xm" (d
));
131 #endif /* __SSE4_1__ */
133 #endif /* X86_64_MATH_PRIVATE_H */