OSDN Git Service

2005-10-18 Paolo Bonzini <bonzini@gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / dojump.c
index 741c30a..6dca9d3 100644 (file)
@@ -510,6 +510,42 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
       }
       break;
 
       }
       break;
 
+    case TRUTH_AND_EXPR:
+      /* High branch cost, expand as the bitwise AND of the conditions.  */
+      if (BRANCH_COST >= 4)
+       goto normal;
+
+      if (if_false_label == NULL_RTX)
+        {
+         drop_through_label = gen_label_rtx ();
+          do_jump (TREE_OPERAND (exp, 0), drop_through_label, NULL_RTX);
+          do_jump (TREE_OPERAND (exp, 1), NULL_RTX, if_true_label);
+       }
+      else
+       {
+         do_jump (TREE_OPERAND (exp, 0), if_false_label, NULL_RTX);
+          do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label);
+       }
+      break;
+
+    case TRUTH_OR_EXPR:
+      /* High branch cost, expand as the bitwise OR of the conditions.  */
+      if (BRANCH_COST >= 4)
+       goto normal;
+
+      if (if_true_label == NULL_RTX)
+       {
+          drop_through_label = gen_label_rtx ();
+          do_jump (TREE_OPERAND (exp, 0), NULL_RTX, drop_through_label);
+          do_jump (TREE_OPERAND (exp, 1), if_false_label, NULL_RTX);
+       }
+      else
+       {
+          do_jump (TREE_OPERAND (exp, 0), NULL_RTX, if_true_label);
+          do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label);
+       }
+      break;
+
       /* Special case:
           __builtin_expect (<test>, 0) and
           __builtin_expect (<test>, 1)
       /* Special case:
           __builtin_expect (<test>, 0) and
           __builtin_expect (<test>, 1)
@@ -540,8 +576,8 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
              }
          }
       }
              }
          }
       }
       /* Fall through and generate the normal code.  */
       /* Fall through and generate the normal code.  */
-
     default:
     normal:
       temp = expand_expr (exp, NULL_RTX, VOIDmode, 0);
     default:
     normal:
       temp = expand_expr (exp, NULL_RTX, VOIDmode, 0);