rx.md: updated "movsicc" expand to be matched by GCC
authorSebastian Perta <sebastian.perta@renesas.com>
Fri, 9 Feb 2018 17:43:11 +0000 (17:43 +0000)
committerSebastian Perta <sebastianperta@gcc.gnu.org>
Fri, 9 Feb 2018 17:43:11 +0000 (17:43 +0000)
2018-02-09  Sebastian Perta  <sebastian.perta@renesas.com>

*config/rx.md: updated "movsicc" expand to be matched by GCC
*testsuite/gcc.target/rx/movsicc.c: new test case

From-SVN: r257533

gcc/ChangeLog
gcc/config/rx/rx.md
gcc/testsuite/gcc.target/rx/movsicc.c [new file with mode: 0644]

index c42ffa648bc0a39369516054dba3c94787cfe6b7..7f1985894767c1f32e3ded81b63b49ff11101692 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-09  Sebastian Perta  <sebastian.perta@renesas.com>
+
+       *config/rx.md: updated "movsicc" expand to be matched by GCC
+       *testsuite/gcc.target/rx/movsicc.c: new test case
+
 2018-02-09  Peter Bergner  <bergner@vnet.ibm.com>
 
        PR target/83926
index 35263b1adc7d513a56e96c35c6bc1ac32770d765..3fb2ac854b0ca89a633a5a8feef2a0e396a30424 100644 (file)
 (define_expand "movsicc"
   [(parallel
     [(set (match_operand:SI                  0 "register_operand")
-         (if_then_else:SI (match_operand:SI 1 "comparison_operator")
+         (if_then_else:SI (match_operand 1 "comparison_operator")
                           (match_operand:SI 2 "nonmemory_operand")
                           (match_operand:SI 3 "nonmemory_operand")))
      (clobber (reg:CC CC_REG))])]
   ""
 {
+  /* Make sure that we have an integer comparison...  */
+  if (GET_MODE (XEXP (operands[1], 0)) != CCmode
+      && GET_MODE (XEXP (operands[1], 0)) != SImode)
+    FAIL;
+
   /* One operand must be a constant or a register, the other must be a register.  */
   if (   ! CONSTANT_P (operands[2])
       && ! CONSTANT_P (operands[3])
diff --git a/gcc/testsuite/gcc.target/rx/movsicc.c b/gcc/testsuite/gcc.target/rx/movsicc.c
new file mode 100644 (file)
index 0000000..d8e6bcc
--- /dev/null
@@ -0,0 +1,94 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+signed int Xa, Xb;
+
+signed int stzreg_beq(int i, int a, int b)
+{
+  signed int x;
+  x = a;
+  if (i)
+    x = b;
+  return x;
+}
+
+/* { dg-final { scan-assembler "bne 1f" } } */
+
+signed int stzreg_bge(int i, int a, int b, int c)
+{
+  signed int x;
+  x = a;
+  if (i<c)
+    x = b;
+  return x;
+}
+
+/* { dg-final { scan-assembler "blt 1f" } } */
+
+signed int stzreg_bgt(int i, int a, int b)
+{
+  signed int x;
+  x = a;
+  if (i<10)
+    x = b;
+  return x;
+}
+
+/* { dg-final { scan-assembler "ble 1f" } } */
+
+signed int stzreg_ble(int i, int a, int b)
+{
+  signed int x;
+  x = a;
+  if (i>0)
+    x = b;
+  return x;
+}
+
+/* { dg-final { scan-assembler "bgt 1f" } } */
+
+signed int stzreg_blt(int i, int a, int b)
+{
+  signed int x;
+  x = a;
+  if (i<0)
+    x = b;
+  return x;
+}
+
+/* { dg-final { scan-assembler "blt 1f" } } */
+
+signed int stzreg_bne(int i, int a, int b)
+{
+  signed int x;
+  x = a;
+  if (!i)
+    x = b;
+  return x;
+}
+
+/* { dg-final { scan-assembler "beq 1f" } } */
+
+signed int stzimm_le( int i, int a )
+{
+  signed int x;
+  x = a;
+  if (i>0)
+    x = 5;
+  return x;
+}
+
+/* { dg-final { scan-assembler "ble 1f" } } */
+
+signed int stzimm_le_r( int i, int a )
+{
+  signed int x;
+  x = a;
+  if (i<0)
+    x = 5;
+  return x;
+}
+
+/* { dg-final { scan-assembler "bge 1f" } } */