(do_jump, case EQ_EXPR, NE_EXPR): Properly compare complex.
authorRichard Kenner <kenner@gcc.gnu.org>
Fri, 5 May 1995 11:03:41 +0000 (07:03 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Fri, 5 May 1995 11:03:41 +0000 (07:03 -0400)
From-SVN: r9577

gcc/expr.c

index 9ebbda9eda4b2c3692d18d9494cd98888cd8cb77..384c193d8a1829da6717a65368462f49705f8ca5 100644 (file)
@@ -9095,32 +9095,64 @@ do_jump (exp, if_false_label, if_true_label)
       break;
 
     case EQ_EXPR:
-      if (integer_zerop (TREE_OPERAND (exp, 1)))
-       do_jump (TREE_OPERAND (exp, 0), if_true_label, if_false_label);
-      else if (((GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))
-                == MODE_INT)
-               && 
-               !can_compare_p (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
-              || GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))) == MODE_COMPLEX_FLOAT
-              || GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))) == MODE_COMPLEX_INT)
-       do_jump_by_parts_equality (exp, if_false_label, if_true_label);
-      else
-       comparison = compare (exp, EQ, EQ);
-      break;
+      {
+       tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
+
+       if (integer_zerop (TREE_OPERAND (exp, 1)))
+         do_jump (TREE_OPERAND (exp, 0), if_true_label, if_false_label);
+       else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
+                || GET_MODE_CLASS (TYPE_MODE (inner_type) == MODE_COMPLEX_INT))
+         do_jump
+           (fold
+            (build (TRUTH_ANDIF_EXPR, TREE_TYPE (exp),
+                    fold (build (EQ_EXPR, TREE_TYPE (exp),
+                                 fold (build1 (REALPART_EXPR, inner_type,
+                                               TREE_OPERAND (exp, 0))),
+                                 fold (build1 (REALPART_EXPR, inner_type,
+                                               TREE_OPERAND (exp, 1))))),
+                    fold (build (EQ_EXPR, TREE_TYPE (exp),
+                                 fold (build1 (IMAGPART_EXPR, inner_type,
+                                               TREE_OPERAND (exp, 0))),
+                                 fold (build1 (IMAGPART_EXPR, inner_type,
+                                               TREE_OPERAND (exp, 1))))))),
+            if_false_label, if_true_label);
+       else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
+                && !can_compare_p (TYPE_MODE (inner_type)))
+         do_jump_by_parts_equality (exp, if_false_label, if_true_label);
+       else
+         comparison = compare (exp, EQ, EQ);
+       break;
+      }
 
     case NE_EXPR:
-      if (integer_zerop (TREE_OPERAND (exp, 1)))
-       do_jump (TREE_OPERAND (exp, 0), if_false_label, if_true_label);
-      else if (((GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))
-                == MODE_INT)
-               && 
-               !can_compare_p (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
-              || GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))) == MODE_COMPLEX_FLOAT
-              || GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))) == MODE_COMPLEX_INT)
-       do_jump_by_parts_equality (exp, if_true_label, if_false_label);
-      else
-       comparison = compare (exp, NE, NE);
-      break;
+      {
+       tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
+
+       if (integer_zerop (TREE_OPERAND (exp, 1)))
+         do_jump (TREE_OPERAND (exp, 0), if_false_label, if_true_label);
+       else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
+                || GET_MODE_CLASS (TYPE_MODE (inner_type) == MODE_COMPLEX_INT))
+         do_jump
+           (fold
+            (build (TRUTH_ORIF_EXPR, TREE_TYPE (exp),
+                    fold (build (NE_EXPR, TREE_TYPE (exp),
+                                 fold (build1 (REALPART_EXPR, inner_type,
+                                               TREE_OPERAND (exp, 0))),
+                                 fold (build1 (REALPART_EXPR, inner_type,
+                                               TREE_OPERAND (exp, 1))))),
+                    fold (build (NE_EXPR, TREE_TYPE (exp),
+                                 fold (build1 (IMAGPART_EXPR, inner_type,
+                                               TREE_OPERAND (exp, 0))),
+                                 fold (build1 (IMAGPART_EXPR, inner_type,
+                                               TREE_OPERAND (exp, 1))))))),
+            if_false_label, if_true_label);
+       else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
+                && !can_compare_p (TYPE_MODE (inner_type)))
+         do_jump_by_parts_equality (exp, if_true_label, if_false_label);
+       else
+         comparison = compare (exp, NE, NE);
+       break;
+      }
 
     case LT_EXPR:
       if ((GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))