1.1 --- a/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Mar 29 09:11:51 2011 -0700 1.2 +++ b/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Mar 29 17:35:34 2011 -0700 1.3 @@ -144,8 +144,11 @@ 1.4 // [ return_from_Java ] <--- rsp 1.5 // [ argument word n ] 1.6 // ... 1.7 - // -8 [ argument word 1 ] 1.8 - // -7 [ saved r15 ] <--- rsp_after_call 1.9 + // -28 [ argument word 1 ] 1.10 + // -27 [ saved xmm15 ] <--- rsp_after_call 1.11 + // [ saved xmm7-xmm14 ] 1.12 + // -9 [ saved xmm6 ] (each xmm register takes 2 slots) 1.13 + // -7 [ saved r15 ] 1.14 // -6 [ saved r14 ] 1.15 // -5 [ saved r13 ] 1.16 // -4 [ saved r12 ] 1.17 @@ -169,8 +172,11 @@ 1.18 // Call stub stack layout word offsets from rbp 1.19 enum call_stub_layout { 1.20 #ifdef _WIN64 1.21 - rsp_after_call_off = -7, 1.22 - r15_off = rsp_after_call_off, 1.23 + xmm_save_first = 6, // save from xmm6 1.24 + xmm_save_last = 15, // to xmm15 1.25 + xmm_save_base = -9, 1.26 + rsp_after_call_off = xmm_save_base - 2 * (xmm_save_last - xmm_save_first), // -27 1.27 + r15_off = -7, 1.28 r14_off = -6, 1.29 r13_off = -5, 1.30 r12_off = -4, 1.31 @@ -208,6 +214,13 @@ 1.32 #endif 1.33 }; 1.34 1.35 +#ifdef _WIN64 1.36 + Address xmm_save(int reg) { 1.37 + assert(reg >= xmm_save_first && reg <= xmm_save_last, "XMM register number out of range"); 1.38 + return Address(rbp, (xmm_save_base - (reg - xmm_save_first) * 2) * wordSize); 1.39 + } 1.40 +#endif 1.41 + 1.42 address generate_call_stub(address& return_address) { 1.43 assert((int)frame::entry_frame_after_call_words == -(int)rsp_after_call_off + 1 && 1.44 (int)frame::entry_frame_call_wrapper_offset == (int)call_wrapper_off, 1.45 @@ -256,8 +269,11 @@ 1.46 __ movptr(r13_save, r13); 1.47 __ movptr(r14_save, r14); 1.48 __ movptr(r15_save, r15); 1.49 - 1.50 #ifdef _WIN64 1.51 + for (int i = 6; i <= 15; i++) { 1.52 + __ movdqu(xmm_save(i), as_XMMRegister(i)); 1.53 + } 1.54 + 1.55 const Address rdi_save(rbp, rdi_off * wordSize); 1.56 const Address rsi_save(rbp, rsi_off * wordSize); 1.57 1.58 @@ -360,6 +376,11 @@ 1.59 #endif 1.60 1.61 // restore regs belonging to calling function 1.62 +#ifdef _WIN64 1.63 + for (int i = 15; i >= 6; i--) { 1.64 + __ movdqu(as_XMMRegister(i), xmm_save(i)); 1.65 + } 1.66 +#endif 1.67 __ movptr(r15, r15_save); 1.68 __ movptr(r14, r14_save); 1.69 __ movptr(r13, r13_save);