(do_jump, case EQ_EXPR, NE_EXPR): Properly compare complex.
From-SVN: r9577
This commit is contained in:
parent
0d481071c0
commit
0e8c917222
80
gcc/expr.c
80
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))))
|
||||
|
|
Loading…
Reference in New Issue