]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
S/390: Fix vector shift count operand
authorAndreas Krebbel <krebbel@linux.ibm.com>
Mon, 15 Jul 2019 14:31:37 +0000 (14:31 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Mon, 15 Jul 2019 14:31:37 +0000 (14:31 +0000)
We currently use subst definitions to handle the different variants of shift
count operands. Unfortunately, in the vector shift pattern the shift count
operand is used directly. Without it being adjusted for the 'subst' variants the
displacement value is omitted resulting in a wrong shift count being applied.

This patch needs to be applied to older branches as well.

gcc/ChangeLog:

2019-07-15  Andreas Krebbel  <krebbel@linux.ibm.com>

Backport from mainline
2019-07-01  Andreas Krebbel  <krebbel@linux.ibm.com>

* config/s390/vector.md: Fix shift count operand printing.

gcc/testsuite/ChangeLog:

2019-07-15  Andreas Krebbel  <krebbel@linux.ibm.com>

Backport from mainline
2019-07-01  Andreas Krebbel  <krebbel@linux.ibm.com>

* gcc.target/s390/vector/vec-shift-2.c: New test.

From-SVN: r273494

gcc/ChangeLog
gcc/config/s390/vector.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/vector/vec-shift-2.c [new file with mode: 0644]

index 0c98e8b7d44203611c053c3da3df3ee32c9c104a..9de8ec77ca2eb45ec0547effd7f47633f0da46b7 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-15  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       Backport from mainline
+       2019-07-01  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * config/s390/vector.md: Fix shift count operand printing.
+
 2019-07-12  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR rtl-optimization/91136
index 2952893834a776a3daeedd1154a15b19b71d1696..eaa57071014e43605dea301c639f2d9021fada22 100644 (file)
        (VEC_SHIFTS:VI (match_operand:VI 1 "register_operand"   "v")
                       (match_operand:SI 2 "nonmemory_operand" "an")))]
   "TARGET_VX"
-  "<vec_shifts_mnem><bhfgq>\t%v0,%v1,%Y2"
+  "<vec_shifts_mnem><bhfgq>\t%v0,%v1,<addr_style_op_ops>"
   [(set_attr "op_type" "VRS")])
 
 ; Shift each element by corresponding vector element
index dd09f7696429b9f0bf448f7cc07e6899cca47324..468cd0928ef7c699d4627e91765c7cd74c0de533 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-15  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       Backport from mainline
+       2019-07-01  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * gcc.target/s390/vector/vec-shift-2.c: New test.
+
 2019-07-12  Wilco Dijkstra  <wdijkstr@arm.com>
 
        PR testsuite/78529
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-2.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-2.c
new file mode 100644 (file)
index 0000000..c7a1d93
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 --save-temps" } */
+
+/* { dg-final { scan-assembler-times "veslf" 1 } } */
+
+typedef __attribute__((vector_size(16))) signed int v4si;
+
+v4si __attribute__((noinline,noclone))
+shift_left_by_scalar (v4si in, int shift_count)
+{
+  return in << (3 + shift_count);
+}
+
+int
+main ()
+{
+  v4si a = { 1, 2, 3, 4 };
+  v4si result = shift_left_by_scalar (a, 1);
+
+  if (result[1] != 32)
+    __builtin_abort ();
+
+  return 0;
+}