i386: Check vector length for EVEX broadcast instructions

Since not all vector lengths are supported by EVEX broadcast instructions,
decode them only with supported vector lengths.

gas/

	PR binutils/24700
	* testsuite/gas/i386/disassem.s: Add test for vbroadcasti32x8
	with invalid vector length.
	* 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/24700
	* i386-dis-evex.h (evex_table): Update EVEX_W_0F3819_P_2,
	EVEX_W_0F381A_P_2, EVEX_W_0F381B_P_2, EVEX_W_0F385A_P_2 and
	EVEX_W_0F385B_P_2.
	(evex_len_table): Add EVEX_LEN_0F3819_P_2_W_0,
	EVEX_LEN_0F3819_P_2_W_1, EVEX_LEN_0F381A_P_2_W_0,
	EVEX_LEN_0F381A_P_2_W_1, EVEX_LEN_0F381B_P_2_W_0,
	EVEX_LEN_0F381B_P_2_W_1, EVEX_LEN_0F385A_P_2_W_0,
	EVEX_LEN_0F385A_P_2_W_1, EVEX_LEN_0F385B_P_2_W_0 and
	EVEX_LEN_0F385B_P_2_W_1.
	* i386-dis.c (EVEX_LEN_0F3819_P_2_W_0): New enum.
	(EVEX_LEN_0F3819_P_2_W_1): Likewise.
	(EVEX_LEN_0F381A_P_2_W_0): Likewise.
	(EVEX_LEN_0F381A_P_2_W_1): Likewise.
	(EVEX_LEN_0F381B_P_2_W_0): Likewise.
	(EVEX_LEN_0F381B_P_2_W_1): Likewise.
	(EVEX_LEN_0F385A_P_2_W_0): Likewise.
	(EVEX_LEN_0F385A_P_2_W_1): Likewise.
	(EVEX_LEN_0F385B_P_2_W_0): Likewise.
	(EVEX_LEN_0F385B_P_2_W_1): Likewise.
This commit is contained in:
H.J. Lu
2019-06-19 10:01:27 -07:00
parent 8d6a48df54
commit f0a6222e30
8 changed files with 133 additions and 14 deletions

View File

@ -1,3 +1,12 @@
2019-06-19 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/24700
* testsuite/gas/i386/disassem.s: Add test for vbroadcasti32x8
with invalid vector length.
* testsuite/gas/i386/x86-64-disassem.s: Likewise.
* testsuite/gas/i386/disassem.d: Updated.
* testsuite/gas/i386/x86-64-disassem.d: Likewise.
2019-06-17 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/24691

View File

@ -349,6 +349,8 @@ Disassembly of section \.text:
[ ]*[a-f0-9]+:[ ]*62 f3 7d 28 1b[ ]*\(bad\)[ ]*
[ ]*[a-f0-9]+:[ ]*c8 25 62 f3[ ]*enter[ ]*\$0x6225,\$0xf3
[ ]*[a-f0-9]+:[ ]*62 f3 75 08 23[ ]*\(bad\)[ ]*
[ ]*[a-f0-9]+:[ ]*c2[ ]*.byte[ ]*0xc2
[ ]*[a-f0-9]+:[ ]*25[ ]*.byte[ ]*0x25
[ ]*[a-f0-9]+:[ ]*c2 25 62[ ]*ret[ ]*\$0x6225
[ ]*[a-f0-9]+:[ ]*62 f2 7d 28 5b[ ]*\(bad\)[ ]*
[ ]*[a-f0-9]+:[ ]*41[ ]*inc[ ]*%ecx
[ ]*[a-f0-9]+:[ ]*37[ ]*aaa[ ]*
#pass

View File

@ -173,3 +173,5 @@
.byte 0x62, 0xf3, 0x7d, 0x28, 0x1b, 0xc8, 0x25
.byte 0x62, 0xf3
.byte 0x62, 0xf3, 0x75, 0x08, 0x23, 0xc2, 0x25
.byte 0x62
.byte 0x62, 0xf2, 0x7d, 0x28, 0x5b, 0x41, 0x37

View File

