Reviewers: Erik Corry, antonm, Description: Fix bug in the ARM full code generator for inlined count operations.
The inlined add needs to set the condition codes to correctly detect smi overflows. Please review this at http://codereview.chromium.org/1703012/show SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/arm/full-codegen-arm.cc Index: src/arm/full-codegen-arm.cc =================================================================== --- src/arm/full-codegen-arm.cc (revision 4486) +++ src/arm/full-codegen-arm.cc (working copy) @@ -1592,10 +1592,9 @@ // Inline smi case if we are in a loop. Label stub_call, done; + int count_value = expr->op() == Token::INC ? 1 : -1; if (loop_depth() > 0) { - __ add(r0, r0, Operand(expr->op() == Token::INC - ? Smi::FromInt(1) - : Smi::FromInt(-1))); + __ add(r0, r0, Operand(Smi::FromInt(count_value)), SetCC); __ b(vs, &stub_call); // We could eliminate this smi check if we split the code at // the first smi check before calling ToNumber. @@ -1603,11 +1602,9 @@ __ b(eq, &done); __ bind(&stub_call); // Call stub. Undo operation first. - __ sub(r0, r0, Operand(r1)); + __ sub(r0, r0, Operand(Smi::FromInt(count_value))); } - __ mov(r1, Operand(expr->op() == Token::INC - ? Smi::FromInt(1) - : Smi::FromInt(-1))); + __ mov(r1, Operand(Smi::FromInt(count_value))); GenericBinaryOpStub stub(Token::ADD, NO_OVERWRITE, r1, r0); __ CallStub(&stub); __ bind(&done); -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
