| Index: test/cctest/test-macro-assembler-x64.cc | 
| diff --git a/test/cctest/test-macro-assembler-x64.cc b/test/cctest/test-macro-assembler-x64.cc | 
| index a2070a5ea8fa7cfe99dc1689e0415de6b5bee00e..fc7081bd141c3da5426a6567193ebc5049505ef2 100644 | 
| --- a/test/cctest/test-macro-assembler-x64.cc | 
| +++ b/test/cctest/test-macro-assembler-x64.cc | 
| @@ -886,6 +886,7 @@ static void SmiSubTest(MacroAssembler* masm, | 
| __ j(not_equal, exit); | 
| } | 
|  | 
| + | 
| static void SmiSubOverflowTest(MacroAssembler* masm, | 
| Label* exit, | 
| int id, | 
| @@ -1041,7 +1042,6 @@ TEST(SmiSub) { | 
| } | 
|  | 
|  | 
| - | 
| void TestSmiMul(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 
| int64_t result = static_cast<int64_t>(x) * static_cast<int64_t>(y); | 
| bool negative_zero = (result == 0) && (x < 0 || y < 0); | 
| @@ -1827,55 +1827,94 @@ void TestSmiShiftLeft(MacroAssembler* masm, Label* exit, int id, int x) { | 
| const int shifts[] = { 0, 1, 7, 24, kSmiValueSize - 1}; | 
| const int kNumShifts = 5; | 
| __ movl(rax, Immediate(id)); | 
| +  MacroAssembler::SmiFunctionInvoker invoker(exit); | 
| for (int i = 0; i < kNumShifts; i++) { | 
| // rax == id + i * 10. | 
| int shift = shifts[i]; | 
| int result = x << shift; | 
| -    CHECK(Smi::IsValid(result)); | 
| -    __ Move(r8, Smi::FromInt(result)); | 
| -    __ Move(rcx, Smi::FromInt(x)); | 
| -    __ SmiShiftLeftConstant(r9, rcx, shift); | 
| +    if (Smi::IsValid(result)) { | 
| +      __ Move(r8, Smi::FromInt(result)); | 
| +      __ Move(rcx, Smi::FromInt(x)); | 
| +      __ SmiShiftLeftConstant(r9, rcx, shift, invoker); | 
|  | 
| -    __ incq(rax); | 
| -    __ cmpq(r9, r8); | 
| -    __ j(not_equal, exit); | 
| +      __ incq(rax); | 
| +      __ cmpq(r9, r8); | 
| +      __ j(not_equal, exit); | 
|  | 
| -    __ incq(rax); | 
| -    __ Move(rcx, Smi::FromInt(x)); | 
| -    __ SmiShiftLeftConstant(rcx, rcx, shift); | 
| +      __ incq(rax); | 
| +      __ Move(rcx, Smi::FromInt(x)); | 
| +      if (kSmiValueSize == 32) { | 
| +        __ SmiShiftLeftConstant(rcx, rcx, shift, invoker); | 
| +      } else { | 
| +        ASSERT(kSmiValueSize == 31); | 
| +        __ SmiShiftLeftConstant(r9, rcx, shift, invoker); | 
| +        __ movq(rcx, r9); | 
| +      } | 
|  | 
| -    __ incq(rax); | 
| -    __ cmpq(rcx, r8); | 
| -    __ j(not_equal, exit); | 
| +      __ incq(rax); | 
| +      __ cmpq(rcx, r8); | 
| +      __ j(not_equal, exit); | 
|  | 
| -    __ incq(rax); | 
| -    __ Move(rdx, Smi::FromInt(x)); | 
| -    __ Move(rcx, Smi::FromInt(shift)); | 
| -    __ SmiShiftLeft(r9, rdx, rcx); | 
| +      __ incq(rax); | 
| +      __ Move(rdx, Smi::FromInt(x)); | 
| +      __ Move(rcx, Smi::FromInt(shift)); | 
| +      __ SmiShiftLeft(r9, rdx, rcx, exit); | 
|  | 
| -    __ incq(rax); | 
| -    __ cmpq(r9, r8); | 
| -    __ j(not_equal, exit); | 
| +      __ incq(rax); | 
| +      __ cmpq(r9, r8); | 
| +      __ j(not_equal, exit); | 
|  | 
| -    __ incq(rax); | 
| -    __ Move(rdx, Smi::FromInt(x)); | 
| -    __ Move(r11, Smi::FromInt(shift)); | 
| -    __ SmiShiftLeft(r9, rdx, r11); | 
| +      __ incq(rax); | 
| +      __ Move(rdx, Smi::FromInt(x)); | 
| +      __ Move(r11, Smi::FromInt(shift)); | 
| +      __ SmiShiftLeft(r9, rdx, r11, exit); | 
|  | 
| -    __ incq(rax); | 
| -    __ cmpq(r9, r8); | 
| -    __ j(not_equal, exit); | 
| +      __ incq(rax); | 
| +      __ cmpq(r9, r8); | 
| +      __ j(not_equal, exit); | 
|  | 
| -    __ incq(rax); | 
| -    __ Move(rdx, Smi::FromInt(x)); | 
| -    __ Move(r11, Smi::FromInt(shift)); | 
| -    __ SmiShiftLeft(rdx, rdx, r11); | 
| +      __ incq(rax); | 
| +      __ Move(rdx, Smi::FromInt(x)); | 
| +      __ Move(r11, Smi::FromInt(shift)); | 
| +      if (kSmiValueSize == 32) { | 
| +        __ SmiShiftLeft(rdx, rdx, r11, exit); | 
| +      } else { | 
| +        __ SmiShiftLeft(r9, rdx, r11, exit); | 
| +        __ movq(rdx, r9); | 
| +      } | 
| +      __ incq(rax); | 
| +      __ cmpq(rdx, r8); | 
| +      __ j(not_equal, exit); | 
|  | 
| -    __ incq(rax); | 
| -    __ cmpq(rdx, r8); | 
| -    __ j(not_equal, exit); | 
| +      __ incq(rax); | 
| +    } else { | 
| +      __ Move(rdx, Smi::FromInt(x)); | 
| +      __ Move(rcx, Smi::FromInt(shift)); | 
| +      __ movq(r11, rcx); | 
| +      Label fail_ok1; | 
| +      __ SmiShiftLeft(r9, rdx, rcx, &fail_ok1); | 
| +      __ jmp(exit); | 
| +      __ bind(&fail_ok1); | 
|  | 
| -    __ incq(rax); | 
| +      __ incq(rax); | 
| +      __ cmpq(rcx, r11); | 
| +      __ j(not_equal, exit); | 
| + | 
| +      __ incq(rax); | 
| +      __ Move(rcx, Smi::FromInt(x)); | 
| +      __ Move(rdx, Smi::FromInt(shift)); | 
| +      __ movq(r11, rcx); | 
| +      Label fail_ok2; | 
| +      __ SmiShiftLeft(r9, rcx, rdx, &fail_ok2); | 
| +      __ jmp(exit); | 
| +      __ bind(&fail_ok2); | 
| + | 
| +      __ incq(rax); | 
| +      __ cmpq(rcx, r11); | 
| +      __ j(not_equal, exit); | 
| + | 
| +      __ addq(rax, Immediate(7)); | 
| +    } | 
| } | 
| } | 
|  | 
|  |