@ -348,6 +348,7 @@ Disassembly of section \.text:
[ ]*[a-f0-9]+:[ ]*62 f3 7d 28 1b[ ]*\(bad\)[ ]*
[ ]*[a-f0-9]+:[ ]*c8 25 62 f3[ ]*enterq[ ]*\$0x6225,\$0xf3
[ ]*[a-f0-9]+:[ ]*62 f3 75 08 23[ ]*\(bad\)[ ]*
[ ]*[a-f0-9]+:[ ]*c2[ ]*.byte[ ]*0xc2
[ ]*[a-f0-9]+:[ ]*25[ ]*.byte[ ]*0x25
[ ]*[a-f0-9]+:[ ]*c2 25 62[ ]*retq[ ]*\$0x6225
[ ]*[a-f0-9]+:[ ]*62 f2 7d 28 5b[ ]*\(bad\)[ ]*
[ ]*[a-f0-9]+:[ ]*41 37[ ]*rex.B \(bad\)[ ]*
#pass

View File

@ -173,3 +173,5 @@
.byte 0x62, 0xf3, 0x7d, 0x28, 0x1b, 0xc8, 0x25
.byte 0x62, 0xf3
.byte 0x62, 0xf3, 0x75, 0x08, 0x23, 0xc2, 0x25
.byte 0x62
.byte 0x62, 0xf2, 0x7d, 0x28, 0x5b, 0x41, 0x37

View File

@ -1,3 +1,26 @@
2019-06-19 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/24700
* i386-dis-evex.h (evex_table): Update EVEX_W_0F3819_P_2,
EVEX_W_0F381A_P_2, EVEX_W_0F381B_P_2, EVEX_W_0F385A_P_2 and
EVEX_W_0F385B_P_2.
(evex_len_table): Add EVEX_LEN_0F3819_P_2_W_0,
EVEX_LEN_0F3819_P_2_W_1, EVEX_LEN_0F381A_P_2_W_0,
EVEX_LEN_0F381A_P_2_W_1, EVEX_LEN_0F381B_P_2_W_0,
EVEX_LEN_0F381B_P_2_W_1, EVEX_LEN_0F385A_P_2_W_0,
EVEX_LEN_0F385A_P_2_W_1, EVEX_LEN_0F385B_P_2_W_0 and
EVEX_LEN_0F385B_P_2_W_1.
* i386-dis.c (EVEX_LEN_0F3819_P_2_W_0): New enum.
(EVEX_LEN_0F3819_P_2_W_1): Likewise.
(EVEX_LEN_0F381A_P_2_W_0): Likewise.
(EVEX_LEN_0F381A_P_2_W_1): Likewise.
(EVEX_LEN_0F381B_P_2_W_0): Likewise.
(EVEX_LEN_0F381B_P_2_W_1): Likewise.
(EVEX_LEN_0F385A_P_2_W_0): Likewise.
(EVEX_LEN_0F385A_P_2_W_1): Likewise.
(EVEX_LEN_0F385B_P_2_W_0): Likewise.
(EVEX_LEN_0F385B_P_2_W_1): Likewise.
2019-06-17 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/24691

View File

