mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-24 12:35:55 +08:00
x86/APX: TILE{RELEASE,ZERO} have no EVEX encodings
Re-using the entire VEX decode hierarchy for the respective major opcode has led to those two also being decoded as-if valid. Follow the earlier USE_X86_64_EVEX_{PFX,W}_TABLE approach to avoid this happening.
This commit is contained in:
parent
836f6ceb83
commit
c179ace029
@ -375,9 +375,9 @@ static const struct dis386 evex_table[][256] = {
|
||||
{ "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
|
||||
/* 48 */
|
||||
{ Bad_Opcode },
|
||||
{ X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F3849) },
|
||||
{ X86_64_EVEX_MEM_W_TABLE (VEX_W_0F3849_X86_64_L_0) },
|
||||
{ Bad_Opcode },
|
||||
{ X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F384B) },
|
||||
{ X86_64_EVEX_MEM_W_TABLE (VEX_W_0F384B_X86_64_L_0) },
|
||||
{ "vrcp14p%XW", { XM, EXx }, PREFIX_DATA },
|
||||
{ "vrcp14s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
|
||||
{ "vrsqrt14p%XW", { XM, EXx }, 0 },
|
||||
|
@ -823,6 +823,7 @@ enum
|
||||
USE_X86_64_EVEX_FROM_VEX_TABLE,
|
||||
USE_X86_64_EVEX_PFX_TABLE,
|
||||
USE_X86_64_EVEX_W_TABLE,
|
||||
USE_X86_64_EVEX_MEM_W_TABLE,
|
||||
USE_3BYTE_TABLE,
|
||||
USE_XOP_8F_TABLE,
|
||||
USE_VEX_C4_TABLE,
|
||||
@ -845,6 +846,7 @@ enum
|
||||
DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I))
|
||||
#define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I))
|
||||
#define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I))
|
||||
#define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I))
|
||||
#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
|
||||
#define XOP_8F_TABLE() DIS386 (USE_XOP_8F_TABLE, 0)
|
||||
#define VEX_C4_TABLE() DIS386 (USE_VEX_C4_TABLE, 0)
|
||||
@ -8802,6 +8804,7 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
|
||||
case USE_X86_64_EVEX_FROM_VEX_TABLE:
|
||||
case USE_X86_64_EVEX_PFX_TABLE:
|
||||
case USE_X86_64_EVEX_W_TABLE:
|
||||
case USE_X86_64_EVEX_MEM_W_TABLE:
|
||||
ins->evex_type = evex_from_vex;
|
||||
/* EVEX from VEX instructions are 64-bit only and require that EVEX.z,
|
||||
EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0. */
|
||||
@ -8816,6 +8819,12 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
|
||||
goto use_prefix_table;
|
||||
if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE)
|
||||
goto use_vex_w_table;
|
||||
if (dp->op[0].bytemode == USE_X86_64_EVEX_MEM_W_TABLE)
|
||||
{
|
||||
if (ins->modrm.mod == 3)
|
||||
return &bad_opcode;
|
||||
goto use_vex_w_table;
|
||||
}
|
||||
|
||||
/* Fall through. */
|
||||
case USE_X86_64_TABLE:
|
||||
|
Loading…
Reference in New Issue
Block a user