aboutsummaryrefslogtreecommitdiff
path: root/opcodes
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2019-06-05 10:27:08 -0700
committerH.J. Lu <hjl.tools@gmail.com>2019-06-05 10:27:28 -0700
commit12efd68d159444ad8dfe24e49965a228ba980b86 (patch)
tree277ddd7404ff2131da5578b6e4a993372be0e0ed /opcodes
parent62d8e3b73139b159963025b5568ec1f5051450f0 (diff)
downloadgdb-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/ChangeLog19
-rw-r--r--opcodes/i386-dis-evex.h72
-rw-r--r--opcodes/i386-dis.c10
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