On Fri, Nov 21, 2025 at 11:39 AM LIU Hao <[email protected]> wrote:
>
> The x87 control word should be passed as an `unsigned short`. Previous
> code passed `unsigned int`, and when building with `-masm=intel`,
>
>     __asm__ __volatile__ ("fnstcw\t%0" : "=m" (_cw));
>
> could expand to `fnstcw DWORD PTR [esp+48]` and cause errors like
>
>     {standard input}: Assembler messages:
>     {standard input}:7137: Error: operand size mismatch for `fnstcw'
>
> libgcc/ChangeLog:
>
>         PR target/122275
>         * config/i386/32/dfp-machine.h (DFP_GET_ROUNDMODE): Change 
> `_frnd_orig` to
>         `unsigned short` for x87 control word.
>         (DFP_SET_ROUNDMODE): Manipulating the x87 control word as `unsigned 
> short`,

...: Manipulate ...

>         and manipulate the MXCSR as `unsigned int`.
>
> Signed-off-by: LIU Hao <[email protected]>

OK.

Thanks,
Uros.

> ---
>   libgcc/config/i386/32/dfp-machine.h | 21 +++++++++++----------
>   1 file changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/libgcc/config/i386/32/dfp-machine.h 
> b/libgcc/config/i386/32/dfp-machine.h
> index ef8fa4f3600c..9b008eefafc9 100644
> --- a/libgcc/config/i386/32/dfp-machine.h
> +++ b/libgcc/config/i386/32/dfp-machine.h
> @@ -1,7 +1,7 @@
>   #ifndef _SOFT_FLOAT
>   /* Get the rounding mode.  */
>   #define DFP_GET_ROUNDMODE                                             \
> -  unsigned int _frnd_orig;                                             \
> +  unsigned short _frnd_orig;                                           \
>     do                                                                  \
>       {                                                                 \
>         __asm__ __volatile__ ("fnstcw\t%0" : "=m" (_frnd_orig));              
>   \
> @@ -13,17 +13,18 @@
>   #define DFP_SET_ROUNDMODE(round)                                      \
>     do                                                                  \
>       {                                                                 \
> -      unsigned int _cw;                                                      
>   \
> -      __asm__ __volatile__ ("fnstcw\t%0" : "=m" (_cw));                      
>   \
> -      _cw &= ~FP_RND_MASK;                                             \
> -      _cw |= round;                                                    \
> -      __asm__ __volatile__ ("fldcw\t%0" :: "m" (_cw));                 \
> +      unsigned short _fcw;                                             \
> +      __asm__ __volatile__ ("fnstcw\t%0" : "=m" (_fcw));               \
> +      _fcw &= ~FP_RND_MASK;                                            \
> +      _fcw |= round;                                                   \
> +      __asm__ __volatile__ ("fldcw\t%0" :: "m" (_fcw));                      
>   \
>         if (__builtin_cpu_supports ("sse"))                             \
>         {                                                               \
> -         __asm__ __volatile__ ("%vstmxcsr\t%0" : "=m" (_cw));          \
> -         _cw &= ~0x6000;                                               \
> -         _cw |= round << 3;                                            \
> -         __asm__ __volatile__ ("%vldmxcsr\t%0" :: "m" (_cw));          \
> +         unsigned int _xcw;                                            \
> +         __asm__ __volatile__ ("%vstmxcsr\t%0" : "=m" (_xcw));         \
> +         _xcw &= ~0x6000;                                              \
> +         _xcw |= round << 3;                                           \
> +         __asm__ __volatile__ ("%vldmxcsr\t%0" :: "m" (_xcw));         \
>         }                                                               \
>       }                                                                 \
>     while (0);
> --
> 2.51.0
>

Reply via email to