sh.c (sh_expand_t_scc): Emit movrt for SH2A if possible.
authorNaveen.H.S <naveen.hs@kpitcummins.com>
Tue, 25 Mar 2008 13:41:23 +0000 (13:41 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Tue, 25 Mar 2008 13:41:23 +0000 (13:41 +0000)
* config/sh/sh.c (sh_expand_t_scc): Emit movrt for SH2A if
possible.
* config/sh/sh.md (xorsi3_movrt, movrt): New insns.

* gcc.target/sh/sh2a-movrt.c: New test.

From-SVN: r133517

gcc/ChangeLog
gcc/config/sh/sh.c
gcc/config/sh/sh.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/sh/sh2a-movrt.c [new file with mode: 0644]

index 339c91e3dd92a78011de47f45421133cce58914b..97b2f64c8fe449e050b6e8fb41d7c46ba7877a87 100644 (file)
@@ -1,3 +1,9 @@
+2008-03-25  Naveen.H.S  <naveen.hs@kpitcummins.com>
+
+       * config/sh/sh.c (sh_expand_t_scc): Emit movrt for SH2A if
+       possible.
+       * config/sh/sh.md (xorsi3_movrt, movrt): New insns.
+
 2008-03-25  Naveen.H.S  <naveen.hs@kpitcummins.com>
 
        * config/sh/sh.md (prefetch): Add condition for SH2A target.
index df959d82746a51e70d4246e171964365165a8cea..699ac899bffe7599359691f8355849e7a4b4fcbf 100644 (file)
@@ -10605,6 +10605,9 @@ sh_expand_t_scc (enum rtx_code code, rtx target)
   val = INTVAL (sh_compare_op1);
   if ((code == EQ && val == 1) || (code == NE && val == 0))
     emit_insn (gen_movt (result));
+  else if (TARGET_SH2A && ((code == EQ && val == 0)
+                           || (code == NE && val == 1)))
+    emit_insn (gen_movrt (result));
   else if ((code == EQ && val == 0) || (code == NE && val == 1))
     {
       emit_insn (gen_rtx_CLOBBER (VOIDmode, result));
index 0073370701edab8880724b87183ab1d47d17be8d..61e902563ef0d828fba30e70a69a8f64eed27217 100644 (file)
@@ -3326,6 +3326,15 @@ label:
        xori    %1, %2, %0"
   [(set_attr "type" "arith_media")])
 
+;; Store the complements of the T bit in a register.
+(define_insn "xorsi3_movrt"
+  [(set (match_operand:SI 0 "arith_reg_dest" "=r")
+       (xor:SI (reg:SI T_REG)
+               (const_int 1)))]
+  "TARGET_SH2A"
+  "movrt\\t%0"
+  [(set_attr "type" "arith")])
+
 (define_insn "xordi3"
   [(set (match_operand:DI 0 "arith_reg_dest" "=r,r")
        (xor:DI (match_operand:DI 1 "arith_reg_operand" "%r,r")
@@ -9545,6 +9554,16 @@ mov.l\\t1f,r0\\n\\
   "movt        %0"
   [(set_attr "type" "arith")])
 
+;; complements the T bit and stores the result in a register
+(define_insn "movrt"
+  [(set (match_operand:SI 0 "arith_reg_dest" "=r")
+        (if_then_else (eq:SI (reg:SI T_REG) (const_int 0))
+        (const_int 1)
+        (const_int 0)))]
+  "TARGET_SH2A"
+  "movrt\\t%0"
+   [(set_attr "type" "arith")])
+
 (define_expand "seq"
   [(set (match_operand:SI 0 "arith_reg_dest" "")
        (match_dup 1))]
index f61cfcf55077b540bb7731242e4584dd75f5cc33..da9126067ad1716fda90ba8268b4855ed6719aa3 100644 (file)
@@ -1,3 +1,7 @@
+2008-03-25  Naveen.H.S  <naveen.hs@kpitcummins.com>
+
+       * gcc.target/sh/sh2a-movrt.c: New test.
+
 2008-03-25  Naveen.H.S  <naveen.hs@kpitcummins.com>
 
        * gcc.target/sh/sh2a-prefetch.c: New test.
diff --git a/gcc/testsuite/gcc.target/sh/sh2a-movrt.c b/gcc/testsuite/gcc.target/sh/sh2a-movrt.c
new file mode 100644 (file)
index 0000000..9df9f4b
--- /dev/null
@@ -0,0 +1,15 @@
+/* Testcase to check generation of a SH2A specific instruction for
+   'MOVRT Rn'.  */
+/* { dg-do assemble {target sh*-*-*}}  */
+/* { dg-options "-O1" }  */
+/* { dg-skip-if "" { "sh*-*-*" } "*" "-m2a -m2a-nofpu -m2a-single -m2a-single-only" }  */
+/* { dg-final { scan-assembler "movrt"} }  */
+
+int
+foo (void)
+{
+  int a, b, g, stop;
+  if (stop = ((a + b) % 2 != g))
+    ;
+  return stop;
+}