From: Richard Kenner Date: Fri, 5 May 1995 11:03:41 +0000 (-0400) Subject: (do_jump, case EQ_EXPR, NE_EXPR): Properly compare complex. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0e8c9172226c75708e4e240ad27d11e4b31bbfc5;p=gcc.git (do_jump, case EQ_EXPR, NE_EXPR): Properly compare complex. From-SVN: r9577 --- diff --git a/gcc/expr.c b/gcc/expr.c index 9ebbda9eda4..384c193d8a1 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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))))