src/cpu/x86/vm/stubGenerator_x86_64.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Mar 29 14:31:53 2011
--- new/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Mar 29 14:31:53 2011
*** 142,153 ****
--- 142,156 ----
// 72(rbp): thread Thread*
//
// [ return_from_Java ] <--- rsp
// [ argument word n ]
// ...
! // -8 [ argument word 1 ]
// -7 [ saved r15 ] <--- rsp_after_call
! // -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 ****
--- 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
rsp_after_call_off = -7,
r15_off = rsp_after_call_off,
+ 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 ****
--- 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