S/390: Add loc patterns for QImode and HImode
authorRobin Dapp <rdapp@linux.ibm.com>
Mon, 5 Nov 2018 14:18:21 +0000 (14:18 +0000)
committerRobin Dapp <rdapp@gcc.gnu.org>
Mon, 5 Nov 2018 14:18:21 +0000 (14:18 +0000)
This adds QImode and HImode support to load on condition.

gcc/ChangeLog:

2018-11-05  Robin Dapp  <rdapp@linux.ibm.com>

* config/s390/s390.md: QImode and HImode for load on condition.

gcc/testsuite/ChangeLog:

2018-11-05  Robin Dapp  <rdapp@linux.ibm.com>

* gcc.target/s390/ifcvt-one-insn-bool.c: New test.
* gcc.target/s390/ifcvt-one-insn-char.c: New test.

From-SVN: r265808

gcc/ChangeLog
gcc/config/s390/s390.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/ifcvt-one-insn-bool.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/ifcvt-one-insn-char.c [new file with mode: 0644]

index c76911d..a0f35e6 100644 (file)
@@ -1,5 +1,9 @@
 2018-11-05  Robin Dapp  <rdapp@linux.ibm.com>
 
+       * config/s390/s390.md: QImode and HImode for load on condition.
+
+2018-11-05  Robin Dapp  <rdapp@linux.ibm.com>
+
        * config/s390/predicates.md: Fix typo.
        * config/s390/s390.md: Allow immediates for load on condition.
 
index 644781f..8e7b285 100644 (file)
                                     XEXP (operands[1], 1));
 })
 
+;;
+;; - We do not have instructions for QImode or HImode but still
+;;   enable load on condition/if conversion for them.
+(define_expand "mov<mode>cc"
+ [(set (match_operand:HQI 0 "nonimmediate_operand" "")
+       (if_then_else:HQI (match_operand 1 "comparison_operator" "")
+               (match_operand:HQI 2 "loc_operand" "")
+               (match_operand:HQI 3 "loc_operand" "")))]
+ "TARGET_Z196"
+{
+  /* Emit the comparison insn in case we do not already have a comparison
+     result. */
+  if (!s390_comparison (operands[1], VOIDmode))
+    operands[1] = s390_emit_compare (GET_CODE (operands[1]),
+                             XEXP (operands[1], 0),
+                             XEXP (operands[1], 1));
+
+  rtx then = operands[2];
+  rtx els = operands[3];
+
+  if ((!TARGET_Z13 && CONSTANT_P (then)) || MEM_P (then))
+       then = force_reg (<MODE>mode, then);
+  if ((!TARGET_Z13 && CONSTANT_P (els)) || MEM_P (els))
+       els = force_reg (<MODE>mode, els);
+
+  if (!CONSTANT_P (then))
+    then = simplify_gen_subreg (E_SImode, then, <MODE>mode, 0);
+  if (!CONSTANT_P (els))
+    els = simplify_gen_subreg (E_SImode, els, <MODE>mode, 0);
+
+  rtx tmp_target = gen_reg_rtx (E_SImode);
+  emit_insn (gen_movsicc (tmp_target, operands[1], then, els));
+  emit_move_insn (operands[0], gen_lowpart (<MODE>mode, tmp_target));
+  DONE;
+})
+
+
+
 ; locr, loc, stoc, locgr, locg, stocg, lochi, locghi
 (define_insn "*mov<mode>cc"
   [(set (match_operand:GPR 0 "nonimmediate_operand"   "=d,d,d,d,d,d,S,S")
index 4716695..ae7ed52 100644 (file)
@@ -1,3 +1,8 @@
+2018-10-26  Robin Dapp  <rdapp@linux.ibm.com>
+
+       * gcc.target/s390/ifcvt-one-insn-bool.c: New test.
+       * gcc.target/s390/ifcvt-one-insn-char.c: New test.
+
 2018-11-05  Robin Dapp  <rdapp@linux.ibm.com>
 
        * gcc.dg/loop-8.c: On s390, always run the test with -march=zEC12.
diff --git a/gcc/testsuite/gcc.target/s390/ifcvt-one-insn-bool.c b/gcc/testsuite/gcc.target/s390/ifcvt-one-insn-bool.c
new file mode 100644 (file)
index 0000000..0a96b71
--- /dev/null
@@ -0,0 +1,24 @@
+/* Check load on condition for bool.  */
+
+/* { dg-do compile { target { s390*-*-* } } } */
+/* { dg-options "-O2 -march=z13" } */
+
+/* { dg-final { scan-assembler "lochinh\t%r.?,1" } } */
+#include <stdbool.h>
+
+int foo (int *a, unsigned int n)
+{
+  int min = 999999;
+  bool bla = false;
+  for (int i = 0; i < n; i++)
+    {
+      if (a[i] < min)
+       {
+         bla = true;
+       }
+    }
+
+  if (bla)
+    min += 1;
+  return min;
+}
diff --git a/gcc/testsuite/gcc.target/s390/ifcvt-one-insn-char.c b/gcc/testsuite/gcc.target/s390/ifcvt-one-insn-char.c
new file mode 100644 (file)
index 0000000..9c3d041
--- /dev/null
@@ -0,0 +1,26 @@
+/* Check load on condition for global char.  */
+
+/* { dg-do compile { target { s390*-*-* } } } */
+/* { dg-options "-O2 -march=z13" } */
+
+/* { dg-final { scan-assembler "locrnh\t%r.?,%r.?" } } */
+#include <stdbool.h>
+
+char g = 42;
+
+int foo (int *a, unsigned int n)
+{
+  int min = 999999;
+  char bla = 3;
+  for (int i = 0; i < n; i++)
+    {
+      if (a[i] < min)
+       {
+         bla = g;
+       }
+    }
+
+  if (bla == 42)
+    min += 1;
+  return min;
+}