Commit 6aaf3dde by Zack Weinberg

dojump.c (do_jump <unordered_bcc>): Do not recursively call self with a TRUTH_ORIF_EXPR...

	* dojump.c (do_jump <unordered_bcc>): Do not recursively call
	self with a TRUTH_ORIF_EXPR; generate the appropriate jump
	sequence inline.  Move drop_through_label code into this
	block, being the only place it is used.  Adjust comments.

From-SVN: r86192
parent d62294f5
2004-08-18 Zack Weinberg <zack@codesourcery.com>
* dojump.c (do_jump <unordered_bcc>): Do not recursively call
self with a TRUTH_ORIF_EXPR; generate the appropriate jump
sequence inline. Move drop_through_label code into this
block, being the only place it is used. Adjust comments.
2004-08-18 Fariborz Jahanian <fjahanian@apple.com>
* config/rs6000/altivec.md: Add new patterns for calls to
......
......@@ -149,19 +149,12 @@ prefer_and_bit_test (enum machine_mode mode, int bitnum)
do_jump always does any pending stack adjust except when it does not
actually perform a jump. An example where there is no jump
is when EXP is `(foo (), 0)' and IF_FALSE_LABEL is null.
This function is responsible for optimizing cases such as
&&, || and comparison operators in EXP. */
is when EXP is `(foo (), 0)' and IF_FALSE_LABEL is null. */
void
do_jump (tree exp, rtx if_false_label, rtx if_true_label)
{
enum tree_code code = TREE_CODE (exp);
/* Some cases need to create a label to jump to
in order to properly fall through.
These cases set DROP_THROUGH_LABEL nonzero. */
rtx drop_through_label = 0;
rtx temp;
int i;
tree type;
......@@ -448,13 +441,23 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
tree op0 = save_expr (TREE_OPERAND (exp, 0));
tree op1 = save_expr (TREE_OPERAND (exp, 1));
tree cmp0, cmp1;
rtx drop_through_label = 0;
/* If the target doesn't support combined unordered
compares, decompose into two comparisons. */
if (if_true_label == 0)
drop_through_label = if_true_label = gen_label_rtx ();
cmp0 = fold (build2 (tcode1, TREE_TYPE (exp), op0, op1));
cmp1 = fold (build2 (tcode2, TREE_TYPE (exp), op0, op1));
exp = build2 (TRUTH_ORIF_EXPR, TREE_TYPE (exp), cmp0, cmp1);
do_jump (exp, if_false_label, if_true_label);
do_jump (cmp0, 0, if_true_label);
do_jump (cmp1, if_false_label, if_true_label);
if (drop_through_label)
{
do_pending_stack_adjust ();
emit_label (drop_through_label);
}
}
}
break;
......@@ -528,15 +531,6 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
else
abort ();
}
if (drop_through_label)
{
/* If do_jump produces code that might be jumped around,
do any stack adjusts from that code, before the place
where control merges in. */
do_pending_stack_adjust ();
emit_label (drop_through_label);
}
}
/* Given a comparison expression EXP for values too wide to be compared
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment