i386: Correct adcx suffix in disassembler
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 7 Jan 2024 19:58:53 +0000 (11:58 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Sun, 7 Jan 2024 19:58:53 +0000 (11:58 -0800)
Since 0x66 is the opcode prefix for adcx, it is wrong to use the 'S'
prefix:

  'S' => print 'w', 'l' or 'q' if suffix_always is true

on adcx.  Add

  'L' => print 'l' or 'q' if suffix_always is true

replace S with L on adcx and adox.

gas/

PR binutils/31219
* testsuite/gas/i386/suffix.d: Updated.
* testsuite/gas/i386/x86-64-suffix.d: Likewise.
* testsuite/gas/i386/suffix.s: Add tests for adcx and adox.
* testsuite/gas/i386/x86-64-suffix.s: Likewise.

opcodes/

PR binutils/31219
* i386-dis.c: Add the 'L' suffix.
(prefix_table): Replace S with L on adcx and adox.
(putop): Handle the 'L' suffix.

gas/testsuite/gas/i386/suffix.d
gas/testsuite/gas/i386/suffix.s
gas/testsuite/gas/i386/x86-64-suffix.d
gas/testsuite/gas/i386/x86-64-suffix.s
opcodes/i386-dis.c

index d76dca3..3d0282a 100644 (file)
@@ -22,4 +22,6 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    cf                      iretl
 [      ]*[a-f0-9]+:    0f 07                   sysretl
 [      ]*[a-f0-9]+:    0f 07                   sysretl
+[      ]*[a-f0-9]+:    66 0f 38 f6 d1          adcxl  %ecx,%edx
+[      ]*[a-f0-9]+:    f3 0f 38 f6 d1          adoxl  %ecx,%edx
 #pass
index 7f2864d..4cd85d5 100644 (file)
@@ -22,3 +22,7 @@ foo:
        iret
        sysretd
        sysret
+
+       .att_syntax prefix
+       adcxl %ecx, %edx
+       adoxl %ecx, %edx
index e8edfa4..928f4bc 100644 (file)
@@ -26,4 +26,8 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    0f 07                   sysretl
 [      ]*[a-f0-9]+:    48 89 e5                movq   %rsp,%rbp
 [      ]*[a-f0-9]+:    48 0f 07                sysretq
+[      ]*[a-f0-9]+:    66 0f 38 f6 d1          adcxl  %ecx,%edx
+[      ]*[a-f0-9]+:    f3 0f 38 f6 d1          adoxl  %ecx,%edx
+[      ]*[a-f0-9]+:    66 48 0f 38 f6 d1       adcxq  %rcx,%rdx
+[      ]*[a-f0-9]+:    f3 48 0f 38 f6 d1       adoxq  %rcx,%rdx
 #pass
index a226836..1f40cd6 100644 (file)
@@ -25,3 +25,9 @@ foo:
        sysretd
        mov     rbp,rsp
        sysretq
+
+       .att_syntax prefix
+       adcxl %ecx, %edx
+       adoxl %ecx, %edx
+       adcxq %rcx, %rdx
+       adoxq %rcx, %rdx
index 51bf792..7edae20 100644 (file)
@@ -1778,7 +1778,7 @@ struct dis386 {
    'I' unused.
    'J' unused.
    'K' => print 'd' or 'q' if rex prefix is present.
-   'L' unused.
+   'L' => print 'l' or 'q' if suffix_always is true
    'M' => print 'r' if intel_mnemonic is false.
    'N' => print 'n' if instruction has no wait "prefix"
    'O' => print 'd' or 'o' (or 'q' in Intel mode)
@@ -3654,8 +3654,8 @@ static const struct dis386 prefix_table[][4] = {
   /* PREFIX_0F38F6 */
   {
     { "wrssK", { M, Gdq }, 0 },
-    { "adoxS", { VexGdq, Gdq, Edq}, 0 },
-    { "adcxS", { VexGdq, Gdq, Edq}, 0 },
+    { "adoxL", { VexGdq, Gdq, Edq }, 0 },
+    { "adcxL", { VexGdq, Gdq, Edq }, 0 },
     { Bad_Opcode },
   },
 
@@ -10602,7 +10602,16 @@ putop (instr_info *ins, const char *in_template, int sizeflag)
            *ins->obufp++ = 'd';
          break;
        case 'L':
-         abort ();
+         if (ins->intel_syntax)
+           break;
+         if (sizeflag & SUFFIX_ALWAYS)
+           {
+             if (ins->rex & REX_W)
+               *ins->obufp++ = 'q';
+             else
+               *ins->obufp++ = 'l';
+           }
+         break;
        case 'M':
          if (ins->intel_mnemonic != cond)
            *ins->obufp++ = 'r';