Index: src/arm/full-codegen-arm.cc |
=================================================================== |
--- src/arm/full-codegen-arm.cc (revision 3667) |
+++ src/arm/full-codegen-arm.cc (working copy) |
@@ -1376,7 +1376,7 @@ |
if (assign_type == VARIABLE) { |
ASSERT(expr->expression()->AsVariableProxy()->var() != NULL); |
Location saved_location = location_; |
- location_ = kStack; |
+ location_ = kAccumulator; |
EmitVariableLoad(expr->expression()->AsVariableProxy()->var(), |
Expression::kValue); |
location_ = saved_location; |
@@ -1393,11 +1393,15 @@ |
VisitForValue(prop->key(), kStack); |
EmitKeyedPropertyLoad(prop); |
} |
- __ push(r0); |
} |
- // Convert to number. |
+ // Call ToNumber only if operand is not a smi. |
+ Label no_conversion; |
+ __ tst(r0, Operand(kSmiTagMask)); |
+ __ b(eq, &no_conversion); |
+ __ push(r0); |
__ InvokeBuiltin(Builtins::TO_NUMBER, CALL_JS); |
+ __ bind(&no_conversion); |
// Save result for postfix expressions. |
if (expr->is_postfix()) { |
@@ -1429,12 +1433,28 @@ |
} |
} |
- // Call stub for +1/-1. |
+ |
+ // Inline smi case if we are in a loop. |
+ Label stub_call, done; |
+ if (loop_depth() > 0) { |
+ __ add(r0, r0, Operand(expr->op() == Token::INC |
+ ? Smi::FromInt(1) |
+ : Smi::FromInt(-1))); |
+ __ b(vs, &stub_call); |
+ // We could eliminate this smi check if we split the code at |
+ // the first smi check before calling ToNumber. |
+ __ tst(r0, Operand(kSmiTagMask)); |
+ __ b(eq, &done); |
+ __ bind(&stub_call); |
+ // Call stub. Undo operation first. |
+ __ sub(r0, r0, Operand(r1)); |
+ } |
__ mov(r1, Operand(expr->op() == Token::INC |
? Smi::FromInt(1) |
: Smi::FromInt(-1))); |
GenericBinaryOpStub stub(Token::ADD, NO_OVERWRITE); |
__ CallStub(&stub); |
+ __ bind(&done); |
// Store the value returned in r0. |
switch (assign_type) { |