]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: alpha.c (alpha_emit_conditional_branch): Handle ORDERED and UNORDERED condi...
authorUros Bizjak <ubizjak@gmail.com>
Sun, 13 May 2012 21:08:57 +0000 (23:08 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Sun, 13 May 2012 21:08:57 +0000 (23:08 +0200)
Backport from mainline
2012-05-12  Uros Bizjak  <ubizjak@gmail.com>

* config/alpha/alpha.c (alpha_emit_conditional_branch): Handle
ORDERED and UNORDERED conditions.

From-SVN: r187445

gcc/ChangeLog
gcc/config/alpha/alpha.c

index 5bcdb70f9f6d77c1039e1e6d4daee4783bfddcf2..a66c193f3041c5ae495e4b48e949aca8910a51e7 100644 (file)
@@ -1,3 +1,11 @@
+2012-05-13  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline
+       2012-05-12  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/alpha/alpha.c (alpha_emit_conditional_branch): Handle
+       ORDERED and UNORDERED conditions.
+
 2012-05-04  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index 7ad20dcee0c955ce4bc1d539358d9793531c1e6f..192e2abd40f428ed3480d1611f532bcf3d8f4229 100644 (file)
@@ -2464,7 +2464,7 @@ alpha_emit_conditional_branch (rtx operands[], enum machine_mode cmp_mode)
     {
     case EQ:  case LE:  case LT:  case LEU:  case LTU:
     case UNORDERED:
-      /* We have these compares: */
+      /* We have these compares */
       cmp_code = code, branch_code = NE;
       break;
 
@@ -2701,13 +2701,15 @@ alpha_emit_conditional_move (rtx cmp, enum machine_mode mode)
       switch (code)
        {
        case EQ: case LE: case LT: case LEU: case LTU:
+       case UNORDERED:
          /* We have these compares.  */
          cmp_code = code, code = NE;
          break;
 
        case NE:
-         /* This must be reversed.  */
-         cmp_code = EQ, code = EQ;
+       case ORDERED:
+         /* These must be reversed.  */
+         cmp_code = reverse_condition (code), code = EQ;
          break;
 
        case GE: case GT: case GEU: case GTU:
@@ -2727,6 +2729,14 @@ alpha_emit_conditional_move (rtx cmp, enum machine_mode mode)
          gcc_unreachable ();
        }
 
+      if (cmp_mode == DImode)
+       {
+         if (!reg_or_0_operand (op0, DImode))
+           op0 = force_reg (DImode, op0);
+         if (!reg_or_8bit_operand (op1, DImode))
+           op1 = force_reg (DImode, op1);
+       }
+
       tem = gen_reg_rtx (cmp_mode);
       emit_insn (gen_rtx_SET (VOIDmode, tem,
                              gen_rtx_fmt_ee (cmp_code, cmp_mode,
@@ -2738,6 +2748,14 @@ alpha_emit_conditional_move (rtx cmp, enum machine_mode mode)
       local_fast_math = 1;
     }
 
+  if (cmp_mode == DImode)
+    {
+      if (!reg_or_0_operand (op0, DImode))
+       op0 = force_reg (DImode, op0);
+      if (!reg_or_8bit_operand (op1, DImode))
+       op1 = force_reg (DImode, op1);
+    }
+
   /* We may be able to use a conditional move directly.
      This avoids emitting spurious compares.  */
   if (signed_comparison_operator (cmp, VOIDmode)
@@ -2756,11 +2774,13 @@ alpha_emit_conditional_move (rtx cmp, enum machine_mode mode)
   switch (code)
     {
     case EQ:  case LE:  case LT:  case LEU:  case LTU:
+    case UNORDERED:
       /* We have these compares: */
       break;
 
     case NE:
-      /* This must be reversed.  */
+    case ORDERED:
+      /* These must be reversed.  */
       code = reverse_condition (code);
       cmov_code = EQ;
       break;