mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-12-19 01:19:41 +08:00
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:
@@ -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
|
||||
|
||||
@@ -22,3 +22,7 @@ foo:
|
||||
iret
|
||||
sysretd
|
||||
sysret
|
||||
|
||||
.att_syntax prefix
|
||||
adcxl %ecx, %edx
|
||||
adoxl %ecx, %edx
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user