diff options
author | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-18 16:39:40 +0000 |
---|---|---|
committer | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-18 16:39:40 +0000 |
commit | 15d981b13a4440a2b9312e08852979466175530d (patch) | |
tree | 1c7cb30c823791b9cb19f3cacc2cad909c5da877 /gcc/dojump.c | |
parent | b3a89f0605112c924550fcc581a7fa302f9b9e54 (diff) | |
download | gcc-15d981b13a4440a2b9312e08852979466175530d.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86192 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dojump.c')
-rw-r--r-- | gcc/dojump.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/gcc/dojump.c b/gcc/dojump.c index 3877f79de73..eb4f21c5a52 100644 --- a/gcc/dojump.c +++ b/gcc/dojump.c @@ -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 |