From 4fe51f7d3ce96953a62c493b8c2615f8577c0f11 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 15 Jun 2021 07:58:18 +0200 Subject: [PATCH] x86: off-by-1 in offset_in_range() Just like e.g. 0x10000 triggers a warning for size 2, -0x10000 ought to as well. Note that some of the encodings produced aren't ones one would expect, and hence the generated code is not being checked for in the new testcases. --- gas/ChangeLog | 9 +++++++++ gas/config/tc-i386.c | 2 +- gas/testsuite/gas/i386/disp-imm-16.l | 10 ++++++++++ gas/testsuite/gas/i386/disp-imm-16.s | 17 +++++++++++++++++ gas/testsuite/gas/i386/disp-imm-64.l | 22 ++++++++++++++++++++++ gas/testsuite/gas/i386/disp-imm-64.s | 28 ++++++++++++++++++++++++++++ gas/testsuite/gas/i386/i386.exp | 2 ++ 7 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 gas/testsuite/gas/i386/disp-imm-16.l create mode 100644 gas/testsuite/gas/i386/disp-imm-16.s create mode 100644 gas/testsuite/gas/i386/disp-imm-64.l create mode 100644 gas/testsuite/gas/i386/disp-imm-64.s diff --git a/gas/ChangeLog b/gas/ChangeLog index d766fd1a28c..8a3684a756f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2021-06-15 Jan Beulich + + * config/tc-i386.c (offset_in_range): Adjust conditional. + * testsuite/gas/i386/disp-imm-16.s, + testsuite/gas/i386/disp-imm-16.l, + testsuite/gas/i386/disp-imm-64.s, + testsuite/gas/i386/disp-imm-64.l: New. + * testsuite/gas/i386/i386.exp: Run new tests. + 2021-06-15 Jan Beulich * config/tc-i386.c (i386_att_operand): Re-introduce (now diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 85853805511..c9bcccfe9f7 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -2563,7 +2563,7 @@ offset_in_range (offsetT val, int size) default: abort (); } - if ((val & ~mask) != 0 && (val & ~mask) != ~mask) + if ((val & ~mask) != 0 && (-val & ~mask) != 0) { char buf1[40], buf2[40]; diff --git a/gas/testsuite/gas/i386/disp-imm-16.l b/gas/testsuite/gas/i386/disp-imm-16.l new file mode 100644 index 00000000000..f1b5f1f721f --- /dev/null +++ b/gas/testsuite/gas/i386/disp-imm-16.l @@ -0,0 +1,10 @@ +.*: Assembler messages: +.*:7: Warning: .* shortened to .* +.*:8: Warning: .* shortened to .* +.*:9: Warning: .* shortened to .* +.*:11: Warning: .* shortened to .* +.*:12: Warning: .* shortened to .* +.*:13: Warning: .* shortened to .* +.*:15: Warning: .* shortened to .* +.*:16: Warning: .* shortened to .* +.*:17: Warning: .* shortened to .* diff --git a/gas/testsuite/gas/i386/disp-imm-16.s b/gas/testsuite/gas/i386/disp-imm-16.s new file mode 100644 index 00000000000..d33b97ce43e --- /dev/null +++ b/gas/testsuite/gas/i386/disp-imm-16.s @@ -0,0 +1,17 @@ + .text + .code16 + mov -0xffff(%bx), %eax + vmovaps -0xffc0(%bx), %zmm0 + add $-0xffff, %cx + + mov -0xffff-1(%bx), %eax + vmovaps -0xffc0-0x40(%bx), %zmm0 + add $-0xffff-1, %cx + + mov -0xffff-2(%bx), %eax + vmovaps -0xffc0-0x80(%bx), %zmm0 + add $-0xffff-2, %cx + + mov -0x1ffff(%bx), %eax + vmovaps -0x1ffc0(%bx), %zmm0 + add $-0x1ffff, %cx diff --git a/gas/testsuite/gas/i386/disp-imm-64.l b/gas/testsuite/gas/i386/disp-imm-64.l new file mode 100644 index 00000000000..8eb56e5815d --- /dev/null +++ b/gas/testsuite/gas/i386/disp-imm-64.l @@ -0,0 +1,22 @@ +.*: Assembler messages: +.*:2: Error: .* +.*:4: Error: .* +.*:6: Error: .* +.*:9: Error: .* +.*:10: Warning: .* shortened to .* +.*:11: Error: .* +.*:12: Warning: .* shortened to .* +.*:13: Error: .* +.*:14: Warning: .* shortened to .* +.*:16: Error: .* +.*:17: Warning: .* shortened to .* +.*:18: Error: .* +.*:19: Warning: .* shortened to .* +.*:20: Error: .* +.*:21: Warning: .* shortened to .* +.*:23: Error: .* +.*:24: Warning: .* shortened to .* +.*:25: Error: .* +.*:26: Warning: .* shortened to .* +.*:27: Error: .* +.*:28: Warning: .* shortened to .* diff --git a/gas/testsuite/gas/i386/disp-imm-64.s b/gas/testsuite/gas/i386/disp-imm-64.s new file mode 100644 index 00000000000..a5a37a65717 --- /dev/null +++ b/gas/testsuite/gas/i386/disp-imm-64.s @@ -0,0 +1,28 @@ + .text + mov -0xffffffff(%rax), %eax + mov -0xffffffff(%eax), %eax + vmovaps -0xffffffc0(%rax), %zmm0 + vmovaps -0xffffffc0(%eax), %zmm0 + add $-0xffffffff, %rcx + add $-0xffffffff, %ecx + + mov -0xffffffff-1(%rax), %eax + mov -0xffffffff-1(%eax), %eax + vmovaps -0xffffffc0-0x40(%rax), %zmm0 + vmovaps -0xffffffc0-0x40(%eax), %zmm0 + add $-0xffffffff-1, %rcx + add $-0xffffffff-1, %ecx + + mov -0xffffffff-2(%rax), %eax + mov -0xffffffff-2(%eax), %eax + vmovaps -0xffffffc0-0x80(%rax), %zmm0 + vmovaps -0xffffffc0-0x80(%eax), %zmm0 + add $-0xffffffff-2, %rcx + add $-0xffffffff-2, %ecx + + mov -0x1ffffffff(%rax), %eax + mov -0x1ffffffff(%eax), %eax + vmovaps -0x1ffffffc0(%rax), %zmm0 + vmovaps -0x1ffffffc0(%eax), %zmm0 + add $-0x1ffffffff, %rcx + add $-0x1ffffffff, %ecx diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index cf215117cad..4112a1d171f 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -87,6 +87,7 @@ if [gas_32_check] then { run_dump_test "disp" run_dump_test "disp-intel" run_dump_test "disp32" + run_list_test "disp-imm-16" run_dump_test "vmx" run_dump_test "vmfunc" run_dump_test "smx" @@ -861,6 +862,7 @@ if [gas_64_check] then { run_dump_test "x86-64-sib-intel" run_dump_test "x86-64-disp" run_dump_test "x86-64-disp-intel" + run_list_test "disp-imm-64" run_dump_test "intel-movs64" run_dump_test "intel-cmps64" run_dump_test "x86-64-disp32" -- 2.30.2