diff options
author | Jan Beulich <jbeulich@suse.com> | 2022-11-09 11:09:34 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2022-11-09 11:09:34 +0100 |
commit | 47c0279b2ca36fd79ad4ce8601103623a92161ae (patch) | |
tree | 23fd98ed159147896f3b81bc6ce368ffcee67fe0 | |
parent | 2d4989e98ee5e63b76ce3e35b0e02baaee2f50cb (diff) | |
download | gdb-47c0279b2ca36fd79ad4ce8601103623a92161ae.zip gdb-47c0279b2ca36fd79ad4ce8601103623a92161ae.tar.gz gdb-47c0279b2ca36fd79ad4ce8601103623a92161ae.tar.bz2 |
x86/Intel: don't accept malformed EXTRQ / INSERTQ
Operand swapping was mistakenly suppressed when the first two operands
were immediate ones, not taking into account overall operand count. This
way EXTRQ / INSERTQ would have been accepted also with kind-of-AT&T
operand order.
For the testcase being extended, in order to not move around "GAS
LISTING" expectations, suppress pagination.
-rw-r--r-- | gas/config/tc-i386.c | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/i386.exp | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/inval.l | 25 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/inval.s | 3 |
4 files changed, 17 insertions, 16 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 6dcf114..da005c5 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -4885,7 +4885,8 @@ md_assemble (char *line) && !startswith (mnemonic, "rmp") && (strcmp (mnemonic, "tpause") != 0) && (strcmp (mnemonic, "umwait") != 0) - && !(operand_type_check (i.types[0], imm) + && !(i.operands == 2 + && operand_type_check (i.types[0], imm) && operand_type_check (i.types[1], imm))) swap_operands (); diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 5b20ac7..cad783e 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -51,7 +51,7 @@ if [gas_32_check] then { run_list_test "float" "-al -mmnemonic=att" run_list_test "general" "-al --listing-lhs-width=2" - run_list_test "inval" "-al" + run_list_test "inval" "-aln" run_list_test "inval-16" "-al" run_list_test "segment" "-al" run_list_test "inval-seg" "-al" diff --git a/gas/testsuite/gas/i386/inval.l b/gas/testsuite/gas/i386/inval.l index abe2206..5d520f0 100644 --- a/gas/testsuite/gas/i386/inval.l +++ b/gas/testsuite/gas/i386/inval.l @@ -87,19 +87,18 @@ .*:97: Error: .*shl.* .*:98: Error: .*rol.* .*:99: Error: .*rcl.* -.*:102: Error: .* -.*:104: Error: .* +.*:101: Error: .*extrq.* +.*:102: Error: .*insertq.* .*:105: Error: .* -.*:106: Error: .* +.*:107: Error: .* .*:108: Error: .* .*:109: Error: .* -.*:110: Error: .* +.*:111: Error: .* .*:112: Error: .* .*:113: Error: .* -.*:114: Error: .* -GAS LISTING .* - - +.*:115: Error: .* +.*:116: Error: .* +.*:117: Error: .* [ ]*1[ ]+\.text [ ]*2[ ]+\.allow_index_reg [ ]*3[ ]+\# All the following should be illegal @@ -157,9 +156,6 @@ GAS LISTING .* [ ]*55[ ]+fnstsw %al [ ]*56[ ]+fstsw %eax [ ]*57[ ]+fstsw %al -GAS LISTING .* - - [ ]*58[ ]+ [ ]*59[ ]+movnti %ax, \(%eax\) [ ]*60[ ]+movntiw %ax, \(%eax\) @@ -203,6 +199,9 @@ GAS LISTING .* [ ]*[1-9][0-9]*[ ]+rol \[ecx\], 2 [ ]*[1-9][0-9]*[ ]+rcl \[edx\], cl [ ]*[1-9][0-9]*[ ]+ +[ ]*[1-9][0-9]*[ ]+extrq 1, 2, xmm3 +[ ]*[1-9][0-9]*[ ]+insertq 1, 2, xmm3, xmm4 +[ ]*[1-9][0-9]*[ ]+ [ ]*[1-9][0-9]*[ ]+\.att_syntax prefix [ ]*[1-9][0-9]*[ ]+movsd \(%esi\), %ss:\(%edi\), %ss:\(%eax\) [ ]*[1-9][0-9]*[ ]+ @@ -217,6 +216,4 @@ GAS LISTING .* [ ]*[1-9][0-9]*[ ]+inb %dx, %ax [ ]*[1-9][0-9]*[ ]+outb %ax, %dx [ ]*[1-9][0-9]*[ ]+movb %ax, %bx -GAS LISTING .* - - +#pass diff --git a/gas/testsuite/gas/i386/inval.s b/gas/testsuite/gas/i386/inval.s index 7adfec6..4e9f751 100644 --- a/gas/testsuite/gas/i386/inval.s +++ b/gas/testsuite/gas/i386/inval.s @@ -98,6 +98,9 @@ movnti word ptr [eax], ax rol [ecx], 2 rcl [edx], cl + extrq 1, 2, xmm3 + insertq 1, 2, xmm3, xmm4 + .att_syntax prefix movsd (%esi), %ss:(%edi), %ss:(%eax) |