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..75c166fed308bdf9e020712ec4f04816e224c827 100644 |
--- a/test/cctest/test-macro-assembler-x64.cc |
+++ b/test/cctest/test-macro-assembler-x64.cc |
@@ -758,6 +758,7 @@ static void SmiAddTest(MacroAssembler* masm, |
int id, |
int first, |
int second) { |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, exit); |
__ movl(rcx, Immediate(first)); |
__ Integer32ToSmi(rcx, rcx); |
__ movl(rdx, Immediate(second)); |
@@ -766,12 +767,12 @@ static void SmiAddTest(MacroAssembler* masm, |
__ Integer32ToSmi(r8, r8); |
__ movl(rax, Immediate(id)); // Test number. |
- __ SmiAdd(r9, rcx, rdx, exit); |
+ __ SmiAdd(r9, rcx, rdx, wrapper); |
__ cmpq(r9, r8); |
__ j(not_equal, exit); |
__ incq(rax); |
- __ SmiAdd(rcx, rcx, rdx, exit); \ |
+ __ SmiAdd(rcx, rcx, rdx, wrapper); |
__ cmpq(rcx, r8); |
__ j(not_equal, exit); |
@@ -791,12 +792,12 @@ static void SmiAddTest(MacroAssembler* masm, |
__ Integer32ToSmi(rcx, rcx); |
__ incq(rax); |
- __ SmiAddConstant(r9, rcx, Smi::FromInt(second), exit); |
+ __ SmiAddConstant(r9, rcx, Smi::FromInt(second), wrapper); |
__ cmpq(r9, r8); |
__ j(not_equal, exit); |
__ incq(rax); |
- __ SmiAddConstant(rcx, rcx, Smi::FromInt(second), exit); |
+ __ SmiAddConstant(rcx, rcx, Smi::FromInt(second), wrapper); |
__ cmpq(rcx, r8); |
__ j(not_equal, exit); |
} |
@@ -847,17 +848,18 @@ static void SmiSubTest(MacroAssembler* masm, |
int id, |
int first, |
int second) { |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, exit); |
__ Move(rcx, Smi::FromInt(first)); |
__ Move(rdx, Smi::FromInt(second)); |
__ Move(r8, Smi::FromInt(first - second)); |
__ movl(rax, Immediate(id)); // Test 0. |
- __ SmiSub(r9, rcx, rdx, exit); |
+ __ SmiSub(r9, rcx, rdx, wrapper); |
__ cmpq(r9, r8); |
__ j(not_equal, exit); |
__ incq(rax); // Test 1. |
- __ SmiSub(rcx, rcx, rdx, exit); |
+ __ SmiSub(rcx, rcx, rdx, wrapper); |
__ cmpq(rcx, r8); |
__ j(not_equal, exit); |
@@ -876,16 +878,17 @@ static void SmiSubTest(MacroAssembler* masm, |
__ Move(rcx, Smi::FromInt(first)); |
__ incq(rax); // Test 4. |
- __ SmiSubConstant(r9, rcx, Smi::FromInt(second), exit); |
+ __ SmiSubConstant(r9, rcx, Smi::FromInt(second), wrapper); |
__ cmpq(r9, r8); |
__ j(not_equal, exit); |
__ incq(rax); // Test 5. |
- __ SmiSubConstant(rcx, rcx, Smi::FromInt(second), exit); |
+ __ SmiSubConstant(rcx, rcx, Smi::FromInt(second), wrapper); |
__ cmpq(rcx, r8); |
__ j(not_equal, exit); |
} |
+ |
static void SmiSubOverflowTest(MacroAssembler* masm, |
Label* exit, |
int id, |
@@ -901,7 +904,8 @@ static void SmiSubOverflowTest(MacroAssembler* masm, |
__ Move(rdx, Smi::FromInt(y_min)); |
{ |
Label overflow_ok; |
- __ SmiSub(r9, rcx, rdx, &overflow_ok); |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, &overflow_ok); |
+ __ SmiSub(r9, rcx, rdx, wrapper); |
__ jmp(exit); |
__ bind(&overflow_ok); |
__ incq(rax); |
@@ -911,8 +915,9 @@ static void SmiSubOverflowTest(MacroAssembler* masm, |
{ |
Label overflow_ok; |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, &overflow_ok); |
__ incq(rax); |
- __ SmiSub(rcx, rcx, rdx, &overflow_ok); |
+ __ SmiSub(rcx, rcx, rdx, wrapper); |
__ jmp(exit); |
__ bind(&overflow_ok); |
__ incq(rax); |
@@ -923,8 +928,9 @@ static void SmiSubOverflowTest(MacroAssembler* masm, |
__ movq(rcx, r11); |
{ |
Label overflow_ok; |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, &overflow_ok); |
__ incq(rax); |
- __ SmiSubConstant(r9, rcx, Smi::FromInt(y_min), &overflow_ok); |
+ __ SmiSubConstant(r9, rcx, Smi::FromInt(y_min), wrapper); |
__ jmp(exit); |
__ bind(&overflow_ok); |
__ incq(rax); |
@@ -934,8 +940,9 @@ static void SmiSubOverflowTest(MacroAssembler* masm, |
{ |
Label overflow_ok; |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, &overflow_ok); |
__ incq(rax); |
- __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_min), &overflow_ok); |
+ __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_min), wrapper); |
__ jmp(exit); |
__ bind(&overflow_ok); |
__ incq(rax); |
@@ -947,8 +954,9 @@ static void SmiSubOverflowTest(MacroAssembler* masm, |
{ |
Label overflow_ok; |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, &overflow_ok); |
__ incq(rax); |
- __ SmiSub(r9, rcx, rdx, &overflow_ok); |
+ __ SmiSub(r9, rcx, rdx, wrapper); |
__ jmp(exit); |
__ bind(&overflow_ok); |
__ incq(rax); |
@@ -958,8 +966,9 @@ static void SmiSubOverflowTest(MacroAssembler* masm, |
{ |
Label overflow_ok; |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, &overflow_ok); |
__ incq(rax); |
- __ SmiSub(rcx, rcx, rdx, &overflow_ok); |
+ __ SmiSub(rcx, rcx, rdx, wrapper); |
__ jmp(exit); |
__ bind(&overflow_ok); |
__ incq(rax); |
@@ -970,8 +979,9 @@ static void SmiSubOverflowTest(MacroAssembler* masm, |
__ movq(rcx, r11); |
{ |
Label overflow_ok; |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, &overflow_ok); |
__ incq(rax); |
- __ SmiSubConstant(r9, rcx, Smi::FromInt(y_max), &overflow_ok); |
+ __ SmiSubConstant(r9, rcx, Smi::FromInt(y_max), wrapper); |
__ jmp(exit); |
__ bind(&overflow_ok); |
__ incq(rax); |
@@ -981,8 +991,9 @@ static void SmiSubOverflowTest(MacroAssembler* masm, |
{ |
Label overflow_ok; |
+ MacroAssembler::StrictSmiInstructionWrapper wrapper(masm, &overflow_ok); |
__ incq(rax); |
- __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_max), &overflow_ok); |
+ __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_max), wrapper); |
__ jmp(exit); |
__ bind(&overflow_ok); |
__ incq(rax); |
@@ -1041,7 +1052,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 +1837,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::StrictSmiInstructionWrapper wrapper(masm, 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, wrapper); |
- __ 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, wrapper); |
+ } else { |
+ ASSERT(kSmiValueSize == 31); |
+ __ SmiShiftLeftConstant(r9, rcx, shift, wrapper); |
+ __ 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)); |
+ } |
} |
} |