| 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 78bc723a7eab28cb928602f34a0c2b223e394a1c..fe2269189a013281230b366b22632f85feb47fcf 100644
|
| --- a/test/cctest/test-macro-assembler-x64.cc
|
| +++ b/test/cctest/test-macro-assembler-x64.cc
|
| @@ -751,8 +751,6 @@ TEST(SmiNeg) {
|
| }
|
|
|
|
|
| -
|
| -
|
| static void SmiAddTest(MacroAssembler* masm,
|
| Label* exit,
|
| int id,
|
| @@ -802,13 +800,120 @@ static void SmiAddTest(MacroAssembler* masm,
|
| }
|
|
|
|
|
| +static void SmiAddOverflowTest(MacroAssembler* masm,
|
| + Label* exit,
|
| + int id,
|
| + int x) {
|
| + // Adds a Smi to x so that the addition overflows.
|
| + ASSERT(x != 0); // Can't overflow by adding a Smi.
|
| + int y_max = (x > 0) ? (Smi::kMaxValue + 0) : (Smi::kMinValue - x - 1);
|
| + int y_min = (x > 0) ? (Smi::kMaxValue - x + 1) : (Smi::kMinValue + 0);
|
| +
|
| + __ movl(rax, Immediate(id));
|
| + __ Move(rcx, Smi::FromInt(x));
|
| + __ movq(r11, rcx); // Store original Smi value of x in r11.
|
| + __ Move(rdx, Smi::FromInt(y_min));
|
| + {
|
| + Label overflow_ok;
|
| + __ SmiAdd(r9, rcx, rdx, &overflow_ok);
|
| + __ jmp(exit);
|
| + __ bind(&overflow_ok);
|
| + __ incq(rax);
|
| + __ cmpq(rcx, r11);
|
| + __ j(not_equal, exit);
|
| + }
|
| +
|
| + {
|
| + Label overflow_ok;
|
| + __ incq(rax);
|
| + __ SmiAdd(rcx, rcx, rdx, &overflow_ok);
|
| + __ jmp(exit);
|
| + __ bind(&overflow_ok);
|
| + __ incq(rax);
|
| + __ cmpq(rcx, r11);
|
| + __ j(not_equal, exit);
|
| + }
|
| +
|
| + __ movq(rcx, r11);
|
| + {
|
| + Label overflow_ok;
|
| + __ incq(rax);
|
| + __ SmiAddConstant(r9, rcx, Smi::FromInt(y_min), &overflow_ok);
|
| + __ jmp(exit);
|
| + __ bind(&overflow_ok);
|
| + __ incq(rax);
|
| + __ cmpq(rcx, r11);
|
| + __ j(not_equal, exit);
|
| + }
|
| +
|
| + {
|
| + Label overflow_ok;
|
| + __ incq(rax);
|
| + __ SmiAddConstant(rcx, rcx, Smi::FromInt(y_min), &overflow_ok);
|
| + __ jmp(exit);
|
| + __ bind(&overflow_ok);
|
| + __ incq(rax);
|
| + __ cmpq(rcx, r11);
|
| + __ j(not_equal, exit);
|
| + }
|
| +
|
| + __ Move(rdx, Smi::FromInt(y_max));
|
| +
|
| + {
|
| + Label overflow_ok;
|
| + __ incq(rax);
|
| + __ SmiAdd(r9, rcx, rdx, &overflow_ok);
|
| + __ jmp(exit);
|
| + __ bind(&overflow_ok);
|
| + __ incq(rax);
|
| + __ cmpq(rcx, r11);
|
| + __ j(not_equal, exit);
|
| + }
|
| +
|
| + {
|
| + Label overflow_ok;
|
| + __ incq(rax);
|
| + __ SmiAdd(rcx, rcx, rdx, &overflow_ok);
|
| + __ jmp(exit);
|
| + __ bind(&overflow_ok);
|
| + __ incq(rax);
|
| + __ cmpq(rcx, r11);
|
| + __ j(not_equal, exit);
|
| + }
|
| +
|
| + __ movq(rcx, r11);
|
| + {
|
| + Label overflow_ok;
|
| + __ incq(rax);
|
| + __ SmiAddConstant(r9, rcx, Smi::FromInt(y_max), &overflow_ok);
|
| + __ jmp(exit);
|
| + __ bind(&overflow_ok);
|
| + __ incq(rax);
|
| + __ cmpq(rcx, r11);
|
| + __ j(not_equal, exit);
|
| + }
|
| +
|
| + {
|
| + Label overflow_ok;
|
| + __ incq(rax);
|
| + __ SmiAddConstant(rcx, rcx, Smi::FromInt(y_max), &overflow_ok);
|
| + __ jmp(exit);
|
| + __ bind(&overflow_ok);
|
| + __ incq(rax);
|
| + __ cmpq(rcx, r11);
|
| + __ j(not_equal, exit);
|
| + }
|
| +}
|
| +
|
| +
|
| TEST(SmiAdd) {
|
| v8::internal::V8::Initialize(NULL);
|
| // Allocate an executable page of memory.
|
| size_t actual_size;
|
| - byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize,
|
| - &actual_size,
|
| - true));
|
| + byte* buffer =
|
| + static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2,
|
| + &actual_size,
|
| + true));
|
| CHECK(buffer);
|
| Isolate* isolate = CcTest::i_isolate();
|
| HandleScope handles(isolate);
|
| @@ -829,6 +934,14 @@ TEST(SmiAdd) {
|
| SmiAddTest(masm, &exit, 0x70, Smi::kMaxValue, -5);
|
| SmiAddTest(masm, &exit, 0x80, Smi::kMaxValue, Smi::kMinValue);
|
|
|
| + SmiAddOverflowTest(masm, &exit, 0x90, -1);
|
| + SmiAddOverflowTest(masm, &exit, 0xA0, 1);
|
| + SmiAddOverflowTest(masm, &exit, 0xB0, 1024);
|
| + SmiAddOverflowTest(masm, &exit, 0xC0, Smi::kMaxValue);
|
| + SmiAddOverflowTest(masm, &exit, 0xD0, -2);
|
| + SmiAddOverflowTest(masm, &exit, 0xE0, -42000);
|
| + SmiAddOverflowTest(masm, &exit, 0xF0, Smi::kMinValue);
|
| +
|
| __ xor_(rax, rax); // Success.
|
| __ bind(&exit);
|
| ExitCode(masm);
|
| @@ -886,6 +999,7 @@ static void SmiSubTest(MacroAssembler* masm,
|
| __ j(not_equal, exit);
|
| }
|
|
|
| +
|
| static void SmiSubOverflowTest(MacroAssembler* masm,
|
| Label* exit,
|
| int id,
|
|
|