forked from Imagelibrary/binutils-gdb
x86/APX: with REX2 map 1 doesn't "chain" to maps 2 or 3
Don't wander into three_byte_table[] when REX2 is present. While there also eliminate related confusion when accessing dis386_twobyte[]: There's nothing 3-byte-ish involved there. Dropping the odd variable gets things better in sync with 1-byte handling as well.
This commit is contained in:
@@ -8833,6 +8833,8 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case USE_3BYTE_TABLE:
|
case USE_3BYTE_TABLE:
|
||||||
|
if (ins->last_rex2_prefix >= 0)
|
||||||
|
return &err_opcode;
|
||||||
if (!fetch_code (ins->info, ins->codep + 2))
|
if (!fetch_code (ins->info, ins->codep + 2))
|
||||||
return &err_opcode;
|
return &err_opcode;
|
||||||
vindex = *ins->codep++;
|
vindex = *ins->codep++;
|
||||||
@@ -9550,8 +9552,6 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
|
|||||||
/* REX2.M in rex2 prefix represents map0 or map1. */
|
/* REX2.M in rex2 prefix represents map0 or map1. */
|
||||||
if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M))
|
if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M))
|
||||||
{
|
{
|
||||||
unsigned char threebyte;
|
|
||||||
|
|
||||||
if (!ins.rex2)
|
if (!ins.rex2)
|
||||||
{
|
{
|
||||||
ins.codep++;
|
ins.codep++;
|
||||||
@@ -9559,17 +9559,15 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
|
|||||||
goto fetch_error_out;
|
goto fetch_error_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
threebyte = *ins.codep;
|
dp = &dis386_twobyte[*ins.codep];
|
||||||
dp = &dis386_twobyte[threebyte];
|
ins.need_modrm = twobyte_has_modrm[*ins.codep];
|
||||||
ins.need_modrm = twobyte_has_modrm[threebyte];
|
|
||||||
ins.codep++;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dp = &dis386[*ins.codep];
|
dp = &dis386[*ins.codep];
|
||||||
ins.need_modrm = onebyte_has_modrm[*ins.codep];
|
ins.need_modrm = onebyte_has_modrm[*ins.codep];
|
||||||
ins.codep++;
|
|
||||||
}
|
}
|
||||||
|
ins.codep++;
|
||||||
|
|
||||||
/* Save sizeflag for printing the extra ins.prefixes later before updating
|
/* Save sizeflag for printing the extra ins.prefixes later before updating
|
||||||
it for mnemonic and operand processing. The prefix names depend
|
it for mnemonic and operand processing. The prefix names depend
|
||||||
|
|||||||
Reference in New Issue
Block a user