| Index: src/codegen-ia32.cc
|
| ===================================================================
|
| --- src/codegen-ia32.cc (revision 1131)
|
| +++ src/codegen-ia32.cc (working copy)
|
| @@ -1127,9 +1127,11 @@
|
| __ j(not_zero, deferred->enter(), not_taken);
|
| __ sar(ebx, kSmiTagSize);
|
| __ shl(ebx, shift_value);
|
| - __ lea(ecx, Operand(ebx, 0x40000000));
|
| - __ test(ecx, Immediate(0x80000000));
|
| - __ j(not_zero, deferred->enter(), not_taken);
|
| + // 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));
|
| @@ -4274,9 +4276,8 @@
|
| case Token::SHL:
|
| __ shl(eax);
|
| // Check that the *signed* result fits in a smi.
|
| - __ lea(ecx, Operand(eax, 0x40000000));
|
| - __ test(ecx, Immediate(0x80000000));
|
| - __ j(not_zero, slow, not_taken);
|
| + __ cmp(eax, 0xc0000000);
|
| + __ j(sign, slow, not_taken);
|
| break;
|
| default:
|
| UNREACHABLE();
|
|
|