diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2019-06-05 10:27:08 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2019-06-05 10:27:28 -0700 |
commit | 12efd68d159444ad8dfe24e49965a228ba980b86 (patch) | |
tree | 277ddd7404ff2131da5578b6e4a993372be0e0ed /opcodes | |
parent | 62d8e3b73139b159963025b5568ec1f5051450f0 (diff) | |
download | gdb-12efd68d159444ad8dfe24e49965a228ba980b86.zip gdb-12efd68d159444ad8dfe24e49965a228ba980b86.tar.gz gdb-12efd68d159444ad8dfe24e49965a228ba980b86.tar.bz2 |
i386: Check vector length for EVEX vextractfXX and vinsertfXX
Since not all vector lengths are supported by EVEX vextractfXX and
vinsertfXX, decode them only with supported vector lengths.
gas/
PR binutils/24633
* testsuite/gas/i386/disassem.s: Add tests for invalid vector
lengths for EVEX vextractfXX and vinsertfXX.
* testsuite/gas/i386/x86-64-disassem.s: Likewise.
* testsuite/gas/i386/disassem.d: Updated.
* testsuite/gas/i386/x86-64-disassem.d: Likewise.
opcodes/
PR binutils/24633
* i386-dis-evex.h (evex_table): Update EVEX_W_0F3A18_P_2,
EVEX_W_0F3A19_P_2, EVEX_W_0F3A1A_P_2 and EVEX_W_0F3A1B_P_2.
(evex_len_table): EVEX_LEN_0F3A18_P_2_W_0,
EVEX_LEN_0F3A18_P_2_W_1, EVEX_LEN_0F3A19_P_2_W_0,
EVEX_LEN_0F3A19_P_2_W_1, EVEX_LEN_0F3A1A_P_2_W_0,
EVEX_LEN_0F3A1A_P_2_W_1, EVEX_LEN_0F3A1B_P_2_W_0,
EVEX_LEN_0F3A1B_P_2_W_1.
* i386-dis.c (EVEX_LEN_0F3A18_P_2_W_0): New enum.
(EVEX_LEN_0F3A18_P_2_W_1): Likewise.
(EVEX_LEN_0F3A19_P_2_W_0): Likewise.
(EVEX_LEN_0F3A19_P_2_W_1): Likewise.
(EVEX_LEN_0F3A1A_P_2_W_0): Likewise.
(EVEX_LEN_0F3A1A_P_2_W_1): Likewise.
(EVEX_LEN_0F3A1B_P_2_W_0): Likewise.
(EVEX_LEN_0F3A1B_P_2_W_1): Likewise.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/ChangeLog | 19 | ||||
-rw-r--r-- | opcodes/i386-dis-evex.h | 72 | ||||
-rw-r--r-- | opcodes/i386-dis.c | 10 |
3 files changed, 92 insertions, 9 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 9f5b347..8d72ded 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,22 @@ +2019-06-05 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/24633 + * i386-dis-evex.h (evex_table): Update EVEX_W_0F3A18_P_2, + EVEX_W_0F3A19_P_2, EVEX_W_0F3A1A_P_2 and EVEX_W_0F3A1B_P_2. + (evex_len_table): EVEX_LEN_0F3A18_P_2_W_0, + EVEX_LEN_0F3A18_P_2_W_1, EVEX_LEN_0F3A19_P_2_W_0, + EVEX_LEN_0F3A19_P_2_W_1, EVEX_LEN_0F3A1A_P_2_W_0, + EVEX_LEN_0F3A1A_P_2_W_1, EVEX_LEN_0F3A1B_P_2_W_0, + EVEX_LEN_0F3A1B_P_2_W_1. + * i386-dis.c (EVEX_LEN_0F3A18_P_2_W_0): New enum. + (EVEX_LEN_0F3A18_P_2_W_1): Likewise. + (EVEX_LEN_0F3A19_P_2_W_0): Likewise. + (EVEX_LEN_0F3A19_P_2_W_1): Likewise. + (EVEX_LEN_0F3A1A_P_2_W_0): Likewise. + (EVEX_LEN_0F3A1A_P_2_W_1): Likewise. + (EVEX_LEN_0F3A1B_P_2_W_0): Likewise. + (EVEX_LEN_0F3A1B_P_2_W_1): Likewise. + 2019-06-04 H.J. Lu <hongjiu.lu@intel.com> PR binutils/24626 diff --git a/opcodes/i386-dis-evex.h b/opcodes/i386-dis-evex.h index 9965d4f..0003e77 100644 --- a/opcodes/i386-dis-evex.h +++ b/opcodes/i386-dis-evex.h @@ -3912,23 +3912,23 @@ static const struct dis386 evex_table[][256] = { }, /* EVEX_W_0F3A18_P_2 */ { - { "vinsertf32x4", { XM, Vex, EXxmm, Ib }, 0 }, - { "vinsertf64x2", { XM, Vex, EXxmm, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A18_P_2_W_0) }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A18_P_2_W_1) }, }, /* EVEX_W_0F3A19_P_2 */ { - { "vextractf32x4", { EXxmm, XM, Ib }, 0 }, - { "vextractf64x2", { EXxmm, XM, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A19_P_2_W_0) }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A19_P_2_W_1) }, }, /* EVEX_W_0F3A1A_P_2 */ { - { "vinsertf32x8", { XM, Vex, EXxmmq, Ib }, 0 }, - { "vinsertf64x4", { XM, Vex, EXxmmq, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A1A_P_2_W_0) }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A1A_P_2_W_1) }, }, /* EVEX_W_0F3A1B_P_2 */ { - { "vextractf32x8", { EXxmmq, XM, Ib }, 0 }, - { "vextractf64x4", { EXxmmq, XM, Ib }, 0 }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A1B_P_2_W_0) }, + { EVEX_LEN_TABLE (EVEX_LEN_0F3A1B_P_2_W_1) }, }, /* EVEX_W_0F3A1D_P_2 */ { @@ -4129,4 +4129,60 @@ static const struct dis386 evex_table[][256] = { { VEX_W_TABLE (EVEX_W_0FD6_P_2) }, }, + /* EVEX_LEN_0F3A18_P_2_W_0 */ + { + { Bad_Opcode }, + { "vinsertf32x4", { XM, Vex, EXxmm, Ib }, 0 }, + { "vinsertf32x4", { XM, Vex, EXxmm, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A18_P_2_W_1 */ + { + { Bad_Opcode }, + { "vinsertf64x2", { XM, Vex, EXxmm, Ib }, 0 }, + { "vinsertf64x2", { XM, Vex, EXxmm, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A19_P_2_W_0 */ + { + { Bad_Opcode }, + { "vextractf32x4", { EXxmm, XM, Ib }, 0 }, + { "vextractf32x4", { EXxmm, XM, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A19_P_2_W_1 */ + { + { Bad_Opcode }, + { "vextractf64x2", { EXxmm, XM, Ib }, 0 }, + { "vextractf64x2", { EXxmm, XM, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A1A_P_2_W_0 */ + { + { Bad_Opcode }, + { Bad_Opcode }, + { "vinsertf32x8", { XM, Vex, EXxmmq, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A1A_P_2_W_1 */ + { + { Bad_Opcode }, + { Bad_Opcode }, + { "vinsertf64x4", { XM, Vex, EXxmmq, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A1B_P_2_W_0 */ + { + { Bad_Opcode }, + { Bad_Opcode }, + { "vextractf32x8", { EXxmmq, XM, Ib }, 0 }, + }, + + /* EVEX_LEN_0F3A1B_P_2_W_1 */ + { + { Bad_Opcode }, + { Bad_Opcode }, + { "vextractf64x4", { EXxmmq, XM, Ib }, 0 }, + }, + #endif /* NEED_EVEX_LEN_TABLE */ diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index f597539..5d1bd6b 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -1937,7 +1937,15 @@ enum EVEX_LEN_0F6E_P_2 = 0, EVEX_LEN_0F7E_P_1, EVEX_LEN_0F7E_P_2, - EVEX_LEN_0FD6_P_2 + EVEX_LEN_0FD6_P_2, + EVEX_LEN_0F3A18_P_2_W_0, + EVEX_LEN_0F3A18_P_2_W_1, + EVEX_LEN_0F3A19_P_2_W_0, + EVEX_LEN_0F3A19_P_2_W_1, + EVEX_LEN_0F3A1A_P_2_W_0, + EVEX_LEN_0F3A1A_P_2_W_1, + EVEX_LEN_0F3A1B_P_2_W_0, + EVEX_LEN_0F3A1B_P_2_W_1 }; enum |