spu.c (spu_emit_branch_or_set): Avoid reverse tests when generating an integer result...
authorUlrich Weigand <uweigand@de.ibm.com>
Tue, 16 Aug 2011 18:39:55 +0000 (18:39 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Tue, 16 Aug 2011 18:39:55 +0000 (18:39 +0000)
* config/spu/spu.c (spu_emit_branch_or_set): Avoid reverse tests
when generating an integer result where possible.  Short-cut
comparison against 0 also for QImode.

From-SVN: r177795

gcc/ChangeLog
gcc/config/spu/spu.c

index 67ae4ed826375b0e6b5b2de4fac948a40ff2eaed..1a43c1211f34be146207625d2fe93cf4773c909c 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-16  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       * config/spu/spu.c (spu_emit_branch_or_set): Avoid reverse tests
+       when generating an integer result where possible.  Short-cut
+       comparison against 0 also for QImode.
+
 2011-08-16  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        * config/spu/spu.h (LEGITIMIZE_RELOAD_ADDRESS): New macro.
index 7868c7f98107a3b44f05d7461748d57c21d44a33..b8e3fb35da3afe71b65a616af1c2d45b80e6f7d7 100644 (file)
@@ -982,6 +982,27 @@ spu_emit_branch_or_set (int is_set, rtx cmp, rtx operands[])
          }
     }
 
+  /* However, if we generate an integer result, performing a reverse test
+     would require an extra negation, so avoid that where possible.  */
+  if (GET_CODE (op1) == CONST_INT && is_set == 1)
+    {
+      HOST_WIDE_INT val = INTVAL (op1) + 1;
+      if (trunc_int_for_mode (val, GET_MODE (op0)) == val)
+       switch (code)
+         {
+         case LE:
+           op1 = GEN_INT (val);
+           code = LT;
+           break;
+         case LEU:
+           op1 = GEN_INT (val);
+           code = LTU;
+           break;
+         default:
+           break;
+         }
+    }
+
   comp_mode = SImode;
   op_mode = GET_MODE (op0);
 
@@ -1113,7 +1134,8 @@ spu_emit_branch_or_set (int is_set, rtx cmp, rtx operands[])
 
   if (is_set == 0 && op1 == const0_rtx
       && (GET_MODE (op0) == SImode
-         || GET_MODE (op0) == HImode) && scode == SPU_EQ)
+         || GET_MODE (op0) == HImode
+         || GET_MODE (op0) == QImode) && scode == SPU_EQ)
     {
       /* Don't need to set a register with the result when we are 
          comparing against zero and branching. */