i386: Correct adcx suffix in disassembler

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.
This commit is contained in:
H.J. Lu
2024-01-07 11:58:53 -08:00
parent f6c714d65b
commit f322084c7c
5 changed files with 29 additions and 4 deletions

View 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

View File

@@ -22,3 +22,7 @@ foo:
iret
sysretd
sysret
.att_syntax prefix
adcxl %ecx, %edx
adoxl %ecx, %edx

View 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

View 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

View 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';