Index: src/codegen-arm.cc |
=================================================================== |
--- src/codegen-arm.cc (revision 668) |
+++ src/codegen-arm.cc (working copy) |
@@ -359,47 +359,41 @@ |
Label false_target; |
LoadCondition(x, typeof_state, &true_target, &false_target, false); |
+ // Materialize boolean values on the stack frame if necessary. |
if (has_cc()) { |
- // convert cc_reg_ into a bool |
- Label loaded, materialize_true; |
- __ b(cc_reg_, &materialize_true); |
+ // The value we want is in the cc register. Since complicated |
+ // conditions can require more than one test, there may also be branches |
+ // to true_target and false_target. |
+ Label loaded; |
+ __ bind(&false_target); |
+ __ b(cc_reg_, &true_target); |
__ mov(r0, Operand(Factory::false_value())); |
__ push(r0); |
__ b(&loaded); |
- __ bind(&materialize_true); |
+ __ bind(&true_target); |
__ mov(r0, Operand(Factory::true_value())); |
__ push(r0); |
__ bind(&loaded); |
cc_reg_ = al; |
- } |
+ } else { |
+ // Optimization of boolean-valued expressions whose value is statically |
+ // known may have generated an unconditional jump to either of the |
+ // targets (but not both) and failed to leave a value in either the cc |
+ // register or on top of the frame. |
+ ASSERT(!(true_target.is_linked() && false_target.is_linked())); |
- if (true_target.is_linked() || false_target.is_linked()) { |
- // we have at least one condition value |
- // that has been "translated" into a branch, |
- // thus it needs to be loaded explicitly again |
- Label loaded; |
- __ b(&loaded); // don't lose current TOS |
- bool both = true_target.is_linked() && false_target.is_linked(); |
- // reincarnate "true", if necessary |
if (true_target.is_linked()) { |
__ bind(&true_target); |
__ mov(r0, Operand(Factory::true_value())); |
__ push(r0); |
} |
- // if both "true" and "false" need to be reincarnated, |
- // jump across code for "false" |
- if (both) |
- __ b(&loaded); |
- // reincarnate "false", if necessary |
+ |
if (false_target.is_linked()) { |
__ bind(&false_target); |
__ mov(r0, Operand(Factory::false_value())); |
__ push(r0); |
} |
- // everything is loaded at this point |
- __ bind(&loaded); |
} |
- ASSERT(!has_cc()); |
} |