]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86/Solaris: correct support for Sun form of CMOV<size>.S
authorJan Beulich <jbeulich@suse.com>
Wed, 22 Jan 2025 08:51:23 +0000 (09:51 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 22 Jan 2025 08:51:23 +0000 (09:51 +0100)
PR gas/32579

The deprecated .s (swapped operand encoding) functionality got in the
way of properly recognizing this specific form. Move the Solaris-
specific code ahead of that.

gas/config/tc-i386.c
gas/testsuite/gas/i386/solaris/cmov.d
gas/testsuite/gas/i386/solaris/cmov.s

index 8498b13e2df0ff6ac5c7fb85c4c788419226319d..e5988347e0a59679ea429da5aa844ec8b23a75d0 100644 (file)
@@ -7751,6 +7751,32 @@ parse_insn (const char *line, char *mnemonic, enum parse_mode mode)
 
   if (!current_templates.start)
     {
+#ifdef TE_SOLARIS
+      /* Sun specifies an alternative form for CMOVcc: Size suffix (if any)
+        first, then a dot, then the condition code mnemonic.  */
+      if ((mnemonic + 4 == dot_p && !memcmp (mnemonic, "cmov", 4))
+         /* While doc doesn't say so, gcc assumes it: Same for FCMOVcc,
+            except that there's no size suffix to care about.  */
+         || (mnemonic + 5 == dot_p && !memcmp (mnemonic, "fcmov", 5)))
+       {
+         /* Simply strip the dot.  */
+         memmove (dot_p, dot_p + 1, mnem_p - dot_p);
+         dot_p = mnem_p - 1;
+       }
+      else if (!intel_syntax
+              && mnemonic + 5 == dot_p
+              && !memcmp (mnemonic, "cmov", 4)
+              && strchr ("lqw", TOLOWER (dot_p[-1])))
+       {
+         /* Strip the dot, while moving the suffix.  */
+         char suffix = dot_p[-1];
+
+         memmove (dot_p - 1, dot_p + 1, mnem_p - dot_p);
+         mnem_p[-2] = suffix;
+         dot_p = mnem_p - 1;
+       }
+      else
+#endif
       /* Deprecated functionality (new code should use pseudo-prefixes instead):
         Check if we should swap operand or force 32bit displacement in
         encoding.  */
@@ -7781,33 +7807,6 @@ parse_insn (const char *line, char *mnemonic, enum parse_mode mode)
          else if (pp.disp_encoding != disp_encoding_32bit)
            as_warn (_("ignoring `.d32' suffix due to earlier `{disp<N>}'"));
        }
-#ifdef TE_SOLARIS
-      /* Sun specifies an alternative form for CMOVcc: Size suffix (if any)
-        first, then a dot, then the condition code mnemonic.  */
-      else if ((mnemonic + 4 == dot_p
-               && !memcmp (mnemonic, "cmov", 4))
-              /* While doc doesn't say so, gcc assumes it: Same for FCMOVcc,
-                 except that there's no size suffix to care about.  */
-              || (mnemonic + 5 == dot_p
-                  && !memcmp (mnemonic, "fcmov", 5)))
-       {
-         /* Simply strip the dot.  */
-         memmove (dot_p, dot_p + 1, mnem_p - dot_p);
-         dot_p = mnem_p - 1;
-       }
-      else if (!intel_syntax
-              && mnemonic + 5 == dot_p
-              && !memcmp (mnemonic, "cmov", 4)
-              && strchr ("lqw", TOLOWER (dot_p[-1])))
-       {
-         /* Strip the dot, while moving the suffix.  */
-         char suffix = dot_p[-1];
-
-         memmove (dot_p - 1, dot_p + 1, mnem_p - dot_p);
-         mnem_p[-2] = suffix;
-         dot_p = mnem_p - 1;
-       }
-#endif
       else
        goto check_suffix;
       mnem_p = dot_p;
index 16467ad9879db98eb433ce1c0a62c179158d8067..a4f2e443e1f5f4b6d3f05054ad890dbc3dbddcd7 100644 (file)
@@ -22,6 +22,10 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    48 0f 44 08             cmove  \(%rax\),%rcx
 [      ]*[a-f0-9]+:    48 0f 44 08             cmove  \(%rax\),%rcx
 [      ]*[a-f0-9]+:    48 0f 44 08             cmove  \(%rax\),%rcx
+[      ]*[a-f0-9]+:    0f 48 c8                cmovs  %eax,%ecx
+[      ]*[a-f0-9]+:    66 0f 48 c8             cmovs  %ax,%cx
+[      ]*[a-f0-9]+:    0f 48 c8                cmovs  %eax,%ecx
+[      ]*[a-f0-9]+:    48 0f 48 c8             cmovs  %rax,%rcx
 [      ]*[a-f0-9]+:    da d9                   fcmovu %st\(1\),%st
 [      ]*[a-f0-9]+:    da d9                   fcmovu %st\(1\),%st
 #pass
index e5026efa25ce246321d0b20a99d7e333ab0ebf99..93173b962c4371a40ea0dd35101283ffd62b96c8 100644 (file)
@@ -20,5 +20,10 @@ cmov:
        cmoveq          (%rax), %rcx
        cmovq.e         (%rax), %rcx
 
+       cmov.s          %eax, %ecx
+       cmovw.s         %ax, %cx
+       cmovl.s         %eax, %ecx
+       cmovq.s         %rax, %rcx
+
        fcmovu          %st(1), %st
        fcmov.u         %st(1), %st