| 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));
|
| + }
|
| }
|
| }
|
|
|
|
|