Index: src/ia32/fast-codegen-ia32.cc |
=================================================================== |
--- src/ia32/fast-codegen-ia32.cc (revision 3580) |
+++ src/ia32/fast-codegen-ia32.cc (working copy) |
@@ -1240,20 +1240,19 @@ |
Comment cmnt(masm_, "[ UnaryOperation (NOT)"); |
ASSERT_EQ(Expression::kTest, expr->expression()->context()); |
- Label push_true; |
- Label push_false; |
- Label done; |
- Label* saved_true = true_label_; |
- Label* saved_false = false_label_; |
+ Label push_true, push_false, done; |
switch (expr->context()) { |
case Expression::kUninitialized: |
UNREACHABLE(); |
break; |
+ case Expression::kEffect: |
+ VisitForControl(expr->expression(), &done, &done); |
+ __ bind(&done); |
+ break; |
+ |
case Expression::kValue: |
- true_label_ = &push_false; |
- false_label_ = &push_true; |
- Visit(expr->expression()); |
+ VisitForControl(expr->expression(), &push_false, &push_true); |
__ bind(&push_true); |
__ push(Immediate(Factory::true_value())); |
__ jmp(&done); |
@@ -1262,39 +1261,24 @@ |
__ bind(&done); |
break; |
- case Expression::kEffect: |
- true_label_ = &done; |
- false_label_ = &done; |
- Visit(expr->expression()); |
- __ bind(&done); |
- break; |
- |
case Expression::kTest: |
- true_label_ = saved_false; |
- false_label_ = saved_true; |
- Visit(expr->expression()); |
+ VisitForControl(expr->expression(), false_label_, true_label_); |
break; |
case Expression::kValueTest: |
- true_label_ = saved_false; |
- false_label_ = &push_true; |
- Visit(expr->expression()); |
+ VisitForControl(expr->expression(), false_label_, &push_true); |
__ bind(&push_true); |
__ push(Immediate(Factory::true_value())); |
- __ jmp(saved_true); |
+ __ jmp(true_label_); |
break; |
case Expression::kTestValue: |
- true_label_ = &push_false; |
- false_label_ = saved_true; |
- Visit(expr->expression()); |
+ VisitForControl(expr->expression(), &push_false, true_label_); |
__ bind(&push_false); |
__ push(Immediate(Factory::false_value())); |
- __ jmp(saved_false); |
+ __ jmp(false_label_); |
break; |
} |
- true_label_ = saved_true; |
- false_label_ = saved_false; |
break; |
} |
@@ -1523,46 +1507,40 @@ |
Visit(expr->left()); |
Visit(expr->right()); |
- // Convert current context to test context: Pre-test code. |
- Label push_true; |
- Label push_false; |
- Label done; |
- Label* saved_true = true_label_; |
- Label* saved_false = false_label_; |
+ // Always perform the comparison for its control flow. Pack the result |
+ // into the expression's context after the comparison is performed. |
+ Label push_true, push_false, done; |
+ // Initially assume we are in a test context. |
+ Label* if_true = true_label_; |
+ Label* if_false = false_label_; |
switch (expr->context()) { |
case Expression::kUninitialized: |
UNREACHABLE(); |
break; |
- |
- case Expression::kValue: |
- true_label_ = &push_true; |
- false_label_ = &push_false; |
- break; |
- |
case Expression::kEffect: |
- true_label_ = &done; |
- false_label_ = &done; |
+ if_true = &done; |
+ if_false = &done; |
break; |
- |
+ case Expression::kValue: |
+ if_true = &push_true; |
+ if_false = &push_false; |
+ break; |
case Expression::kTest: |
break; |
- |
case Expression::kValueTest: |
- true_label_ = &push_true; |
+ if_true = &push_true; |
break; |
- |
case Expression::kTestValue: |
- false_label_ = &push_false; |
+ if_false = &push_false; |
break; |
} |
- // Convert current context to test context: End pre-test code. |
switch (expr->op()) { |
case Token::IN: { |
__ InvokeBuiltin(Builtins::IN, CALL_FUNCTION); |
__ cmp(eax, Factory::true_value()); |
- __ j(equal, true_label_); |
- __ jmp(false_label_); |
+ __ j(equal, if_true); |
+ __ jmp(if_false); |
break; |
} |
@@ -1570,8 +1548,8 @@ |
InstanceofStub stub; |
__ CallStub(&stub); |
__ test(eax, Operand(eax)); |
- __ j(zero, true_label_); // The stub returns 0 for true. |
- __ jmp(false_label_); |
+ __ j(zero, if_true); // The stub returns 0 for true. |
+ __ jmp(if_false); |
break; |
} |
@@ -1623,24 +1601,29 @@ |
__ test(ecx, Immediate(kSmiTagMask)); |
__ j(not_zero, &slow_case, not_taken); |
__ cmp(edx, Operand(eax)); |
- __ j(cc, true_label_); |
- __ jmp(false_label_); |
+ __ j(cc, if_true); |
+ __ jmp(if_false); |
__ bind(&slow_case); |
CompareStub stub(cc, strict); |
__ CallStub(&stub); |
__ test(eax, Operand(eax)); |
- __ j(cc, true_label_); |
- __ jmp(false_label_); |
+ __ j(cc, if_true); |
+ __ jmp(if_false); |
} |
} |
- // Convert current context to test context: Post-test code. |
+ // Convert the result of the comparison into one expected for this |
+ // expression's context. |
switch (expr->context()) { |
case Expression::kUninitialized: |
UNREACHABLE(); |
break; |
+ case Expression::kEffect: |
+ __ bind(&done); |
+ break; |
+ |
case Expression::kValue: |
__ bind(&push_true); |
__ push(Immediate(Factory::true_value())); |
@@ -1650,28 +1633,21 @@ |
__ bind(&done); |
break; |
- case Expression::kEffect: |
- __ bind(&done); |
- break; |
- |
case Expression::kTest: |
break; |
case Expression::kValueTest: |
__ bind(&push_true); |
__ push(Immediate(Factory::true_value())); |
- __ jmp(saved_true); |
+ __ jmp(true_label_); |
break; |
case Expression::kTestValue: |
__ bind(&push_false); |
__ push(Immediate(Factory::false_value())); |
- __ jmp(saved_false); |
+ __ jmp(false_label_); |
break; |
} |
- true_label_ = saved_true; |
- false_label_ = saved_false; |
- // Convert current context to test context: End post-test code. |
} |