| 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.
|
| }
|
|
|
|
|
|
|