]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libgcc: Pass x87 control word in the correct type
authorLIU Hao <lh_mouse@126.com>
Tue, 14 Oct 2025 06:46:46 +0000 (14:46 +0800)
committerUros Bizjak <ubizjak@gmail.com>
Fri, 21 Nov 2025 13:08:48 +0000 (14:08 +0100)
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): Manipulate the x87 control word as `unsigned short`,
and manipulate the MXCSR as `unsigned int`.

Signed-off-by: LIU Hao <lh_mouse@126.com>
libgcc/config/i386/32/dfp-machine.h

index ef8fa4f3600c0944639835b474e69f842be34581..9b008eefafc910194b10751812fe087fd2625ffc 100644 (file)
@@ -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));         \
 #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);