src/cpu/x86/vm/stubGenerator_x86_64.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File win64-abi-xmm Cdiff src/cpu/x86/vm/stubGenerator_x86_64.cpp

src/cpu/x86/vm/stubGenerator_x86_64.cpp

Print this page

        

*** 142,153 **** // 72(rbp): thread Thread* // // [ return_from_Java ] <--- rsp // [ argument word n ] // ... ! // -8 [ argument word 1 ] ! // -7 [ saved r15 ] <--- rsp_after_call // -6 [ saved r14 ] // -5 [ saved r13 ] // -4 [ saved r12 ] // -3 [ saved rdi ] // -2 [ saved rsi ] --- 142,156 ---- // 72(rbp): thread Thread* // // [ return_from_Java ] <--- rsp // [ argument word n ] // ... ! // -28 [ argument word 1 ] ! // -27 [ saved xmm15 ] <--- rsp_after_call ! // [ saved xmm7-xmm14 ] ! // -9 [ saved xmm6 ] (each xmm register takes 2 slots) ! // -7 [ saved r15 ] // -6 [ saved r14 ] // -5 [ saved r13 ] // -4 [ saved r12 ] // -3 [ saved rdi ] // -2 [ saved rsi ]
*** 167,178 **** // We spill c_rarg0-c_rarg3 to this space. // Call stub stack layout word offsets from rbp enum call_stub_layout { #ifdef _WIN64 ! rsp_after_call_off = -7, ! r15_off = rsp_after_call_off, r14_off = -6, r13_off = -5, r12_off = -4, rdi_off = -3, rsi_off = -2, --- 170,184 ---- // We spill c_rarg0-c_rarg3 to this space. // Call stub stack layout word offsets from rbp enum call_stub_layout { #ifdef _WIN64 ! xmm_save_first = 6, // save from xmm6 ! xmm_save_last = 15, // to xmm15 ! xmm_save_base = -9, ! rsp_after_call_off = xmm_save_base - 2 * (xmm_save_last - xmm_save_first), // -27 ! r15_off = -7, r14_off = -6, r13_off = -5, r12_off = -4, rdi_off = -3, rsi_off = -2,
*** 206,215 **** --- 212,228 ---- parameter_size_off = 2, thread_off = 3 #endif }; + #ifdef _WIN64 + Address xmm_save(int reg) { + assert(reg >= xmm_save_first && reg <= xmm_save_last, "XMM register number out of range"); + return Address(rbp, (xmm_save_base - (reg - xmm_save_first) * 2) * wordSize); + } + #endif + address generate_call_stub(address& return_address) { assert((int)frame::entry_frame_after_call_words == -(int)rsp_after_call_off + 1 && (int)frame::entry_frame_call_wrapper_offset == (int)call_wrapper_off, "adjust this code"); StubCodeMark mark(this, "StubRoutines", "call_stub");
*** 254,265 **** __ movptr(rbx_save, rbx); __ movptr(r12_save, r12); __ movptr(r13_save, r13); __ movptr(r14_save, r14); __ movptr(r15_save, r15); - #ifdef _WIN64 const Address rdi_save(rbp, rdi_off * wordSize); const Address rsi_save(rbp, rsi_off * wordSize); __ movptr(rsi_save, rsi); __ movptr(rdi_save, rdi); --- 267,281 ---- __ movptr(rbx_save, rbx); __ movptr(r12_save, r12); __ movptr(r13_save, r13); __ movptr(r14_save, r14); __ movptr(r15_save, r15); #ifdef _WIN64 + for (int i = 6; i <= 15; i++) { + __ movdqu(xmm_save(i), as_XMMRegister(i)); + } + const Address rdi_save(rbp, rdi_off * wordSize); const Address rsi_save(rbp, rsi_off * wordSize); __ movptr(rsi_save, rsi); __ movptr(rdi_save, rdi);
*** 358,367 **** --- 374,388 ---- __ bind(L); } #endif // restore regs belonging to calling function + #ifdef _WIN64 + for (int i = 15; i >= 6; i--) { + __ movdqu(as_XMMRegister(i), xmm_save(i)); + } + #endif __ movptr(r15, r15_save); __ movptr(r14, r14_save); __ movptr(r13, r13_save); __ movptr(r12, r12_save); __ movptr(rbx, rbx_save);
src/cpu/x86/vm/stubGenerator_x86_64.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File