[PATCH 32/59] x86: Adapt "%v" usage on clang to emit VEX enconding
H.J. Lu
hjl.tools@gmail.com
Fri Oct 17 22:27:48 GMT 2025
On Sat, Oct 18, 2025 at 3:54 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> clang does not support the %v to select the AVX encoding, nor the '%d' asm
> contrain, and for AVX build it requires all 3 arguments.
Does this patch change GCC codgen?
> This patch add a new internal header, math-inline-asm.h, that adds
> functions to abstract the inline asm required differences between
> gcc and clang.
> ---
> sysdeps/i386/fpu/fclrexcpt.c | 5 +-
> sysdeps/i386/fpu/fedisblxcpt.c | 5 +-
> sysdeps/i386/fpu/feenablxcpt.c | 5 +-
> sysdeps/i386/fpu/fegetenv.c | 3 +-
> sysdeps/i386/fpu/fegetmode.c | 3 +-
> sysdeps/i386/fpu/feholdexcpt.c | 5 +-
> sysdeps/i386/fpu/fesetenv.c | 6 +--
> sysdeps/i386/fpu/fesetexcept.c | 6 +--
> sysdeps/i386/fpu/fesetmode.c | 6 +--
> sysdeps/i386/fpu/fesetround.c | 7 ++-
> sysdeps/i386/fpu/feupdateenv.c | 3 +-
> sysdeps/i386/fpu/fgetexcptflg.c | 5 +-
> sysdeps/i386/fpu/fsetexcptflg.c | 5 +-
> sysdeps/i386/fpu/ftestexcept.c | 3 +-
> sysdeps/i386/setfpucw.c | 7 ++-
> sysdeps/x86/fpu/fenv_private.h | 43 ++++++++---------
> sysdeps/x86/fpu/math-inline-asm.h | 78 +++++++++++++++++++++++++++++++
> sysdeps/x86/fpu/math_private.h | 8 ++--
> sysdeps/x86/fpu/sfp-machine.h | 4 +-
> sysdeps/x86/fpu/test-fenv-sse-2.c | 21 ++-------
> sysdeps/x86_64/fpu/fclrexcpt.c | 5 +-
> sysdeps/x86_64/fpu/fedisblxcpt.c | 5 +-
> sysdeps/x86_64/fpu/feenablxcpt.c | 5 +-
> sysdeps/x86_64/fpu/fegetenv.c | 12 +++--
> sysdeps/x86_64/fpu/fegetmode.c | 3 +-
> sysdeps/x86_64/fpu/feholdexcpt.c | 10 ++--
> sysdeps/x86_64/fpu/fesetenv.c | 9 ++--
> sysdeps/x86_64/fpu/fesetexcept.c | 7 ++-
> sysdeps/x86_64/fpu/fesetmode.c | 6 +--
> sysdeps/x86_64/fpu/fesetround.c | 5 +-
> sysdeps/x86_64/fpu/feupdateenv.c | 4 +-
> sysdeps/x86_64/fpu/fgetexcptflg.c | 5 +-
> sysdeps/x86_64/fpu/fraiseexcpt.c | 18 ++-----
> sysdeps/x86_64/fpu/fsetexcptflg.c | 5 +-
> sysdeps/x86_64/fpu/ftestexcept.c | 5 +-
> 35 files changed, 201 insertions(+), 131 deletions(-)
> create mode 100644 sysdeps/x86/fpu/math-inline-asm.h
>
> diff --git a/sysdeps/i386/fpu/fclrexcpt.c b/sysdeps/i386/fpu/fclrexcpt.c
> index 39bcf3de59..5f586dae37 100644
> --- a/sysdeps/i386/fpu/fclrexcpt.c
> +++ b/sysdeps/i386/fpu/fclrexcpt.c
> @@ -19,6 +19,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> __feclearexcept (int excepts)
> @@ -44,13 +45,13 @@ __feclearexcept (int excepts)
> unsigned int xnew_exc;
>
> /* Get the current MXCSR. */
> - __asm__ ("%vstmxcsr %0" : "=m" (xnew_exc));
> + xnew_exc = stmxcsr_inline_asm ();
>
> /* Clear the relevant bits. */
> xnew_exc &= ~excepts;
>
> /* Put the new data in effect. */
> - __asm__ ("%vldmxcsr %0" : : "m" (xnew_exc));
> + ldmxcsr_inline_asm (xnew_exc);
> }
>
> /* Success. */
> diff --git a/sysdeps/i386/fpu/fedisblxcpt.c b/sysdeps/i386/fpu/fedisblxcpt.c
> index a2dfa8e4c9..6d65ebc052 100644
> --- a/sysdeps/i386/fpu/fedisblxcpt.c
> +++ b/sysdeps/i386/fpu/fedisblxcpt.c
> @@ -19,6 +19,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> fedisableexcept (int excepts)
> @@ -41,11 +42,11 @@ fedisableexcept (int excepts)
> unsigned int xnew_exc;
>
> /* Get the current control word. */
> - __asm__ ("%vstmxcsr %0" : "=m" (xnew_exc));
> + xnew_exc = stmxcsr_inline_asm ();
>
> xnew_exc |= excepts << 7;
>
> - __asm__ ("%vldmxcsr %0" : : "m" (xnew_exc));
> + ldmxcsr_inline_asm (xnew_exc);
> }
>
> return old_exc;
> diff --git a/sysdeps/i386/fpu/feenablxcpt.c b/sysdeps/i386/fpu/feenablxcpt.c
> index fa1d82a4b6..c4a54583ee 100644
> --- a/sysdeps/i386/fpu/feenablxcpt.c
> +++ b/sysdeps/i386/fpu/feenablxcpt.c
> @@ -19,6 +19,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> feenableexcept (int excepts)
> @@ -41,11 +42,11 @@ feenableexcept (int excepts)
> unsigned int xnew_exc;
>
> /* Get the current control word. */
> - __asm__ ("%vstmxcsr %0" : "=m" (xnew_exc));
> + xnew_exc = stmxcsr_inline_asm ();
>
> xnew_exc &= ~(excepts << 7);
>
> - __asm__ ("%vldmxcsr %0" : : "m" (xnew_exc));
> + ldmxcsr_inline_asm (xnew_exc);
> }
>
> return old_exc;
> diff --git a/sysdeps/i386/fpu/fegetenv.c b/sysdeps/i386/fpu/fegetenv.c
> index 5b35577151..12829e1549 100644
> --- a/sysdeps/i386/fpu/fegetenv.c
> +++ b/sysdeps/i386/fpu/fegetenv.c
> @@ -19,6 +19,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> __fegetenv (fenv_t *envp)
> @@ -30,7 +31,7 @@ __fegetenv (fenv_t *envp)
> __asm__ ("fldenv %0" : : "m" (*envp));
>
> if (CPU_FEATURE_USABLE (SSE))
> - __asm__ ("%vstmxcsr %0" : "=m" (envp->__eip));
> + envp->__eip = stmxcsr_inline_asm ();
>
> /* Success. */
> return 0;
> diff --git a/sysdeps/i386/fpu/fegetmode.c b/sysdeps/i386/fpu/fegetmode.c
> index 8b109072f5..1ee1c11a54 100644
> --- a/sysdeps/i386/fpu/fegetmode.c
> +++ b/sysdeps/i386/fpu/fegetmode.c
> @@ -20,12 +20,13 @@
> #include <fpu_control.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> fegetmode (femode_t *modep)
> {
> _FPU_GETCW (modep->__control_word);
> if (CPU_FEATURE_USABLE (SSE))
> - __asm__ ("%vstmxcsr %0" : "=m" (modep->__mxcsr));
> + modep->__mxcsr = stmxcsr_inline_asm ();
> return 0;
> }
> diff --git a/sysdeps/i386/fpu/feholdexcpt.c b/sysdeps/i386/fpu/feholdexcpt.c
> index f6f6b70dd4..2f1fa503b9 100644
> --- a/sysdeps/i386/fpu/feholdexcpt.c
> +++ b/sysdeps/i386/fpu/feholdexcpt.c
> @@ -19,6 +19,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> __feholdexcept (fenv_t *envp)
> @@ -33,12 +34,12 @@ __feholdexcept (fenv_t *envp)
> unsigned int xwork;
>
> /* Get the current control word. */
> - __asm__ ("%vstmxcsr %0" : "=m" (envp->__eip));
> + envp->__eip = stmxcsr_inline_asm ();
>
> /* Set all exceptions to non-stop and clear them. */
> xwork = (envp->__eip | 0x1f80) & ~0x3f;
>
> - __asm__ ("%vldmxcsr %0" : : "m" (xwork));
> + ldmxcsr_inline_asm (xwork);
> }
>
> return 0;
> diff --git a/sysdeps/i386/fpu/fesetenv.c b/sysdeps/i386/fpu/fesetenv.c
> index e6b276a0fc..0305eb5146 100644
> --- a/sysdeps/i386/fpu/fesetenv.c
> +++ b/sysdeps/i386/fpu/fesetenv.c
> @@ -21,6 +21,7 @@
> #include <assert.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
>
> /* All exceptions, including the x86-specific "denormal operand"
> @@ -79,8 +80,7 @@ __fesetenv (const fenv_t *envp)
>
> if (CPU_FEATURE_USABLE (SSE))
> {
> - unsigned int mxcsr;
> - __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();
>
> if (envp == FE_DFL_ENV)
> {
> @@ -111,7 +111,7 @@ __fesetenv (const fenv_t *envp)
> else
> mxcsr = envp->__eip;
>
> - __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> }
>
> /* Success. */
> diff --git a/sysdeps/i386/fpu/fesetexcept.c b/sysdeps/i386/fpu/fesetexcept.c
> index 876bde233f..20ab75becd 100644
> --- a/sysdeps/i386/fpu/fesetexcept.c
> +++ b/sysdeps/i386/fpu/fesetexcept.c
> @@ -18,6 +18,7 @@
>
> #include <fenv.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> fesetexcept (int excepts)
> @@ -32,14 +33,13 @@ fesetexcept (int excepts)
> if (CPU_FEATURE_USABLE (SSE))
> {
> /* Get the control word of the SSE unit. */
> - unsigned int mxcsr;
> - __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();
>
> /* Set relevant flags. */
> mxcsr |= excepts;
>
> /* Put the new data in effect. */
> - __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> }
> else
> {
> diff --git a/sysdeps/i386/fpu/fesetmode.c b/sysdeps/i386/fpu/fesetmode.c
> index ee61ca1cec..0616cabc45 100644
> --- a/sysdeps/i386/fpu/fesetmode.c
> +++ b/sysdeps/i386/fpu/fesetmode.c
> @@ -20,6 +20,7 @@
> #include <fpu_control.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> /* All exceptions, including the x86-specific "denormal operand"
> exception. */
> @@ -36,8 +37,7 @@ fesetmode (const femode_t *modep)
> _FPU_SETCW (cw);
> if (CPU_FEATURE_USABLE (SSE))
> {
> - unsigned int mxcsr;
> - __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();
> /* Preserve SSE exception flags but restore other state in
> MXCSR. */
> mxcsr &= FE_ALL_EXCEPT_X86;
> @@ -47,7 +47,7 @@ fesetmode (const femode_t *modep)
> mxcsr |= FE_ALL_EXCEPT_X86 << 7;
> else
> mxcsr |= modep->__mxcsr & ~FE_ALL_EXCEPT_X86;
> - __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> }
> return 0;
> }
> diff --git a/sysdeps/i386/fpu/fesetround.c b/sysdeps/i386/fpu/fesetround.c
> index e87d794319..e3e16e87b1 100644
> --- a/sysdeps/i386/fpu/fesetround.c
> +++ b/sysdeps/i386/fpu/fesetround.c
> @@ -19,6 +19,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> __fesetround (int round)
> @@ -37,12 +38,10 @@ __fesetround (int round)
> /* If the CPU supports SSE we set the MXCSR as well. */
> if (CPU_FEATURE_USABLE (SSE))
> {
> - unsigned int xcw;
> -
> - __asm__ ("%vstmxcsr %0" : "=m" (xcw));
> + unsigned int xcw = stmxcsr_inline_asm ();
> xcw &= ~0x6000;
> xcw |= round << 3;
> - __asm__ ("%vldmxcsr %0" : : "m" (xcw));
> + ldmxcsr_inline_asm (xcw);
> }
>
> return 0;
> diff --git a/sysdeps/i386/fpu/feupdateenv.c b/sysdeps/i386/fpu/feupdateenv.c
> index 9e1ad97118..d56276f2ce 100644
> --- a/sysdeps/i386/fpu/feupdateenv.c
> +++ b/sysdeps/i386/fpu/feupdateenv.c
> @@ -19,6 +19,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> __feupdateenv (const fenv_t *envp)
> @@ -31,7 +32,7 @@ __feupdateenv (const fenv_t *envp)
>
> /* If the CPU supports SSE we test the MXCSR as well. */
> if (CPU_FEATURE_USABLE (SSE))
> - __asm__ ("%vstmxcsr %0" : "=m" (xtemp));
> + xtemp = stmxcsr_inline_asm ();
>
> temp = (temp | xtemp) & FE_ALL_EXCEPT;
>
> diff --git a/sysdeps/i386/fpu/fgetexcptflg.c b/sysdeps/i386/fpu/fgetexcptflg.c
> index 36dd297cdc..bcba833381 100644
> --- a/sysdeps/i386/fpu/fgetexcptflg.c
> +++ b/sysdeps/i386/fpu/fgetexcptflg.c
> @@ -19,6 +19,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
>
> int
> @@ -34,10 +35,8 @@ __fegetexceptflag (fexcept_t *flagp, int excepts)
> /* If the CPU supports SSE, we clear the MXCSR as well. */
> if (CPU_FEATURE_USABLE (SSE))
> {
> - unsigned int sse_exc;
> -
> /* Get the current MXCSR. */
> - __asm__ ("%vstmxcsr %0" : "=m" (sse_exc));
> + unsigned int sse_exc = stmxcsr_inline_asm ();
>
> *flagp |= sse_exc & excepts & FE_ALL_EXCEPT;
> }
> diff --git a/sysdeps/i386/fpu/fsetexcptflg.c b/sysdeps/i386/fpu/fsetexcptflg.c
> index b78d1dcd3c..9616fec52e 100644
> --- a/sysdeps/i386/fpu/fsetexcptflg.c
> +++ b/sysdeps/i386/fpu/fsetexcptflg.c
> @@ -18,6 +18,7 @@
>
> #include <fenv.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> __fesetexceptflag (const fexcept_t *flagp, int excepts)
> @@ -50,13 +51,13 @@ __fesetexceptflag (const fexcept_t *flagp, int excepts)
> __asm__ ("fldenv %0" : : "m" (temp));
>
> /* And now similarly for SSE. */
> - __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
> + mxcsr = stmxcsr_inline_asm ();
>
> /* Clear or set relevant flags. */
> mxcsr ^= (mxcsr ^ *flagp) & excepts;
>
> /* Put the new data in effect. */
> - __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> }
> else
> {
> diff --git a/sysdeps/i386/fpu/ftestexcept.c b/sysdeps/i386/fpu/ftestexcept.c
> index 51abfd3917..0869582d0a 100644
> --- a/sysdeps/i386/fpu/ftestexcept.c
> +++ b/sysdeps/i386/fpu/ftestexcept.c
> @@ -19,6 +19,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> int
> __fetestexcept (int excepts)
> @@ -31,7 +32,7 @@ __fetestexcept (int excepts)
>
> /* If the CPU supports SSE we test the MXCSR as well. */
> if (CPU_FEATURE_USABLE (SSE))
> - __asm__ ("%vstmxcsr %0" : "=m" (xtemp));
> + xtemp = stmxcsr_inline_asm ();
>
> return (temp | xtemp) & excepts & FE_ALL_EXCEPT;
> }
> diff --git a/sysdeps/i386/setfpucw.c b/sysdeps/i386/setfpucw.c
> index 8438c7ed75..b48892b414 100644
> --- a/sysdeps/i386/setfpucw.c
> +++ b/sysdeps/i386/setfpucw.c
> @@ -21,6 +21,7 @@
> #include <fenv.h>
> #include <unistd.h>
> #include <ldsodefs.h>
> +#include <math-inline-asm.h>
>
> void
> __setfpucw (fpu_control_t set)
> @@ -40,14 +41,12 @@ __setfpucw (fpu_control_t set)
> /* If the CPU supports SSE, we set the MXCSR as well. */
> if (CPU_FEATURE_USABLE (SSE))
> {
> - unsigned int xnew_exc;
> -
> /* Get the current MXCSR. */
> - __asm__ ("%vstmxcsr %0" : "=m" (xnew_exc));
> + unsigned int xnew_exc = stmxcsr_inline_asm ();
>
> xnew_exc &= ~((0xc00 << 3) | (FE_ALL_EXCEPT << 7));
> xnew_exc |= ((set & 0xc00) << 3) | ((set & FE_ALL_EXCEPT) << 7);
>
> - __asm__ ("%vldmxcsr %0" : : "m" (xnew_exc));
> + ldmxcsr_inline_asm (xnew_exc);
> }
> }
> diff --git a/sysdeps/x86/fpu/fenv_private.h b/sysdeps/x86/fpu/fenv_private.h
> index c9b573cacd..2bd20ee992 100644
> --- a/sysdeps/x86/fpu/fenv_private.h
> +++ b/sysdeps/x86/fpu/fenv_private.h
> @@ -4,6 +4,7 @@
> #include <bits/floatn.h>
> #include <fenv.h>
> #include <fpu_control.h>
> +#include <math-inline-asm.h>
>
> /* This file is used by both the 32- and 64-bit ports. The 64-bit port
> has a field in the fenv_t for the mxcsr; the 32-bit port does not.
> @@ -21,11 +22,10 @@
> static __always_inline void
> libc_feholdexcept_sse (fenv_t *e)
> {
> - unsigned int mxcsr;
> - asm ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();;
> e->__mxcsr = mxcsr;
> mxcsr = (mxcsr | 0x1f80) & ~0x3f;
> - asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> }
>
> static __always_inline void
> @@ -42,10 +42,9 @@ libc_feholdexcept_387 (fenv_t *e)
> static __always_inline void
> libc_fesetround_sse (int r)
> {
> - unsigned int mxcsr;
> - asm ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();;
> mxcsr = (mxcsr & ~0x6000) | (r << 3);
> - asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> }
>
> static __always_inline void
> @@ -60,11 +59,10 @@ libc_fesetround_387 (int r)
> static __always_inline void
> libc_feholdexcept_setround_sse (fenv_t *e, int r)
> {
> - unsigned int mxcsr;
> - asm ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();;
> e->__mxcsr = mxcsr;
> mxcsr = ((mxcsr | 0x1f80) & ~0x603f) | (r << 3);
> - asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> }
>
> /* Set both rounding mode and precision. A convenience function for use
> @@ -95,8 +93,7 @@ libc_feholdexcept_setround_387_53bit (fenv_t *e, int r)
> static __always_inline int
> libc_fetestexcept_sse (int e)
> {
> - unsigned int mxcsr;
> - asm volatile ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();
> return mxcsr & e & FE_ALL_EXCEPT;
> }
>
> @@ -111,7 +108,7 @@ libc_fetestexcept_387 (int ex)
> static __always_inline void
> libc_fesetenv_sse (fenv_t *e)
> {
> - asm volatile ("%vldmxcsr %0" : : "m" (e->__mxcsr));
> + ldmxcsr_inline_asm (e->__mxcsr);
> }
>
> static __always_inline void
> @@ -129,13 +126,13 @@ static __always_inline int
> libc_feupdateenv_test_sse (fenv_t *e, int ex)
> {
> unsigned int mxcsr, old_mxcsr, cur_ex;
> - asm volatile ("%vstmxcsr %0" : "=m" (mxcsr));
> + mxcsr = stmxcsr_inline_asm ();
> cur_ex = mxcsr & FE_ALL_EXCEPT;
>
> /* Merge current exceptions with the old environment. */
> old_mxcsr = e->__mxcsr;
> mxcsr = old_mxcsr | cur_ex;
> - asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
>
> /* Raise SIGFPE for any new exceptions since the hold. Expect that
> the normal environment has all exceptions masked. */
> @@ -180,11 +177,10 @@ libc_feupdateenv_387 (fenv_t *e)
> static __always_inline void
> libc_feholdsetround_sse (fenv_t *e, int r)
> {
> - unsigned int mxcsr;
> - asm ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();;
> e->__mxcsr = mxcsr;
> mxcsr = (mxcsr & ~0x6000) | (r << 3);
> - asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> }
>
> static __always_inline void
> @@ -214,10 +210,9 @@ libc_feholdsetround_387_53bit (fenv_t *e, int r)
> static __always_inline void
> libc_feresetround_sse (fenv_t *e)
> {
> - unsigned int mxcsr;
> - asm ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();;
> mxcsr = (mxcsr & ~0x6000) | (e->__mxcsr & 0x6000);
> - asm volatile ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> }
>
> static __always_inline void
> @@ -307,13 +302,13 @@ static __always_inline void
> libc_feholdexcept_setround_sse_ctx (struct rm_ctx *ctx, int r)
> {
> unsigned int mxcsr, new_mxcsr;
> - asm ("%vstmxcsr %0" : "=m" (mxcsr));
> + mxcsr = stmxcsr_inline_asm ();
> new_mxcsr = ((mxcsr | 0x1f80) & ~0x603f) | (r << 3);
>
> ctx->env.__mxcsr = mxcsr;
> if (__glibc_unlikely (mxcsr != new_mxcsr))
> {
> - asm volatile ("%vldmxcsr %0" : : "m" (new_mxcsr));
> + ldmxcsr_inline_asm (new_mxcsr);
> ctx->updated_status = true;
> }
> else
> @@ -404,13 +399,13 @@ libc_feholdsetround_sse_ctx (struct rm_ctx *ctx, int r)
> {
> unsigned int mxcsr, new_mxcsr;
>
> - asm ("%vstmxcsr %0" : "=m" (mxcsr));
> + mxcsr = stmxcsr_inline_asm ();
> new_mxcsr = (mxcsr & ~0x6000) | (r << 3);
>
> ctx->env.__mxcsr = mxcsr;
> if (__glibc_unlikely (new_mxcsr != mxcsr))
> {
> - asm volatile ("%vldmxcsr %0" : : "m" (new_mxcsr));
> + ldmxcsr_inline_asm (new_mxcsr);
> ctx->updated_status = true;
> }
> else
> diff --git a/sysdeps/x86/fpu/math-inline-asm.h b/sysdeps/x86/fpu/math-inline-asm.h
> new file mode 100644
> index 0000000000..20735f4585
> --- /dev/null
> +++ b/sysdeps/x86/fpu/math-inline-asm.h
> @@ -0,0 +1,78 @@
> +/* Math inline asm compat layer
> + Copyright (C) 2025 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
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _MATH_INLINE_ASM
> +#define _MATH_INLINE_ASM
> +
> +#include <sys/cdefs.h>
> +
> +/* clang does not support the %v to select the AVX encoding, nor the '%d' asm
> + contrain, and for AVX build it requires all 3 arguments. */
> +#ifdef __clang__
> +# ifdef __AVX__
> +# define VPREFIX "v"
> +# define VROUND_ARG ", %0"
> +# else
> +# define VPREFIX ""
> +# define VROUND_ARG ""
> +# endif
> +# define VARGPREFIX "%"
> +#else
> +# define VPREFIX "%v"
> +# define VARGPREFIX "%d"
> +# define VROUND_ARG ""
> +#endif
> +
> +__extern_always_inline double
> +trunc_inline_asm (double x)
> +{
> + asm (VPREFIX "roundsd $11, " VARGPREFIX "1, %0" VROUND_ARG : "=v" (x)
> + : "v" (x));
> + return x;
> +}
> +
> +__extern_always_inline float
> +truncf_inline_asm (float x)
> +{
> + asm (VPREFIX "roundss $11, " VARGPREFIX "1, %0" VROUND_ARG : "=v" (x)
> + : "v" (x));
> + return x;
> +}
> +
> +static __always_inline unsigned int
> +stmxcsr_inline_asm (void)
> +{
> + unsigned int mxcsr;
> + asm volatile (VPREFIX "stmxcsr %0" : "=m" (mxcsr));
> + return mxcsr;
> +}
> +
> +static __always_inline void
> +ldmxcsr_inline_asm (unsigned int mxcsr)
> +{
> + asm volatile (VPREFIX "ldmxcsr %0" : : "m" (mxcsr));
> +}
> +
> +static __always_inline float
> +divss_inline_asm (float x, float y)
> +{
> + asm volatile (VPREFIX "divss %1, " VARGPREFIX "0" : "+x" (x) : "x" (y));
> + return x;
> +}
> +
> +#endif
> diff --git a/sysdeps/x86/fpu/math_private.h b/sysdeps/x86/fpu/math_private.h
> index bba085a578..47de90bcec 100644
> --- a/sysdeps/x86/fpu/math_private.h
> +++ b/sysdeps/x86/fpu/math_private.h
> @@ -20,8 +20,10 @@
> #define X86_MATH_PRIVATE_H 1
>
> #include <math.h>
> +#include <math-inline-asm.h>
> #include_next <math_private.h>
>
> +
> __extern_always_inline long double
> __NTH (__ieee754_atan2l (long double y, long double x))
> {
> @@ -36,8 +38,7 @@ __trunc (double x)
> #if HAVE_X86_INLINE_TRUNC || !defined __SSE4_1__
> return trunc (x);
> #else
> - asm ("%vroundsd $11, %d1, %0" : "=v" (x) : "v" (x));
> - return x;
> + return trunc_inline_asm (x);
> #endif
> }
>
> @@ -47,8 +48,7 @@ __truncf (float x)
> #if HAVE_X86_INLINE_TRUNC || !defined __SSE4_1__
> return truncf (x);
> #else
> - asm ("%vroundss $11, %d1, %0" : "=v" (x) : "v" (x));
> - return x;
> + return truncf_inline_asm (x);
> #endif
> }
>
> diff --git a/sysdeps/x86/fpu/sfp-machine.h b/sysdeps/x86/fpu/sfp-machine.h
> index 625dfeaccf..a60711f995 100644
> --- a/sysdeps/x86/fpu/sfp-machine.h
> +++ b/sysdeps/x86/fpu/sfp-machine.h
> @@ -1,6 +1,8 @@
> /* Configure soft-fp for building sqrtf128. Based on sfp-machine.h in
> libgcc, with soft-float and other irrelevant parts removed. */
>
> +#include <math-inline-asm.h>
> +
> #if !defined(__clang__) && defined(__GNUC__)
> /* The type of the result of a floating point comparison. This must
> match `__libgcc_cmp_return__' in GCC for the target. */
> @@ -49,7 +51,7 @@ typedef unsigned int UTItype __attribute__ ((mode (TI)));
>
> # define FP_INIT_ROUNDMODE \
> do { \
> - __asm__ __volatile__ ("%vstmxcsr\t%0" : "=m" (_fcw)); \
> + _fcw = stmxcsr_inline_asm (); \
> } while (0)
> #else
> # define _FP_W_TYPE_SIZE 32
> diff --git a/sysdeps/x86/fpu/test-fenv-sse-2.c b/sysdeps/x86/fpu/test-fenv-sse-2.c
> index d12009bb81..cf93a5919d 100644
> --- a/sysdeps/x86/fpu/test-fenv-sse-2.c
> +++ b/sysdeps/x86/fpu/test-fenv-sse-2.c
> @@ -24,33 +24,20 @@
> #include <stdio.h>
> #include <cpu-features.h>
> #include <support/check.h>
> -
> -static uint32_t
> -get_sse_mxcsr (void)
> -{
> - uint32_t temp;
> - __asm__ __volatile__ ("%vstmxcsr %0" : "=m" (temp));
> - return temp;
> -}
> -
> -static void
> -set_sse_mxcsr (uint32_t val)
> -{
> - __asm__ __volatile__ ("%vldmxcsr %0" : : "m" (val));
> -}
> +#include <math-inline-asm.h>
>
> static void
> set_sse_mxcsr_bits (uint32_t mask, uint32_t bits)
> {
> - uint32_t mxcsr = get_sse_mxcsr ();
> + uint32_t mxcsr = stmxcsr_inline_asm ();
> mxcsr = (mxcsr & ~mask) | bits;
> - set_sse_mxcsr (mxcsr);
> + ldmxcsr_inline_asm (mxcsr);
> }
>
> static int
> test_sse_mxcsr_bits (const char *test, uint32_t mask, uint32_t bits)
> {
> - uint32_t mxcsr = get_sse_mxcsr ();
> + uint32_t mxcsr = stmxcsr_inline_asm ();
> printf ("Testing %s: mxcsr = %x\n", test, mxcsr);
> if ((mxcsr & mask) == bits)
> {
> diff --git a/sysdeps/x86_64/fpu/fclrexcpt.c b/sysdeps/x86_64/fpu/fclrexcpt.c
> index 86b4228f2f..fff554d581 100644
> --- a/sysdeps/x86_64/fpu/fclrexcpt.c
> +++ b/sysdeps/x86_64/fpu/fclrexcpt.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> __feclearexcept (int excepts)
> @@ -38,13 +39,13 @@ __feclearexcept (int excepts)
> __asm__ ("fldenv %0" : : "m" (temp));
>
> /* And the same procedure for SSE. */
> - __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
> + mxcsr = stmxcsr_inline_asm ();
>
> /* Clear the relevant bits. */
> mxcsr &= ~excepts;
>
> /* And put them into effect. */
> - __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
>
> /* Success. */
> return 0;
> diff --git a/sysdeps/x86_64/fpu/fedisblxcpt.c b/sysdeps/x86_64/fpu/fedisblxcpt.c
> index dab9ad19c2..38bbdb4f45 100644
> --- a/sysdeps/x86_64/fpu/fedisblxcpt.c
> +++ b/sysdeps/x86_64/fpu/fedisblxcpt.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> fedisableexcept (int excepts)
> @@ -35,11 +36,11 @@ fedisableexcept (int excepts)
> __asm__ ("fldcw %0" : : "m" (new_exc));
>
> /* And now the same for the SSE MXCSR register. */
> - __asm__ ("%vstmxcsr %0" : "=m" (new));
> + new = stmxcsr_inline_asm ();
>
> /* The SSE exception masks are shifted by 7 bits. */
> new |= excepts << 7;
> - __asm__ ("%vldmxcsr %0" : : "m" (new));
> + ldmxcsr_inline_asm (new);
>
> return old_exc;
> }
> diff --git a/sysdeps/x86_64/fpu/feenablxcpt.c b/sysdeps/x86_64/fpu/feenablxcpt.c
> index 828b2b247a..848e2d0eae 100644
> --- a/sysdeps/x86_64/fpu/feenablxcpt.c
> +++ b/sysdeps/x86_64/fpu/feenablxcpt.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> feenableexcept (int excepts)
> @@ -35,11 +36,11 @@ feenableexcept (int excepts)
> __asm__ ("fldcw %0" : : "m" (new_exc));
>
> /* And now the same for the SSE MXCSR register. */
> - __asm__ ("%vstmxcsr %0" : "=m" (new));
> + new = stmxcsr_inline_asm ();
>
> /* The SSE exception masks are shifted by 7 bits. */
> new &= ~(excepts << 7);
> - __asm__ ("%vldmxcsr %0" : : "m" (new));
> + ldmxcsr_inline_asm (new);
>
> return old_exc;
> }
> diff --git a/sysdeps/x86_64/fpu/fegetenv.c b/sysdeps/x86_64/fpu/fegetenv.c
> index eea9d6bee7..43cd53363e 100644
> --- a/sysdeps/x86_64/fpu/fegetenv.c
> +++ b/sysdeps/x86_64/fpu/fegetenv.c
> @@ -17,15 +17,17 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> __fegetenv (fenv_t *envp)
> {
> - __asm__ ("fnstenv %0\n"
> - /* fnstenv changes the exception mask, so load back the
> - stored environment. */
> - "fldenv %0\n"
> - "%vstmxcsr %1" : "=m" (*envp), "=m" (envp->__mxcsr));
> + asm volatile ("fnstenv %0\n"
> + /* fnstenv changes the exception mask, so load back the
> + stored environment. */
> + "fldenv %0"
> + : "=m" (*envp));
> + envp->__mxcsr = stmxcsr_inline_asm ();
>
> /* Success. */
> return 0;
> diff --git a/sysdeps/x86_64/fpu/fegetmode.c b/sysdeps/x86_64/fpu/fegetmode.c
> index 39d124a6d8..6c1c1f1f00 100644
> --- a/sysdeps/x86_64/fpu/fegetmode.c
> +++ b/sysdeps/x86_64/fpu/fegetmode.c
> @@ -18,11 +18,12 @@
>
> #include <fenv.h>
> #include <fpu_control.h>
> +#include <math-inline-asm.h>
>
> int
> fegetmode (femode_t *modep)
> {
> _FPU_GETCW (modep->__control_word);
> - __asm__ ("%vstmxcsr %0" : "=m" (modep->__mxcsr));
> + modep->__mxcsr = stmxcsr_inline_asm ();
> return 0;
> }
> diff --git a/sysdeps/x86_64/fpu/feholdexcpt.c b/sysdeps/x86_64/fpu/feholdexcpt.c
> index 9a22a2ea77..b6e3f19bdf 100644
> --- a/sysdeps/x86_64/fpu/feholdexcpt.c
> +++ b/sysdeps/x86_64/fpu/feholdexcpt.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> __feholdexcept (fenv_t *envp)
> @@ -25,14 +26,13 @@ __feholdexcept (fenv_t *envp)
>
> /* Store the environment. Recall that fnstenv has a side effect of
> masking all exceptions. Then clear all exceptions. */
> - __asm__ ("fnstenv %0\n\t"
> - "%vstmxcsr %1\n\t"
> - "fnclex"
> - : "=m" (*envp), "=m" (envp->__mxcsr));
> + asm volatile ("fnstenv %0" : "=m" (*envp));
> + envp->__mxcsr = stmxcsr_inline_asm ();
> + asm volatile ("fnclex" : "=m" (*envp));
>
> /* Set the SSE MXCSR register. */
> mxcsr = (envp->__mxcsr | 0x1f80) & ~0x3f;
> - __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
>
> return 0;
> }
> diff --git a/sysdeps/x86_64/fpu/fesetenv.c b/sysdeps/x86_64/fpu/fesetenv.c
> index e4e721afff..b39edb61b8 100644
> --- a/sysdeps/x86_64/fpu/fesetenv.c
> +++ b/sysdeps/x86_64/fpu/fesetenv.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
> #include <fpu_control.h>
> #include <assert.h>
>
> @@ -35,8 +36,8 @@ __fesetenv (const fenv_t *envp)
> values which we do not want to come from the saved environment.
> 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"
> - "%vstmxcsr %1" : "=m" (temp), "=m" (temp.__mxcsr));
> + asm volatile ("fnstenv %0" : "=m" (temp));
> + temp.__mxcsr = stmxcsr_inline_asm ();
>
> if (envp == FE_DFL_ENV)
> {
> @@ -103,8 +104,8 @@ __fesetenv (const fenv_t *envp)
> temp.__mxcsr = envp->__mxcsr;
> }
>
> - __asm__ ("fldenv %0\n"
> - "%vldmxcsr %1" : : "m" (temp), "m" (temp.__mxcsr));
> + asm volatile ("fldenv %0" : "=m" (temp));
> + ldmxcsr_inline_asm (temp.__mxcsr);
>
> /* Success. */
> return 0;
> diff --git a/sysdeps/x86_64/fpu/fesetexcept.c b/sysdeps/x86_64/fpu/fesetexcept.c
> index 91d5270f8e..943d1136f0 100644
> --- a/sysdeps/x86_64/fpu/fesetexcept.c
> +++ b/sysdeps/x86_64/fpu/fesetexcept.c
> @@ -17,15 +17,14 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> fesetexcept (int excepts)
> {
> - unsigned int mxcsr;
> -
> - __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr =stmxcsr_inline_asm ();
> mxcsr |= excepts & FE_ALL_EXCEPT;
> - __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
>
> return 0;
> }
> diff --git a/sysdeps/x86_64/fpu/fesetmode.c b/sysdeps/x86_64/fpu/fesetmode.c
> index 2b35d7e719..5f393200ea 100644
> --- a/sysdeps/x86_64/fpu/fesetmode.c
> +++ b/sysdeps/x86_64/fpu/fesetmode.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
> #include <fpu_control.h>
>
> /* All exceptions, including the x86-specific "denormal operand"
> @@ -27,8 +28,7 @@ int
> fesetmode (const femode_t *modep)
> {
> fpu_control_t cw;
> - unsigned int mxcsr;
> - __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
> + unsigned int mxcsr = stmxcsr_inline_asm ();
> /* Preserve SSE exception flags but restore other state in
> MXCSR. */
> mxcsr &= FE_ALL_EXCEPT_X86;
> @@ -45,6 +45,6 @@ fesetmode (const femode_t *modep)
> mxcsr |= modep->__mxcsr & ~FE_ALL_EXCEPT_X86;
> }
> _FPU_SETCW (cw);
> - __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
> return 0;
> }
> diff --git a/sysdeps/x86_64/fpu/fesetround.c b/sysdeps/x86_64/fpu/fesetround.c
> index e1ffb3b7a9..7ed24c6748 100644
> --- a/sysdeps/x86_64/fpu/fesetround.c
> +++ b/sysdeps/x86_64/fpu/fesetround.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> __fesetround (int round)
> @@ -36,10 +37,10 @@ __fesetround (int round)
>
> /* 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 ("%vstmxcsr %0" : "=m" (mxcsr));
> + mxcsr = stmxcsr_inline_asm ();
> mxcsr &= ~ 0x6000;
> mxcsr |= round << 3;
> - asm ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
>
> return 0;
> }
> diff --git a/sysdeps/x86_64/fpu/feupdateenv.c b/sysdeps/x86_64/fpu/feupdateenv.c
> index 0e26b92af5..5148543529 100644
> --- a/sysdeps/x86_64/fpu/feupdateenv.c
> +++ b/sysdeps/x86_64/fpu/feupdateenv.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> __feupdateenv (const fenv_t *envp)
> @@ -25,7 +26,8 @@ __feupdateenv (const fenv_t *envp)
> unsigned int xtemp;
>
> /* Save current exceptions. */
> - __asm__ ("fnstsw %0\n\t%vstmxcsr %1" : "=m" (temp), "=m" (xtemp));
> + asm volatile ("fnstsw %0" : "=m" (temp));
> + xtemp = stmxcsr_inline_asm ();
> temp = (temp | xtemp) & FE_ALL_EXCEPT;
>
> /* Install new environment. */
> diff --git a/sysdeps/x86_64/fpu/fgetexcptflg.c b/sysdeps/x86_64/fpu/fgetexcptflg.c
> index a7b500b600..ec7324b829 100644
> --- a/sysdeps/x86_64/fpu/fgetexcptflg.c
> +++ b/sysdeps/x86_64/fpu/fgetexcptflg.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> fegetexceptflag (fexcept_t *flagp, int excepts)
> @@ -25,8 +26,8 @@ fegetexceptflag (fexcept_t *flagp, int excepts)
> unsigned int mxscr;
>
> /* Get the current exceptions for the x87 FPU and SSE unit. */
> - __asm__ ("fnstsw %0\n"
> - "%vstmxcsr %1" : "=m" (temp), "=m" (mxscr));
> + __asm__ ("fnstsw %0" : "=m" (temp));
> + mxscr = stmxcsr_inline_asm ();
>
> *flagp = (temp | mxscr) & FE_ALL_EXCEPT & excepts;
>
> diff --git a/sysdeps/x86_64/fpu/fraiseexcpt.c b/sysdeps/x86_64/fpu/fraiseexcpt.c
> index da3a31f4c2..05474bec13 100644
> --- a/sysdeps/x86_64/fpu/fraiseexcpt.c
> +++ b/sysdeps/x86_64/fpu/fraiseexcpt.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
> #include <math.h>
>
> int
> @@ -29,23 +30,12 @@ __feraiseexcept (int excepts)
>
> /* First: invalid exception. */
> if ((FE_INVALID & excepts) != 0)
> - {
> - /* One example of an invalid operation is 0.0 / 0.0. */
> - float f = 0.0;
> -
> - __asm__ __volatile__ ("%vdivss %0, %d0 " : "+x" (f));
> - (void) &f;
> - }
> + /* One example of an invalid operation is 0.0 / 0.0. */
> + divss_inline_asm (0.0f, 0.0f);
>
> /* Next: division by zero. */
> if ((FE_DIVBYZERO & excepts) != 0)
> - {
> - float f = 1.0;
> - float g = 0.0;
> -
> - __asm__ __volatile__ ("%vdivss %1, %d0" : "+x" (f) : "x" (g));
> - (void) &f;
> - }
> + divss_inline_asm (1.0f, 0.0f);
>
> /* Next: overflow. */
> if ((FE_OVERFLOW & excepts) != 0)
> diff --git a/sysdeps/x86_64/fpu/fsetexcptflg.c b/sysdeps/x86_64/fpu/fsetexcptflg.c
> index 34ea24c061..aa74487814 100644
> --- a/sysdeps/x86_64/fpu/fsetexcptflg.c
> +++ b/sysdeps/x86_64/fpu/fsetexcptflg.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
> #include <math.h>
>
> int
> @@ -44,13 +45,13 @@ fesetexceptflag (const fexcept_t *flagp, int excepts)
> __asm__ ("fldenv %0" : : "m" (temp));
>
> /* And now similarly for SSE. */
> - __asm__ ("%vstmxcsr %0" : "=m" (mxcsr));
> + mxcsr = stmxcsr_inline_asm ();
>
> /* Clear or set relevant flags. */
> mxcsr ^= (mxcsr ^ *flagp) & excepts;
>
> /* Put the new data in effect. */
> - __asm__ ("%vldmxcsr %0" : : "m" (mxcsr));
> + ldmxcsr_inline_asm (mxcsr);
>
> /* Success. */
> return 0;
> diff --git a/sysdeps/x86_64/fpu/ftestexcept.c b/sysdeps/x86_64/fpu/ftestexcept.c
> index 39df30fbd2..46233d066a 100644
> --- a/sysdeps/x86_64/fpu/ftestexcept.c
> +++ b/sysdeps/x86_64/fpu/ftestexcept.c
> @@ -17,6 +17,7 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <fenv.h>
> +#include <math-inline-asm.h>
>
> int
> __fetestexcept (int excepts)
> @@ -25,8 +26,8 @@ __fetestexcept (int excepts)
> unsigned int mxscr;
>
> /* Get current exceptions. */
> - __asm__ ("fnstsw %0\n"
> - "%vstmxcsr %1" : "=m" (temp), "=m" (mxscr));
> + asm volatile ("fnstsw %0" : "=m" (temp));
> + mxscr = stmxcsr_inline_asm ();
>
> return (temp | mxscr) & excepts & FE_ALL_EXCEPT;
> }
> --
> 2.43.0
>
--
H.J.
More information about the Libc-alpha
mailing list