| Index: src/codegen-ia32.cc
|
| ===================================================================
|
| --- src/codegen-ia32.cc (revision 1142)
|
| +++ src/codegen-ia32.cc (working copy)
|
| @@ -1127,14 +1127,14 @@
|
| __ j(not_zero, deferred->enter(), not_taken);
|
| __ sar(ebx, kSmiTagSize);
|
| __ shl(ebx, shift_value);
|
| - // Convert the int to a Smi, and check that it is in
|
| - // the range of valid Smis.
|
| - ASSERT(kSmiTagSize == times_2); // Adjust code if not true.
|
| - ASSERT(kSmiTag == 0); // Adjust code if not true.
|
| - __ add(ebx, Operand(ebx));
|
| - __ j(overflow, deferred->enter(), not_taken);
|
| - __ mov(eax, Operand(ebx));
|
| -
|
| + // This is the Smi check for the shifted result.
|
| + // After signed subtraction of 0xc0000000, the valid
|
| + // Smis are positive.
|
| + __ cmp(ebx, 0xc0000000);
|
| + __ j(sign, deferred->enter(), not_taken);
|
| + // tag result and store it in TOS (eax)
|
| + ASSERT(kSmiTagSize == times_2); // adjust code if not the case
|
| + __ lea(eax, Operand(ebx, ebx, times_1, kSmiTag));
|
| __ bind(deferred->exit());
|
| frame_->Push(eax);
|
| }
|
|
|