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 dd974986114ee328685b2ee511918324d9aa1e30..3d2b91b544ebf7dd0bbc65d8217d1b688463e29d 100755 |
--- a/test/cctest/test-macro-assembler-x64.cc |
+++ b/test/cctest/test-macro-assembler-x64.cc |
@@ -57,10 +57,9 @@ using v8::internal::rsp; |
using v8::internal::r8; |
using v8::internal::r9; |
using v8::internal::r11; |
-using v8::internal::r12; // Remember: r12..r15 are callee save! |
+using v8::internal::r12; |
using v8::internal::r13; |
using v8::internal::r14; |
-using v8::internal::r15; |
using v8::internal::times_pointer_size; |
using v8::internal::FUNCTION_CAST; |
using v8::internal::CodeDesc; |
@@ -92,6 +91,24 @@ typedef int (*F0)(); |
#define __ masm-> |
+ |
+static void EntryCode(MacroAssembler* masm) { |
+ // Smi constant register is callee save. |
+ __ push(v8::internal::kSmiConstantRegister); |
+ __ InitializeSmiConstantRegister(); |
+} |
+ |
+ |
+static void ExitCode(MacroAssembler* masm) { |
+ // Return -1 if kSmiConstantRegister was clobbered during the test. |
+ __ Move(rdx, Smi::FromInt(1)); |
+ __ cmpq(rdx, v8::internal::kSmiConstantRegister); |
+ __ movq(rdx, Immediate(-1)); |
+ __ cmovq(not_equal, rax, rdx); |
+ __ pop(v8::internal::kSmiConstantRegister); |
+} |
+ |
+ |
TEST(Smi) { |
// Check that C++ Smi operations work as expected. |
int64_t test_numbers[] = { |
@@ -139,6 +156,7 @@ TEST(SmiMove) { |
MacroAssembler assembler(buffer, static_cast<int>(actual_size)); |
MacroAssembler* masm = &assembler; // Create a pointer for the __ macro. |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestMoveSmi(masm, &exit, 1, Smi::FromInt(0)); |
@@ -156,6 +174,7 @@ TEST(SmiMove) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -225,6 +244,7 @@ TEST(SmiCompare) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiCompare(masm, &exit, 0x10, 0, 0); |
@@ -249,6 +269,7 @@ TEST(SmiCompare) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -272,6 +293,7 @@ TEST(Integer32ToSmi) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
__ movq(rax, Immediate(1)); // Test number. |
@@ -349,6 +371,7 @@ TEST(Integer32ToSmi) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -397,6 +420,7 @@ TEST(Integer64PlusConstantToSmi) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
int64_t twice_max = static_cast<int64_t>(Smi::kMaxValue) * 2; |
@@ -416,6 +440,7 @@ TEST(Integer64PlusConstantToSmi) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -438,6 +463,7 @@ TEST(SmiCheck) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
Condition cond; |
@@ -613,6 +639,7 @@ TEST(SmiCheck) { |
__ xor_(rax, rax); |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -683,6 +710,7 @@ TEST(SmiNeg) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiNeg(masm, &exit, 0x10, 0); |
@@ -696,6 +724,7 @@ TEST(SmiNeg) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -768,6 +797,7 @@ TEST(SmiAdd) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
// No-overflow tests. |
@@ -782,6 +812,7 @@ TEST(SmiAdd) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -955,6 +986,7 @@ TEST(SmiSub) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
SmiSubTest(masm, &exit, 0x10, 1, 2); |
@@ -977,6 +1009,7 @@ TEST(SmiSub) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1042,6 +1075,7 @@ TEST(SmiMul) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiMul(masm, &exit, 0x10, 0, 0); |
@@ -1061,6 +1095,7 @@ TEST(SmiMul) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1081,51 +1116,51 @@ void TestSmiDiv(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
#endif |
bool fraction = !division_by_zero && !overflow && (x % y != 0); |
__ Move(r11, Smi::FromInt(x)); |
- __ Move(r12, Smi::FromInt(y)); |
+ __ Move(r14, Smi::FromInt(y)); |
if (!fraction && !overflow && !negative_zero && !division_by_zero) { |
// Division succeeds |
__ movq(rcx, r11); |
- __ movq(r15, Immediate(id)); |
+ __ movq(r12, Immediate(id)); |
int result = x / y; |
__ Move(r8, Smi::FromInt(result)); |
- __ SmiDiv(r9, rcx, r12, exit); |
- // Might have destroyed rcx and r12. |
- __ incq(r15); |
+ __ SmiDiv(r9, rcx, r14, exit); |
+ // Might have destroyed rcx and r14. |
+ __ incq(r12); |
__ SmiCompare(r9, r8); |
__ j(not_equal, exit); |
- __ incq(r15); |
+ __ incq(r12); |
__ movq(rcx, r11); |
- __ Move(r12, Smi::FromInt(y)); |
+ __ Move(r14, Smi::FromInt(y)); |
__ SmiCompare(rcx, r11); |
__ j(not_equal, exit); |
- __ incq(r15); |
- __ SmiDiv(rcx, rcx, r12, exit); |
+ __ incq(r12); |
+ __ SmiDiv(rcx, rcx, r14, exit); |
- __ incq(r15); |
+ __ incq(r12); |
__ SmiCompare(rcx, r8); |
__ j(not_equal, exit); |
} else { |
// Division fails. |
- __ movq(r15, Immediate(id + 8)); |
+ __ movq(r12, Immediate(id + 8)); |
Label fail_ok, fail_ok2; |
__ movq(rcx, r11); |
- __ SmiDiv(r9, rcx, r12, &fail_ok); |
+ __ SmiDiv(r9, rcx, r14, &fail_ok); |
__ jmp(exit); |
__ bind(&fail_ok); |
- __ incq(r15); |
+ __ incq(r12); |
__ SmiCompare(rcx, r11); |
__ j(not_equal, exit); |
- __ incq(r15); |
- __ SmiDiv(rcx, rcx, r12, &fail_ok2); |
+ __ incq(r12); |
+ __ SmiDiv(rcx, rcx, r14, &fail_ok2); |
__ jmp(exit); |
__ bind(&fail_ok2); |
- __ incq(r15); |
+ __ incq(r12); |
__ SmiCompare(rcx, r11); |
__ j(not_equal, exit); |
} |
@@ -1145,10 +1180,11 @@ TEST(SmiDiv) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
+ __ push(r14); |
__ push(r12); |
- __ push(r15); |
TestSmiDiv(masm, &exit, 0x10, 1, 1); |
TestSmiDiv(masm, &exit, 0x20, 1, 0); |
TestSmiDiv(masm, &exit, 0x30, -1, 0); |
@@ -1170,11 +1206,12 @@ TEST(SmiDiv) { |
TestSmiDiv(masm, &exit, 0x130, Smi::kMinValue, Smi::kMinValue); |
TestSmiDiv(masm, &exit, 0x140, Smi::kMinValue, -1); |
- __ xor_(r15, r15); // Success. |
+ __ xor_(r12, r12); // Success. |
__ bind(&exit); |
- __ movq(rax, r15); |
- __ pop(r15); |
+ __ movq(rax, r12); |
__ pop(r12); |
+ __ pop(r14); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1192,47 +1229,47 @@ void TestSmiMod(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
bool negative_zero = (!fraction && x < 0); |
__ Move(rcx, Smi::FromInt(x)); |
__ movq(r11, rcx); |
- __ Move(r12, Smi::FromInt(y)); |
+ __ Move(r14, Smi::FromInt(y)); |
if (!division_overflow && !negative_zero && !division_by_zero) { |
// Modulo succeeds |
- __ movq(r15, Immediate(id)); |
+ __ movq(r12, Immediate(id)); |
int result = x % y; |
__ Move(r8, Smi::FromInt(result)); |
- __ SmiMod(r9, rcx, r12, exit); |
+ __ SmiMod(r9, rcx, r14, exit); |
- __ incq(r15); |
+ __ incq(r12); |
__ SmiCompare(r9, r8); |
__ j(not_equal, exit); |
- __ incq(r15); |
+ __ incq(r12); |
__ SmiCompare(rcx, r11); |
__ j(not_equal, exit); |
- __ incq(r15); |
- __ SmiMod(rcx, rcx, r12, exit); |
+ __ incq(r12); |
+ __ SmiMod(rcx, rcx, r14, exit); |
- __ incq(r15); |
+ __ incq(r12); |
__ SmiCompare(rcx, r8); |
__ j(not_equal, exit); |
} else { |
// Modulo fails. |
- __ movq(r15, Immediate(id + 8)); |
+ __ movq(r12, Immediate(id + 8)); |
Label fail_ok, fail_ok2; |
- __ SmiMod(r9, rcx, r12, &fail_ok); |
+ __ SmiMod(r9, rcx, r14, &fail_ok); |
__ jmp(exit); |
__ bind(&fail_ok); |
- __ incq(r15); |
+ __ incq(r12); |
__ SmiCompare(rcx, r11); |
__ j(not_equal, exit); |
- __ incq(r15); |
- __ SmiMod(rcx, rcx, r12, &fail_ok2); |
+ __ incq(r12); |
+ __ SmiMod(rcx, rcx, r14, &fail_ok2); |
__ jmp(exit); |
__ bind(&fail_ok2); |
- __ incq(r15); |
+ __ incq(r12); |
__ SmiCompare(rcx, r11); |
__ j(not_equal, exit); |
} |
@@ -1252,10 +1289,11 @@ TEST(SmiMod) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
+ __ push(r14); |
__ push(r12); |
- __ push(r15); |
TestSmiMod(masm, &exit, 0x10, 1, 1); |
TestSmiMod(masm, &exit, 0x20, 1, 0); |
TestSmiMod(masm, &exit, 0x30, -1, 0); |
@@ -1277,11 +1315,12 @@ TEST(SmiMod) { |
TestSmiMod(masm, &exit, 0x130, Smi::kMinValue, Smi::kMinValue); |
TestSmiMod(masm, &exit, 0x140, Smi::kMinValue, -1); |
- __ xor_(r15, r15); // Success. |
+ __ xor_(r12, r12); // Success. |
__ bind(&exit); |
- __ movq(rax, r15); |
- __ pop(r15); |
+ __ movq(rax, r12); |
__ pop(r12); |
+ __ pop(r14); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1336,7 +1375,7 @@ TEST(SmiIndex) { |
// Allocate an executable page of memory. |
size_t actual_size; |
byte* buffer = |
- static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
+ static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 3, |
&actual_size, |
true)); |
CHECK(buffer); |
@@ -1345,6 +1384,7 @@ TEST(SmiIndex) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiIndex(masm, &exit, 0x10, 0); |
@@ -1355,6 +1395,7 @@ TEST(SmiIndex) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1411,6 +1452,7 @@ TEST(SmiSelectNonSmi) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); // Avoid inline checks. |
+ EntryCode(masm); |
Label exit; |
TestSelectNonSmi(masm, &exit, 0x10, 0, 0); |
@@ -1425,6 +1467,7 @@ TEST(SmiSelectNonSmi) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1487,6 +1530,7 @@ TEST(SmiAnd) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiAnd(masm, &exit, 0x10, 0, 0); |
@@ -1503,6 +1547,7 @@ TEST(SmiAnd) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1565,6 +1610,7 @@ TEST(SmiOr) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiOr(masm, &exit, 0x10, 0, 0); |
@@ -1583,6 +1629,7 @@ TEST(SmiOr) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1645,6 +1692,7 @@ TEST(SmiXor) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiXor(masm, &exit, 0x10, 0, 0); |
@@ -1663,6 +1711,7 @@ TEST(SmiXor) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1709,6 +1758,7 @@ TEST(SmiNot) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiNot(masm, &exit, 0x10, 0); |
@@ -1722,6 +1772,7 @@ TEST(SmiNot) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1793,7 +1844,7 @@ TEST(SmiShiftLeft) { |
// Allocate an executable page of memory. |
size_t actual_size; |
byte* buffer = |
- static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 3, |
+ static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 4, |
&actual_size, |
true)); |
CHECK(buffer); |
@@ -1802,6 +1853,7 @@ TEST(SmiShiftLeft) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiShiftLeft(masm, &exit, 0x10, 0); |
@@ -1814,6 +1866,7 @@ TEST(SmiShiftLeft) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1896,7 +1949,7 @@ TEST(SmiShiftLogicalRight) { |
// Allocate an executable page of memory. |
size_t actual_size; |
byte* buffer = |
- static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
+ static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 3, |
&actual_size, |
true)); |
CHECK(buffer); |
@@ -1905,6 +1958,7 @@ TEST(SmiShiftLogicalRight) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiShiftLogicalRight(masm, &exit, 0x10, 0); |
@@ -1917,6 +1971,7 @@ TEST(SmiShiftLogicalRight) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -1971,6 +2026,7 @@ TEST(SmiShiftArithmeticRight) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestSmiShiftArithmeticRight(masm, &exit, 0x10, 0); |
@@ -1983,6 +2039,7 @@ TEST(SmiShiftArithmeticRight) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -2032,6 +2089,7 @@ TEST(PositiveSmiTimesPowerOfTwoToInteger64) { |
MacroAssembler* masm = &assembler; |
masm->set_allow_stub_calls(false); |
+ EntryCode(masm); |
Label exit; |
TestPositiveSmiPowerUp(masm, &exit, 0x20, 0); |
@@ -2046,6 +2104,7 @@ TEST(PositiveSmiTimesPowerOfTwoToInteger64) { |
__ xor_(rax, rax); // Success. |
__ bind(&exit); |
+ ExitCode(masm); |
__ ret(0); |
CodeDesc desc; |
@@ -2074,8 +2133,9 @@ TEST(OperandOffset) { |
masm->set_allow_stub_calls(false); |
Label exit; |
- __ push(r12); |
+ EntryCode(masm); |
__ push(r13); |
+ __ push(r14); |
__ push(rbx); |
__ push(rbp); |
__ push(Immediate(0x100)); // <-- rbp |
@@ -2093,7 +2153,7 @@ TEST(OperandOffset) { |
// r12 = rsp[3] |
// rbx = rsp[5] |
// r13 = rsp[7] |
- __ lea(r12, Operand(rsp, 3 * kPointerSize)); |
+ __ lea(r14, Operand(rsp, 3 * kPointerSize)); |
__ lea(r13, Operand(rbp, -3 * kPointerSize)); |
__ lea(rbx, Operand(rbp, -5 * kPointerSize)); |
__ movl(rcx, Immediate(2)); |
@@ -2396,8 +2456,9 @@ TEST(OperandOffset) { |
__ lea(rsp, Operand(rbp, kPointerSize)); |
__ pop(rbp); |
__ pop(rbx); |
+ __ pop(r14); |
__ pop(r13); |
- __ pop(r12); |
+ ExitCode(masm); |
__ ret(0); |