@ -3568,18 +3568,18 @@ static const struct dis386 evex_table[][256] = {
},
/* EVEX_W_0F3819_P_2 */
{
{ "vbroadcastf32x2", { XM, EXxmm_mq }, 0 },
{ "vbroadcastsd", { XM, EXxmm_mq }, 0 },
{ EVEX_LEN_TABLE (EVEX_LEN_0F3819_P_2_W_0) },
{ EVEX_LEN_TABLE (EVEX_LEN_0F3819_P_2_W_1) },
},
/* EVEX_W_0F381A_P_2 */
{
{ "vbroadcastf32x4", { XM, EXxmm }, 0 },
{ "vbroadcastf64x2", { XM, EXxmm }, 0 },
{ EVEX_LEN_TABLE (EVEX_LEN_0F381A_P_2_W_0) },
{ EVEX_LEN_TABLE (EVEX_LEN_0F381A_P_2_W_1) },
},
/* EVEX_W_0F381B_P_2 */
{
{ "vbroadcastf32x8", { XM, EXxmmq }, 0 },
{ "vbroadcastf64x4", { XM, EXymm }, 0 },
{ EVEX_LEN_TABLE (EVEX_LEN_0F381B_P_2_W_0) },
{ EVEX_LEN_TABLE (EVEX_LEN_0F381B_P_2_W_1) },
},
/* EVEX_W_0F381E_P_2 */
{
@ -3739,13 +3739,13 @@ static const struct dis386 evex_table[][256] = {
},
/* EVEX_W_0F385A_P_2 */
{
{ "vbroadcasti32x4", { XM, EXxmm }, 0 },
{ "vbroadcasti64x2", { XM, EXxmm }, 0 },
{ EVEX_LEN_TABLE (EVEX_LEN_0F385A_P_2_W_0) },
{ EVEX_LEN_TABLE (EVEX_LEN_0F385A_P_2_W_1) },
},
/* EVEX_W_0F385B_P_2 */
{
{ "vbroadcasti32x8", { XM, EXxmmq }, 0 },
{ "vbroadcasti64x4", { XM, EXymm }, 0 },
{ EVEX_LEN_TABLE (EVEX_LEN_0F385B_P_2_W_0) },
{ EVEX_LEN_TABLE (EVEX_LEN_0F385B_P_2_W_1) },
},
/* EVEX_W_0F3862_P_2 */
{
@ -4129,6 +4129,76 @@ static const struct dis386 evex_table[][256] = {
{ VEX_W_TABLE (EVEX_W_0FD6_P_2) },
},
/* EVEX_LEN_0F3819_P_2_W_0 */
{
{ Bad_Opcode },
{ "vbroadcastf32x2", { XM, EXxmm_mq }, 0 },
{ "vbroadcastf32x2", { XM, EXxmm_mq }, 0 },
},
/* EVEX_LEN_0F3819_P_2_W_1 */
{
{ Bad_Opcode },
{ "vbroadcastsd", { XM, EXxmm_mq }, 0 },
{ "vbroadcastsd", { XM, EXxmm_mq }, 0 },
},
/* EVEX_LEN_0F381A_P_2_W_0 */
{
{ Bad_Opcode },
{ "vbroadcastf32x4", { XM, EXxmm }, 0 },
{ "vbroadcastf32x4", { XM, EXxmm }, 0 },
},
/* EVEX_LEN_0F381A_P_2_W_1 */
{
{ Bad_Opcode },
{ "vbroadcastf64x2", { XM, EXxmm }, 0 },
{ "vbroadcastf64x2", { XM, EXxmm }, 0 },
},
/* EVEX_LEN_0F381B_P_2_W_0 */
{
{ Bad_Opcode },
{ Bad_Opcode },
{ "vbroadcastf32x8", { XM, EXxmmq }, 0 },
},
/* EVEX_LEN_0F381B_P_2_W_1 */
{
{ Bad_Opcode },
{ Bad_Opcode },
{ "vbroadcastf64x4", { XM, EXymm }, 0 },
},
/* EVEX_LEN_0F385A_P_2_W_0 */
{
{ Bad_Opcode },
{ "vbroadcasti32x4", { XM, EXxmm }, 0 },
{ "vbroadcasti32x4", { XM, EXxmm }, 0 },
},
/* EVEX_LEN_0F385A_P_2_W_1 */
{
{ Bad_Opcode },
{ "vbroadcasti64x2", { XM, EXxmm }, 0 },
{ "vbroadcasti64x2", { XM, EXxmm }, 0 },
},
/* EVEX_LEN_0F385B_P_2_W_0 */
{
{ Bad_Opcode },
{ Bad_Opcode },
{ "vbroadcasti32x8", { XM, EXxmmq }, 0 },
},
/* EVEX_LEN_0F385B_P_2_W_1 */
{
{ Bad_Opcode },
{ Bad_Opcode },
{ "vbroadcasti64x4", { XM, EXymm }, 0 },
},
/* EVEX_LEN_0F3A18_P_2_W_0 */
{
{ Bad_Opcode },

View File

@ -1938,6 +1938,16 @@ enum
EVEX_LEN_0F7E_P_1,
EVEX_LEN_0F7E_P_2,
EVEX_LEN_0FD6_P_2,
EVEX_LEN_0F3819_P_2_W_0,
EVEX_LEN_0F3819_P_2_W_1,
EVEX_LEN_0F381A_P_2_W_0,
EVEX_LEN_0F381A_P_2_W_1,
EVEX_LEN_0F381B_P_2_W_0,
EVEX_LEN_0F381B_P_2_W_1,
EVEX_LEN_0F385A_P_2_W_0,
EVEX_LEN_0F385A_P_2_W_1,
EVEX_LEN_0F385B_P_2_W_0,
EVEX_LEN_0F385B_P_2_W_1,
EVEX_LEN_0F3A18_P_2_W_0,
EVEX_LEN_0F3A18_P_2_W_1,
EVEX_LEN_0F3A19_P_2_W_0,