]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86: don't mistakenly scale non-8-bit displacements
authorJan Beulich <jbeulich@novell.com>
Tue, 31 Jul 2018 09:04:34 +0000 (11:04 +0200)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 26 Nov 2018 12:30:54 +0000 (04:30 -0800)
In commit b5014f7af2 I've removed (instead of replaced) a conditional,
resulting in addressing forms not allowing 8-bit displacements to now
get their displacements scaled under certain circumstances. Re-add the
missing conditional.

2018-07-30  Jan Beulich  <jbeulich@suse.com>

PR gas/23465
* config/tc-i386.c (output_disp): Restrict scaling.
* testsuite/gas/i386/evex-no-scale.s,
  testsuite/gas/i386/evex-no-scale-32.d
  testsuite/gas/i386/evex-no-scale-64.d: New.
* testsuite/gas/i386/i386.exp: Run new tests.

(cherry picked from commit 629cfaf1b0fbb32a985607c774bd8e7870b9fa94)

gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/evex-no-scale-32.d [new file with mode: 0644]
gas/testsuite/gas/i386/evex-no-scale-64.d [new file with mode: 0644]
gas/testsuite/gas/i386/evex-no-scale.s [new file with mode: 0644]
gas/testsuite/gas/i386/i386.exp

index ab763fdc8a378929f922da8657ceaa952bc166f5..e70f443583f53d9d9de914fd01ca05c2040185f2 100644 (file)
@@ -1,3 +1,12 @@
+2018-11-26  Jan Beulich  <jbeulich@suse.com>
+
+       PR gas/23465
+       * config/tc-i386.c (output_disp): Restrict scaling.
+       * testsuite/gas/i386/evex-no-scale.s,
+         testsuite/gas/i386/evex-no-scale-32.d
+         testsuite/gas/i386/evex-no-scale-64.d: New.
+       * testsuite/gas/i386/i386.exp: Run new tests.
+
 2018-08-05  John David Anglin  <danglin@gcc.gnu.org>
 
        Backport from master branch
index cd69321bdb25f698f7764e5648d10253472724a3..b8042ba434207efe9d70c9de9654a2ff110a2c9d 100644 (file)
@@ -7418,7 +7418,8 @@ output_disp (fragS *insn_start_frag, offsetT insn_start_off)
              int size = disp_size (n);
              offsetT val = i.op[n].disps->X_add_number;
 
-             val = offset_in_range (val >> i.memshift, size);
+             val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
+                                    size);
              p = frag_more (size);
              md_number_to_chars (p, val, size);
            }
diff --git a/gas/testsuite/gas/i386/evex-no-scale-32.d b/gas/testsuite/gas/i386/evex-no-scale-32.d
new file mode 100644 (file)
index 0000000..e6116bc
--- /dev/null
@@ -0,0 +1,13 @@
+#source: evex-no-scale.s
+#objdump: -dw
+#name: ix86 EVEX no disp scaling
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <disp>:
+ +[a-f0-9]+:   62 f1 7c 48 28 04 05 40 00 00 00        vmovaps 0x40\(,%eax,1\),%zmm0
+ +[a-f0-9]+:   62 f1 7c 48 28 04 25 40 00 00 00        vmovaps 0x40\(,%eiz,1\),%zmm0
+ +[a-f0-9]+:   62 f1 7c 48 28 05 40 00 00 00   vmovaps 0x40,%zmm0
+ +[a-f0-9]+:   67 62 f1 7c 48 28 06 40 00      vmovaps 0x40,%zmm0
diff --git a/gas/testsuite/gas/i386/evex-no-scale-64.d b/gas/testsuite/gas/i386/evex-no-scale-64.d
new file mode 100644 (file)
index 0000000..b66f15b
--- /dev/null
@@ -0,0 +1,15 @@
+#source: evex-no-scale.s
+#objdump: -dw
+#name: x86-64 EVEX no disp scaling
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <disp>:
+ +[a-f0-9]+:   62 f1 7c 48 28 05 00 fc ff ff   vmovaps -0x400\(%rip\),%zmm0        # .*
+ +[a-f0-9]+:   62 f1 7c 48 28 04 05 40 00 00 00        vmovaps 0x40\(,%rax,1\),%zmm0
+ +[a-f0-9]+:   62 f1 7c 48 28 04 25 40 00 00 00        vmovaps 0x40,%zmm0
+ +[a-f0-9]+:   67 62 f1 7c 48 28 04 05 40 00 00 00     vmovaps 0x40\(,%eax,1\),%zmm0
+ +[a-f0-9]+:   67 62 f1 7c 48 28 04 25 40 00 00 00     addr32 vmovaps 0x40,%zmm0
+ +[a-f0-9]+:   62 f1 7c 48 28 04 25 40 00 00 00        vmovaps 0x40,%zmm0
diff --git a/gas/testsuite/gas/i386/evex-no-scale.s b/gas/testsuite/gas/i386/evex-no-scale.s
new file mode 100644 (file)
index 0000000..ed0f231
--- /dev/null
@@ -0,0 +1,19 @@
+       .allow_index_reg
+       .section .probe, "", @progbits
+.Lprobe_64bit:
+       inc     %eax
+.equiv is_64bit, (. - .Lprobe_64bit) / 2
+
+       .text
+disp:
+.if is_64bit
+       vmovaps -1024(%rip), %zmm0
+       vmovaps 64(,%rax), %zmm0
+       vmovaps 64(,%riz), %zmm0
+.endif
+       vmovaps 64(,%eax), %zmm0
+       vmovaps 64(,%eiz), %zmm0
+       vmovaps 64, %zmm0
+.if !is_64bit
+       addr16 vmovaps 64, %zmm0
+.endif
index b81cc20fd9e25aff8cc4d2b701630330cfda4b48..40c5d12724212d072843a9bdd2c09f486d44f514 100644 (file)
@@ -216,6 +216,7 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
     run_dump_test "evex-lig512-intel"
     run_dump_test "evex-wig1"
     run_dump_test "evex-wig1-intel"
+    run_dump_test "evex-no-scale-32"
     run_dump_test "sse2avx"
     run_list_test "inval-avx" "-al"
     run_list_test "inval-avx512f" "-al"
@@ -692,6 +693,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
     run_dump_test "x86-64-evex-lig512-intel"
     run_dump_test "x86-64-evex-wig1"
     run_dump_test "x86-64-evex-wig1-intel"
+    run_dump_test "evex-no-scale-64"
     run_dump_test "x86-64-sse2avx"
     run_list_test "x86-64-inval-avx" "-al"
     run_list_test "x86-64-inval-avx512f" "-al"