x86: off-by-1 in offset_in_range()
authorJan Beulich <jbeulich@suse.com>
Tue, 15 Jun 2021 05:58:18 +0000 (07:58 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 15 Jun 2021 05:58:18 +0000 (07:58 +0200)
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
gas/config/tc-i386.c
gas/testsuite/gas/i386/disp-imm-16.l [new file with mode: 0644]
gas/testsuite/gas/i386/disp-imm-16.s [new file with mode: 0644]
gas/testsuite/gas/i386/disp-imm-64.l [new file with mode: 0644]
gas/testsuite/gas/i386/disp-imm-64.s [new file with mode: 0644]
gas/testsuite/gas/i386/i386.exp

index d766fd1a28c79ef23692b8007d4fc8b3298f4bd0..8a3684a756fcc7709197a9e07c79f03dd11a268d 100644 (file)
@@ -1,3 +1,12 @@
+2021-06-15  Jan Beulich  <jbeulich@suse.com>
+
+       * 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  <jbeulich@suse.com>
 
        * config/tc-i386.c (i386_att_operand): Re-introduce (now
index 858538055116b0c33d3edf235a18b7ba3ccbfc5a..c9bcccfe9f79e4d281725f460b513a29dcc45b07 100644 (file)
@@ -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 (file)
index 0000000..f1b5f1f
--- /dev/null
@@ -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 (file)
index 0000000..d33b97c
--- /dev/null
@@ -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 (file)
index 0000000..8eb56e5
--- /dev/null
@@ -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 (file)
index 0000000..a5a37a6
--- /dev/null
@@ -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
index cf215117cadb9b6ba16dd6b499f4b9fa264d49af..4112a1d171ffb977c1fae20e284524a01182aad5 100644 (file)
@@ -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"