Mercurial > hg > truffle
comparison src/cpu/x86/vm/stubGenerator_x86_64.cpp @ 2407:b1c22848507b
6741940: Nonvolatile XMM registers not preserved across JNI calls
Summary: Save xmm6-xmm15 in call stub on win64
Reviewed-by: kvn, never
author | iveresov |
---|---|
date | Tue, 29 Mar 2011 17:35:34 -0700 |
parents | 0ac769a57c64 |
children | 348c0df561a9 |
comparison
equal
deleted
inserted
replaced
2406:a988a7bb3b8a | 2407:b1c22848507b |
---|---|
142 // 72(rbp): thread Thread* | 142 // 72(rbp): thread Thread* |
143 // | 143 // |
144 // [ return_from_Java ] <--- rsp | 144 // [ return_from_Java ] <--- rsp |
145 // [ argument word n ] | 145 // [ argument word n ] |
146 // ... | 146 // ... |
147 // -8 [ argument word 1 ] | 147 // -28 [ argument word 1 ] |
148 // -7 [ saved r15 ] <--- rsp_after_call | 148 // -27 [ saved xmm15 ] <--- rsp_after_call |
149 // [ saved xmm7-xmm14 ] | |
150 // -9 [ saved xmm6 ] (each xmm register takes 2 slots) | |
151 // -7 [ saved r15 ] | |
149 // -6 [ saved r14 ] | 152 // -6 [ saved r14 ] |
150 // -5 [ saved r13 ] | 153 // -5 [ saved r13 ] |
151 // -4 [ saved r12 ] | 154 // -4 [ saved r12 ] |
152 // -3 [ saved rdi ] | 155 // -3 [ saved rdi ] |
153 // -2 [ saved rsi ] | 156 // -2 [ saved rsi ] |
167 // We spill c_rarg0-c_rarg3 to this space. | 170 // We spill c_rarg0-c_rarg3 to this space. |
168 | 171 |
169 // Call stub stack layout word offsets from rbp | 172 // Call stub stack layout word offsets from rbp |
170 enum call_stub_layout { | 173 enum call_stub_layout { |
171 #ifdef _WIN64 | 174 #ifdef _WIN64 |
172 rsp_after_call_off = -7, | 175 xmm_save_first = 6, // save from xmm6 |
173 r15_off = rsp_after_call_off, | 176 xmm_save_last = 15, // to xmm15 |
177 xmm_save_base = -9, | |
178 rsp_after_call_off = xmm_save_base - 2 * (xmm_save_last - xmm_save_first), // -27 | |
179 r15_off = -7, | |
174 r14_off = -6, | 180 r14_off = -6, |
175 r13_off = -5, | 181 r13_off = -5, |
176 r12_off = -4, | 182 r12_off = -4, |
177 rdi_off = -3, | 183 rdi_off = -3, |
178 rsi_off = -2, | 184 rsi_off = -2, |
206 parameter_size_off = 2, | 212 parameter_size_off = 2, |
207 thread_off = 3 | 213 thread_off = 3 |
208 #endif | 214 #endif |
209 }; | 215 }; |
210 | 216 |
217 #ifdef _WIN64 | |
218 Address xmm_save(int reg) { | |
219 assert(reg >= xmm_save_first && reg <= xmm_save_last, "XMM register number out of range"); | |
220 return Address(rbp, (xmm_save_base - (reg - xmm_save_first) * 2) * wordSize); | |
221 } | |
222 #endif | |
223 | |
211 address generate_call_stub(address& return_address) { | 224 address generate_call_stub(address& return_address) { |
212 assert((int)frame::entry_frame_after_call_words == -(int)rsp_after_call_off + 1 && | 225 assert((int)frame::entry_frame_after_call_words == -(int)rsp_after_call_off + 1 && |
213 (int)frame::entry_frame_call_wrapper_offset == (int)call_wrapper_off, | 226 (int)frame::entry_frame_call_wrapper_offset == (int)call_wrapper_off, |
214 "adjust this code"); | 227 "adjust this code"); |
215 StubCodeMark mark(this, "StubRoutines", "call_stub"); | 228 StubCodeMark mark(this, "StubRoutines", "call_stub"); |
254 __ movptr(rbx_save, rbx); | 267 __ movptr(rbx_save, rbx); |
255 __ movptr(r12_save, r12); | 268 __ movptr(r12_save, r12); |
256 __ movptr(r13_save, r13); | 269 __ movptr(r13_save, r13); |
257 __ movptr(r14_save, r14); | 270 __ movptr(r14_save, r14); |
258 __ movptr(r15_save, r15); | 271 __ movptr(r15_save, r15); |
259 | |
260 #ifdef _WIN64 | 272 #ifdef _WIN64 |
273 for (int i = 6; i <= 15; i++) { | |
274 __ movdqu(xmm_save(i), as_XMMRegister(i)); | |
275 } | |
276 | |
261 const Address rdi_save(rbp, rdi_off * wordSize); | 277 const Address rdi_save(rbp, rdi_off * wordSize); |
262 const Address rsi_save(rbp, rsi_off * wordSize); | 278 const Address rsi_save(rbp, rsi_off * wordSize); |
263 | 279 |
264 __ movptr(rsi_save, rsi); | 280 __ movptr(rsi_save, rsi); |
265 __ movptr(rdi_save, rdi); | 281 __ movptr(rdi_save, rdi); |
358 __ bind(L); | 374 __ bind(L); |
359 } | 375 } |
360 #endif | 376 #endif |
361 | 377 |
362 // restore regs belonging to calling function | 378 // restore regs belonging to calling function |
379 #ifdef _WIN64 | |
380 for (int i = 15; i >= 6; i--) { | |
381 __ movdqu(as_XMMRegister(i), xmm_save(i)); | |
382 } | |
383 #endif | |
363 __ movptr(r15, r15_save); | 384 __ movptr(r15, r15_save); |
364 __ movptr(r14, r14_save); | 385 __ movptr(r14, r14_save); |
365 __ movptr(r13, r13_save); | 386 __ movptr(r13, r13_save); |
366 __ movptr(r12, r12_save); | 387 __ movptr(r12, r12_save); |
367 __ movptr(rbx, rbx_save); | 388 __ movptr(rbx, rbx_save); |