Index: src/arm/fast-codegen-arm.cc |
=================================================================== |
--- src/arm/fast-codegen-arm.cc (revision 3580) |
+++ src/arm/fast-codegen-arm.cc (working copy) |
@@ -1265,20 +1265,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); |
__ LoadRoot(ip, Heap::kTrueValueRootIndex); |
__ push(ip); |
@@ -1289,41 +1288,26 @@ |
__ 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); |
__ LoadRoot(ip, Heap::kTrueValueRootIndex); |
__ push(ip); |
- __ 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); |
__ LoadRoot(ip, Heap::kFalseValueRootIndex); |
__ push(ip); |
- __ jmp(saved_false); |
+ __ jmp(false_label_); |
break; |
} |
- true_label_ = saved_true; |
- false_label_ = saved_false; |
break; |
} |
@@ -1549,47 +1533,41 @@ |
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_JS); |
__ LoadRoot(ip, Heap::kTrueValueRootIndex); |
__ cmp(r0, ip); |
- __ b(eq, true_label_); |
- __ jmp(false_label_); |
+ __ b(eq, if_true); |
+ __ jmp(if_false); |
break; |
} |
@@ -1597,8 +1575,8 @@ |
InstanceofStub stub; |
__ CallStub(&stub); |
__ tst(r0, r0); |
- __ b(eq, true_label_); // The stub returns 0 for true. |
- __ jmp(false_label_); |
+ __ b(eq, if_true); // The stub returns 0 for true. |
+ __ jmp(if_false); |
break; |
} |
@@ -1649,24 +1627,29 @@ |
__ tst(r2, Operand(kSmiTagMask)); |
__ b(ne, &slow_case); |
__ cmp(r1, r0); |
- __ b(cc, true_label_); |
- __ jmp(false_label_); |
+ __ b(cc, if_true); |
+ __ jmp(if_false); |
__ bind(&slow_case); |
CompareStub stub(cc, strict); |
__ CallStub(&stub); |
__ tst(r0, r0); |
- __ b(cc, true_label_); |
- __ jmp(false_label_); |
+ __ b(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); |
__ LoadRoot(ip, Heap::kTrueValueRootIndex); |
@@ -1678,10 +1661,6 @@ |
__ bind(&done); |
break; |
- case Expression::kEffect: |
- __ bind(&done); |
- break; |
- |
case Expression::kTest: |
break; |
@@ -1689,19 +1668,16 @@ |
__ bind(&push_true); |
__ LoadRoot(ip, Heap::kTrueValueRootIndex); |
__ push(ip); |
- __ jmp(saved_true); |
+ __ jmp(true_label_); |
break; |
case Expression::kTestValue: |
__ bind(&push_false); |
__ LoadRoot(ip, Heap::kFalseValueRootIndex); |
__ push(ip); |
- __ 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. |
} |