unsigned int xnew_exc;
/* Get the current MXCSR. */
- __asm__ ("stmxcsr %0" : "=m" (xnew_exc));
+ __asm__ ("%vstmxcsr %0" : "=m" (xnew_exc));
/* Clear the relevant bits. */
xnew_exc &= ~excepts;
/* Put the new data in effect. */
- __asm__ ("ldmxcsr %0" : : "m" (xnew_exc));
+ __asm__ ("%vldmxcsr %0" : : "m" (xnew_exc));
}
/* Success. */
unsigned int xnew_exc;
/* Get the current control word. */
- __asm__ ("stmxcsr %0" : "=m" (xnew_exc));
+ __asm__ ("%vstmxcsr %0" : "=m" (xnew_exc));
xnew_exc |= excepts << 7;
- __asm__ ("ldmxcsr %0" : : "m" (xnew_exc));
+ __asm__ ("%vldmxcsr %0" : : "m" (xnew_exc));
}
return old_exc;
unsigned int xnew_exc;
/* Get the current control word. */
- __asm__ ("stmxcsr %0" : "=m" (xnew_exc));
+ __asm__ ("%vstmxcsr %0" : "=m" (xnew_exc));
xnew_exc &= ~(excepts << 7);
- __asm__ ("ldmxcsr %0" : : "m" (xnew_exc));
+ __asm__ ("%vldmxcsr %0" : : "m" (xnew_exc));
}
return old_exc;
__asm__ ("fldenv %0" : : "m" (*envp));
if (CPU_FEATURE_USABLE (SSE))
- __asm__ ("stmxcsr %0" : "=m" (envp->__eip));
+ __asm__ ("%vstmxcsr %0" : "=m" (envp->__eip));
/* Success. */
return 0;
{
_FPU_GETCW (modep->__control_word);
if (CPU_FEATURE_USABLE (SSE))
- __asm__ ("stmxcsr %0" : "=m" (modep->__mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (modep->__mxcsr));
return 0;
}
unsigned int xwork;
/* Get the current control word. */
- __asm__ ("stmxcsr %0" : "=m" (envp->__eip));
+ __asm__ ("%vstmxcsr %0" : "=m" (envp->__eip));
/* Set all exceptions to non-stop and clear them. */
xwork = (envp->__eip | 0x1f80) & ~0x3f;
- __asm__ ("ldmxcsr %0" : : "m" (xwork));
+ __asm__ ("%vldmxcsr %0" : : "m" (xwork));
}
return 0;
if (CPU_FEATURE_USABLE (SSE))
{
unsigned int mxcsr;
- __asm__ ("stmxcsr %0" : "=m" (mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
if (envp == FE_DFL_ENV)
{
else
mxcsr = envp->__eip;
- __asm__ ("ldmxcsr %0" : : "m" (mxcsr));
+ __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
}
/* Success. */
{
/* Get the control word of the SSE unit. */
unsigned int mxcsr;
- __asm__ ("stmxcsr %0" : "=m" (mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
/* Set relevant flags. */
mxcsr |= excepts;
/* Put the new data in effect. */
- __asm__ ("ldmxcsr %0" : : "m" (mxcsr));
+ __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
}
else
{
if (CPU_FEATURE_USABLE (SSE))
{
unsigned int mxcsr;
- __asm__ ("stmxcsr %0" : "=m" (mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
/* Preserve SSE exception flags but restore other state in
MXCSR. */
mxcsr &= FE_ALL_EXCEPT_X86;
mxcsr |= FE_ALL_EXCEPT_X86 << 7;
else
mxcsr |= modep->__mxcsr & ~FE_ALL_EXCEPT_X86;
- __asm__ ("ldmxcsr %0" : : "m" (mxcsr));
+ __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
}
return 0;
}
{
unsigned int xcw;
- __asm__ ("stmxcsr %0" : "=m" (xcw));
+ __asm__ ("%vstmxcsr %0" : "=m" (xcw));
xcw &= ~0x6000;
xcw |= round << 3;
- __asm__ ("ldmxcsr %0" : : "m" (xcw));
+ __asm__ ("%vldmxcsr %0" : : "m" (xcw));
}
return 0;
/* If the CPU supports SSE we test the MXCSR as well. */
if (CPU_FEATURE_USABLE (SSE))
- __asm__ ("stmxcsr %0" : "=m" (xtemp));
+ __asm__ ("%vstmxcsr %0" : "=m" (xtemp));
temp = (temp | xtemp) & FE_ALL_EXCEPT;
unsigned int sse_exc;
/* Get the current MXCSR. */
- __asm__ ("stmxcsr %0" : "=m" (sse_exc));
+ __asm__ ("%vstmxcsr %0" : "=m" (sse_exc));
*flagp |= sse_exc & excepts & FE_ALL_EXCEPT;
}
__asm__ ("fldenv %0" : : "m" (temp));
/* And now similarly for SSE. */
- __asm__ ("stmxcsr %0" : "=m" (mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
/* Clear or set relevant flags. */
mxcsr ^= (mxcsr ^ *flagp) & excepts;
/* Put the new data in effect. */
- __asm__ ("ldmxcsr %0" : : "m" (mxcsr));
+ __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
}
else
{
/* If the CPU supports SSE we test the MXCSR as well. */
if (CPU_FEATURE_USABLE (SSE))
- __asm__ ("stmxcsr %0" : "=m" (xtemp));
+ __asm__ ("%vstmxcsr %0" : "=m" (xtemp));
return (temp | xtemp) & excepts & FE_ALL_EXCEPT;
}
unsigned int xnew_exc;
/* Get the current MXCSR. */
- __asm__ ("stmxcsr %0" : "=m" (xnew_exc));
+ __asm__ ("%vstmxcsr %0" : "=m" (xnew_exc));
xnew_exc &= ~((0xc00 << 3) | (FE_ALL_EXCEPT << 7));
xnew_exc |= ((set & 0xc00) << 3) | ((set & FE_ALL_EXCEPT) << 7);
- __asm__ ("ldmxcsr %0" : : "m" (xnew_exc));
+ __asm__ ("%vldmxcsr %0" : : "m" (xnew_exc));
}
}
need not care for both the 387 and the sse unit, only the one we're
actually using. */
-#if defined __AVX__ || defined SSE2AVX
-# define STMXCSR "vstmxcsr"
-# define LDMXCSR "vldmxcsr"
-#else
-# define STMXCSR "stmxcsr"
-# define LDMXCSR "ldmxcsr"
-#endif
-
static __always_inline void
libc_feholdexcept_sse (fenv_t *e)
{
unsigned int mxcsr;
- asm (STMXCSR " %0" : "=m" (mxcsr));
+ asm ("%vstmxcsr %0" : "=m" (mxcsr));
e->__mxcsr = mxcsr;
mxcsr = (mxcsr | 0x1f80) & ~0x3f;
- asm volatile (LDMXCSR " %0" : : "m" (mxcsr));
+ asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
}
static __always_inline void
libc_fesetround_sse (int r)
{
unsigned int mxcsr;
- asm (STMXCSR " %0" : "=m" (mxcsr));
+ asm ("%vstmxcsr %0" : "=m" (mxcsr));
mxcsr = (mxcsr & ~0x6000) | (r << 3);
- asm volatile (LDMXCSR " %0" : : "m" (mxcsr));
+ asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
}
static __always_inline void
libc_feholdexcept_setround_sse (fenv_t *e, int r)
{
unsigned int mxcsr;
- asm (STMXCSR " %0" : "=m" (mxcsr));
+ asm ("%vstmxcsr %0" : "=m" (mxcsr));
e->__mxcsr = mxcsr;
mxcsr = ((mxcsr | 0x1f80) & ~0x603f) | (r << 3);
- asm volatile (LDMXCSR " %0" : : "m" (mxcsr));
+ asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
}
/* Set both rounding mode and precision. A convenience function for use
libc_fetestexcept_sse (int e)
{
unsigned int mxcsr;
- asm volatile (STMXCSR " %0" : "=m" (mxcsr));
+ asm volatile ("%vstmxcsr %0" : "=m" (mxcsr));
return mxcsr & e & FE_ALL_EXCEPT;
}
static __always_inline void
libc_fesetenv_sse (fenv_t *e)
{
- asm volatile (LDMXCSR " %0" : : "m" (e->__mxcsr));
+ asm volatile ("%vldmxcsr %0" : : "m" (e->__mxcsr));
}
static __always_inline void
libc_feupdateenv_test_sse (fenv_t *e, int ex)
{
unsigned int mxcsr, old_mxcsr, cur_ex;
- asm volatile (STMXCSR " %0" : "=m" (mxcsr));
+ asm volatile ("%vstmxcsr %0" : "=m" (mxcsr));
cur_ex = mxcsr & FE_ALL_EXCEPT;
/* Merge current exceptions with the old environment. */
old_mxcsr = e->__mxcsr;
mxcsr = old_mxcsr | cur_ex;
- asm volatile (LDMXCSR " %0" : : "m" (mxcsr));
+ asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
/* Raise SIGFPE for any new exceptions since the hold. Expect that
the normal environment has all exceptions masked. */
libc_feholdsetround_sse (fenv_t *e, int r)
{
unsigned int mxcsr;
- asm (STMXCSR " %0" : "=m" (mxcsr));
+ asm ("%vstmxcsr %0" : "=m" (mxcsr));
e->__mxcsr = mxcsr;
mxcsr = (mxcsr & ~0x6000) | (r << 3);
- asm volatile (LDMXCSR " %0" : : "m" (mxcsr));
+ asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
}
static __always_inline void
libc_feresetround_sse (fenv_t *e)
{
unsigned int mxcsr;
- asm (STMXCSR " %0" : "=m" (mxcsr));
+ asm ("%vstmxcsr %0" : "=m" (mxcsr));
mxcsr = (mxcsr & ~0x6000) | (e->__mxcsr & 0x6000);
- asm volatile (LDMXCSR " %0" : : "m" (mxcsr));
+ asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
}
static __always_inline void
libc_feholdexcept_setround_sse_ctx (struct rm_ctx *ctx, int r)
{
unsigned int mxcsr, new_mxcsr;
- asm (STMXCSR " %0" : "=m" (mxcsr));
+ asm ("%vstmxcsr %0" : "=m" (mxcsr));
new_mxcsr = ((mxcsr | 0x1f80) & ~0x603f) | (r << 3);
ctx->env.__mxcsr = mxcsr;
if (__glibc_unlikely (mxcsr != new_mxcsr))
{
- asm volatile (LDMXCSR " %0" : : "m" (new_mxcsr));
+ asm volatile ("%vldmxcsr %0" : : "m" (new_mxcsr));
ctx->updated_status = true;
}
else
{
unsigned int mxcsr, new_mxcsr;
- asm (STMXCSR " %0" : "=m" (mxcsr));
+ asm ("%vstmxcsr %0" : "=m" (mxcsr));
new_mxcsr = (mxcsr & ~0x6000) | (r << 3);
ctx->env.__mxcsr = mxcsr;
if (__glibc_unlikely (new_mxcsr != mxcsr))
{
- asm volatile (LDMXCSR " %0" : : "m" (new_mxcsr));
+ asm volatile ("%vldmxcsr %0" : : "m" (new_mxcsr));
ctx->updated_status = true;
}
else
# define FP_RND_MASK 0x6000
-# ifdef __AVX__
-# define AVX_INSN_PREFIX "v"
-# else
-# define AVX_INSN_PREFIX ""
-# endif
-
# define FP_INIT_ROUNDMODE \
do { \
- __asm__ __volatile__ (AVX_INSN_PREFIX "stmxcsr\t%0" : "=m" (_fcw)); \
+ __asm__ __volatile__ ("%vstmxcsr\t%0" : "=m" (_fcw)); \
} while (0)
#else
# define _FP_W_TYPE_SIZE 32
get_sse_mxcsr (void)
{
uint32_t temp;
- __asm__ __volatile__ ("stmxcsr %0" : "=m" (temp));
+ __asm__ __volatile__ ("%vstmxcsr %0" : "=m" (temp));
return temp;
}
static void
set_sse_mxcsr (uint32_t val)
{
- __asm__ __volatile__ ("ldmxcsr %0" : : "m" (val));
+ __asm__ __volatile__ ("%vldmxcsr %0" : : "m" (val));
}
static void
__asm__ ("fldenv %0" : : "m" (temp));
/* And the same procedure for SSE. */
- __asm__ ("stmxcsr %0" : "=m" (mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
/* Clear the relevant bits. */
mxcsr &= ~excepts;
/* And put them into effect. */
- __asm__ ("ldmxcsr %0" : : "m" (mxcsr));
+ __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
/* Success. */
return 0;
__asm__ ("fldcw %0" : : "m" (new_exc));
/* And now the same for the SSE MXCSR register. */
- __asm__ ("stmxcsr %0" : "=m" (new));
+ __asm__ ("%vstmxcsr %0" : "=m" (new));
/* The SSE exception masks are shifted by 7 bits. */
new |= excepts << 7;
- __asm__ ("ldmxcsr %0" : : "m" (new));
+ __asm__ ("%vldmxcsr %0" : : "m" (new));
return old_exc;
}
__asm__ ("fldcw %0" : : "m" (new_exc));
/* And now the same for the SSE MXCSR register. */
- __asm__ ("stmxcsr %0" : "=m" (new));
+ __asm__ ("%vstmxcsr %0" : "=m" (new));
/* The SSE exception masks are shifted by 7 bits. */
new &= ~(excepts << 7);
- __asm__ ("ldmxcsr %0" : : "m" (new));
+ __asm__ ("%vldmxcsr %0" : : "m" (new));
return old_exc;
}
/* fnstenv changes the exception mask, so load back the
stored environment. */
"fldenv %0\n"
- "stmxcsr %1" : "=m" (*envp), "=m" (envp->__mxcsr));
+ "%vstmxcsr %1" : "=m" (*envp), "=m" (envp->__mxcsr));
/* Success. */
return 0;
fegetmode (femode_t *modep)
{
_FPU_GETCW (modep->__control_word);
- __asm__ ("stmxcsr %0" : "=m" (modep->__mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (modep->__mxcsr));
return 0;
}
/* Store the environment. Recall that fnstenv has a side effect of
masking all exceptions. Then clear all exceptions. */
__asm__ ("fnstenv %0\n\t"
- "stmxcsr %1\n\t"
+ "%vstmxcsr %1\n\t"
"fnclex"
: "=m" (*envp), "=m" (envp->__mxcsr));
/* Set the SSE MXCSR register. */
mxcsr = (envp->__mxcsr | 0x1f80) & ~0x3f;
- __asm__ ("ldmxcsr %0" : : "m" (mxcsr));
+ __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
return 0;
}
Therefore, we get the current environment and replace the values
we want to use from the environment specified by the parameter. */
__asm__ ("fnstenv %0\n"
- "stmxcsr %1" : "=m" (temp), "=m" (temp.__mxcsr));
+ "%vstmxcsr %1" : "=m" (temp), "=m" (temp.__mxcsr));
if (envp == FE_DFL_ENV)
{
}
__asm__ ("fldenv %0\n"
- "ldmxcsr %1" : : "m" (temp), "m" (temp.__mxcsr));
+ "%vldmxcsr %1" : : "m" (temp), "m" (temp.__mxcsr));
/* Success. */
return 0;
{
unsigned int mxcsr;
- __asm__ ("stmxcsr %0" : "=m" (mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
mxcsr |= excepts & FE_ALL_EXCEPT;
- __asm__ ("ldmxcsr %0" : : "m" (mxcsr));
+ __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
return 0;
}
{
fpu_control_t cw;
unsigned int mxcsr;
- __asm__ ("stmxcsr %0" : "=m" (mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
/* Preserve SSE exception flags but restore other state in
MXCSR. */
mxcsr &= FE_ALL_EXCEPT_X86;
mxcsr |= modep->__mxcsr & ~FE_ALL_EXCEPT_X86;
}
_FPU_SETCW (cw);
- __asm__ ("ldmxcsr %0" : : "m" (mxcsr));
+ __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
return 0;
}
/* And now the MSCSR register for SSE, the precision is at different bit
positions in the different units, we need to shift it 3 bits. */
- asm ("stmxcsr %0" : "=m" (mxcsr));
+ asm ("%vstmxcsr %0" : "=m" (mxcsr));
mxcsr &= ~ 0x6000;
mxcsr |= round << 3;
- asm ("ldmxcsr %0" : : "m" (mxcsr));
+ asm ("%vldmxcsr %0" : : "m" (mxcsr));
return 0;
}
unsigned int xtemp;
/* Save current exceptions. */
- __asm__ ("fnstsw %0\n\tstmxcsr %1" : "=m" (temp), "=m" (xtemp));
+ __asm__ ("fnstsw %0\n\t%vstmxcsr %1" : "=m" (temp), "=m" (xtemp));
temp = (temp | xtemp) & FE_ALL_EXCEPT;
/* Install new environment. */
/* Get the current exceptions for the x87 FPU and SSE unit. */
__asm__ ("fnstsw %0\n"
- "stmxcsr %1" : "=m" (temp), "=m" (mxscr));
+ "%vstmxcsr %1" : "=m" (temp), "=m" (mxscr));
*flagp = (temp | mxscr) & FE_ALL_EXCEPT & excepts;
/* One example of an invalid operation is 0.0 / 0.0. */
float f = 0.0;
- __asm__ __volatile__ ("divss %0, %0 " : "+x" (f));
+ __asm__ __volatile__ ("%vdivss %0, %0 " : "+x" (f));
(void) &f;
}
float f = 1.0;
float g = 0.0;
- __asm__ __volatile__ ("divss %1, %0" : "+x" (f) : "x" (g));
+ __asm__ __volatile__ ("%vdivss %1, %0" : "+x" (f) : "x" (g));
(void) &f;
}
__asm__ ("fldenv %0" : : "m" (temp));
/* And now similarly for SSE. */
- __asm__ ("stmxcsr %0" : "=m" (mxcsr));
+ __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
/* Clear or set relevant flags. */
mxcsr ^= (mxcsr ^ *flagp) & excepts;
/* Put the new data in effect. */
- __asm__ ("ldmxcsr %0" : : "m" (mxcsr));
+ __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
/* Success. */
return 0;
/* Get current exceptions. */
__asm__ ("fnstsw %0\n"
- "stmxcsr %1" : "=m" (temp), "=m" (mxscr));
+ "%vstmxcsr %1" : "=m" (temp), "=m" (mxscr));
return (temp | mxscr) & excepts & FE_ALL_EXCEPT;
}