| Index: src/x64/macro-assembler-x64.cc
|
| diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
|
| index 67ea4ac5cb899ae3f02c3f2dc4ee4036338d2ccd..657e3ec36c218f026d74bd8fcce0ba246dd7347e 100644
|
| --- a/src/x64/macro-assembler-x64.cc
|
| +++ b/src/x64/macro-assembler-x64.cc
|
| @@ -65,10 +65,16 @@ void MacroAssembler::ConstructAndTestJSFunction() {
|
| MacroAssembler masm(buffer, initial_buffer_size);
|
|
|
| const uint64_t secret = V8_INT64_C(0xdeadbeefcafebabe);
|
| + Handle<String> constant =
|
| + Factory::NewStringFromAscii(Vector<const char>("451", 3), TENURED);
|
| #define __ ACCESS_MASM((&masm))
|
| // Construct a simple JSfunction here, using Assembler and MacroAssembler
|
| // commands.
|
| - __ movq(rax, secret, RelocInfo::NONE);
|
| + __ movq(rax, constant, RelocInfo::EMBEDDED_OBJECT);
|
| + __ push(rax);
|
| + __ CallRuntime(Runtime::kStringParseFloat, 1);
|
| + __ movq(kScratchRegister, secret, RelocInfo::NONE);
|
| + __ addq(rax, kScratchRegister);
|
| __ ret(0);
|
| #undef __
|
| CodeDesc desc;
|
| @@ -93,7 +99,7 @@ void MacroAssembler::ConstructAndTestJSFunction() {
|
| NULL,
|
| &pending_exceptions);
|
| CHECK(result->IsSmi());
|
| - CHECK(secret == reinterpret_cast<uint64_t>(*result));
|
| + CHECK(secret + (451 << kSmiTagSize) == reinterpret_cast<uint64_t>(*result));
|
| }
|
| }
|
|
|
| @@ -581,17 +587,16 @@ void MacroAssembler::EnterExitFrame(StackFrame::Type type) {
|
| // Save the frame pointer and the context in top.
|
| ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address);
|
| ExternalReference context_address(Top::k_context_address);
|
| - movq(kScratchRegister, rax);
|
| + movq(rdi, rax); // Backup rax before we use it.
|
| +
|
| movq(rax, rbp);
|
| store_rax(c_entry_fp_address);
|
| movq(rax, rsi);
|
| store_rax(context_address);
|
| - movq(rax, kScratchRegister);
|
|
|
| - // Setup argc and argv in callee-saved registers.
|
| + // Setup argv in callee-saved register r15.
|
| int offset = StandardFrameConstants::kCallerSPOffset - kPointerSize;
|
| - movq(rdi, rax);
|
| - lea(rsi, Operand(rbp, rax, kTimesPointerSize, offset));
|
| + lea(r15, Operand(rbp, rdi, kTimesPointerSize, offset));
|
|
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| // Save the state of all registers to the stack from the memory
|
| @@ -607,15 +612,15 @@ void MacroAssembler::EnterExitFrame(StackFrame::Type type) {
|
| }
|
| #endif
|
|
|
| - // Reserve space for two arguments: argc and argv.
|
| + // Reserve space for two arguments: argc and argv
|
| subq(rsp, Immediate(2 * kPointerSize));
|
|
|
| // Get the required frame alignment for the OS.
|
| static const int kFrameAlignment = OS::ActivationFrameAlignment();
|
| if (kFrameAlignment > 0) {
|
| ASSERT(IsPowerOf2(kFrameAlignment));
|
| - movq(r10, Immediate(-kFrameAlignment));
|
| - and_(rsp, r10);
|
| + movq(kScratchRegister, Immediate(-kFrameAlignment));
|
| + and_(rsp, kScratchRegister);
|
| }
|
|
|
| // Patch the saved entry sp.
|
| @@ -624,6 +629,9 @@ void MacroAssembler::EnterExitFrame(StackFrame::Type type) {
|
|
|
|
|
| void MacroAssembler::LeaveExitFrame(StackFrame::Type type) {
|
| + // Registers:
|
| + // r14 : argc
|
| + // r15 : argv
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| // Restore the memory copy of the registers by digging them out from
|
| // the stack. This is needed to allow nested break points.
|
| @@ -642,7 +650,7 @@ void MacroAssembler::LeaveExitFrame(StackFrame::Type type) {
|
| movq(rbp, Operand(rbp, 0 * kPointerSize));
|
|
|
| // Pop the arguments and the receiver from the caller stack.
|
| - lea(rsp, Operand(rsi, 1 * kPointerSize));
|
| + lea(rsp, Operand(r15, 1 * kPointerSize));
|
|
|
| // Restore current context from top and clear it in debug mode.
|
| ExternalReference context_address(Top::k_context_address);
|
|
|