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..c95a814389ebc02579ea0bbc32177465975c471b 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); |
@@ -1831,51 +1831,79 @@ void TestSmiShiftLeft(MacroAssembler* masm, Label* exit, int id, int x) { |
// 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, exit); |
- __ 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)); |
+ __ SmiShiftLeftConstant(rcx, rcx, shift, exit); |
- __ 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)); |
+ __ SmiShiftLeft(rdx, rdx, r11, exit); |
- __ incq(rax); |
- __ cmpq(rdx, r8); |
- __ j(not_equal, exit); |
+ __ incq(rax); |
+ __ cmpq(rdx, r8); |
+ __ j(not_equal, exit); |
- __ incq(rax); |
+ __ 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); |
+ __ 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)); |
+ } |
} |
} |