From: dslomov@chromium.org Date: Wed, 17 Apr 2013 15:36:04 +0000 (+0000) Subject: Fix x64 frame size to accomodate saved XMM registers X-Git-Tag: upstream/4.7.83~14542 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3f2fe53450aa3ef00fc06ab4fea6626d89ba3550;p=platform%2Fupstream%2Fv8.git Fix x64 frame size to accomodate saved XMM registers R=mstarzinger@chromium.org Review URL: https://codereview.chromium.org/13881016 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14312 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc index ad77de6..afc567c 100644 --- a/src/x64/code-stubs-x64.cc +++ b/src/x64/code-stubs-x64.cc @@ -4272,10 +4272,6 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { Label invoke, handler_entry, exit; Label not_outermost_js, not_outermost_js_2; -#ifdef _WIN64 - const int kCalleeSaveXMMRegisters = 10; - const int kFullXMMRegisterSize = 16; -#endif { // NOLINT. Scope block confuses linter. MacroAssembler::NoRootArrayScope uninitialized_root_register(masm); // Set up frame. @@ -4305,17 +4301,17 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { #ifdef _WIN64 // On Win64 XMM6-XMM15 are callee-save - __ subq(rsp, Immediate(kCalleeSaveXMMRegisters * kFullXMMRegisterSize)); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 0), xmm6); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 1), xmm7); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 2), xmm8); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 3), xmm9); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 4), xmm10); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 5), xmm11); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 6), xmm12); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 7), xmm13); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 8), xmm14); - __ movdqu(Operand(rsp, kFullXMMRegisterSize * 9), xmm15); + __ subq(rsp, Immediate(EntryFrameConstants::kXMMRegistersBlockSize)); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 0), xmm6); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 1), xmm7); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 2), xmm8); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 3), xmm9); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 4), xmm10); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 5), xmm11); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 6), xmm12); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 7), xmm13); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 8), xmm14); + __ movdqu(Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 9), xmm15); #endif // Set up the roots and smi constant registers. @@ -4408,17 +4404,17 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { // Restore callee-saved registers (X64 conventions). #ifdef _WIN64 // On Win64 XMM6-XMM15 are callee-save - __ movdqu(xmm6, Operand(rsp, kFullXMMRegisterSize * 0)); - __ movdqu(xmm7, Operand(rsp, kFullXMMRegisterSize * 1)); - __ movdqu(xmm8, Operand(rsp, kFullXMMRegisterSize * 2)); - __ movdqu(xmm8, Operand(rsp, kFullXMMRegisterSize * 3)); - __ movdqu(xmm10, Operand(rsp, kFullXMMRegisterSize * 4)); - __ movdqu(xmm11, Operand(rsp, kFullXMMRegisterSize * 5)); - __ movdqu(xmm12, Operand(rsp, kFullXMMRegisterSize * 6)); - __ movdqu(xmm13, Operand(rsp, kFullXMMRegisterSize * 7)); - __ movdqu(xmm14, Operand(rsp, kFullXMMRegisterSize * 8)); - __ movdqu(xmm15, Operand(rsp, kFullXMMRegisterSize * 9)); - __ addq(rsp, Immediate(kCalleeSaveXMMRegisters * kFullXMMRegisterSize)); + __ movdqu(xmm6, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 0)); + __ movdqu(xmm7, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 1)); + __ movdqu(xmm8, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 2)); + __ movdqu(xmm8, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 3)); + __ movdqu(xmm10, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 4)); + __ movdqu(xmm11, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 5)); + __ movdqu(xmm12, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 6)); + __ movdqu(xmm13, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 7)); + __ movdqu(xmm14, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 8)); + __ movdqu(xmm15, Operand(rsp, EntryFrameConstants::kXMMRegisterSize * 9)); + __ addq(rsp, Immediate(EntryFrameConstants::kXMMRegistersBlockSize)); #endif __ pop(rbx); diff --git a/src/x64/frames-x64.h b/src/x64/frames-x64.h index 14cc5b8..a24ab53 100644 --- a/src/x64/frames-x64.h +++ b/src/x64/frames-x64.h @@ -51,7 +51,12 @@ const int kNumSafepointRegisters = 16; class EntryFrameConstants : public AllStatic { public: #ifdef _WIN64 - static const int kCallerFPOffset = -10 * kPointerSize; + static const int kCalleeSaveXMMRegisters = 10; + static const int kXMMRegisterSize = 16; + static const int kXMMRegistersBlockSize = + kXMMRegisterSize * kCalleeSaveXMMRegisters; + static const int kCallerFPOffset = + -10 * kPointerSize - kXMMRegistersBlockSize; #else static const int kCallerFPOffset = -8 * kPointerSize; #endif