256 __ movptr(method, c_rarg3); // method
257 __ movl(result_type, c_rarg2); // result type
258 __ movptr(result, c_rarg1); // result
259 __ movptr(call_wrapper, c_rarg0); // call wrapper
260
261 // save regs belonging to calling function
262 __ movptr(rbx_save, rbx);
263 __ movptr(r12_save, r12);
264 __ movptr(r13_save, r13);
265 __ movptr(r14_save, r14);
266 __ movptr(r15_save, r15);
267 if (UseAVX > 2) {
268 __ movl(rbx, 0xffff);
269 __ kmovql(k1, rbx);
270 }
271 #ifdef _WIN64
272 int last_reg = 15;
273 if (UseAVX > 2) {
274 last_reg = 31;
275 }
276 if (VM_Version::supports_avx512novl()) {
277 for (int i = xmm_save_first; i <= last_reg; i++) {
278 __ vextractf32x4h(xmm_save(i), as_XMMRegister(i), 0);
279 }
280 } else {
281 for (int i = xmm_save_first; i <= last_reg; i++) {
282 __ movdqu(xmm_save(i), as_XMMRegister(i));
283 }
284 }
285
286 const Address rdi_save(rbp, rdi_off * wordSize);
287 const Address rsi_save(rbp, rsi_off * wordSize);
288
289 __ movptr(rsi_save, rsi);
290 __ movptr(rdi_save, rdi);
291 #else
292 const Address mxcsr_save(rbp, mxcsr_off * wordSize);
293 {
294 Label skip_ldmx;
295 __ stmxcsr(mxcsr_save);
296 __ movl(rax, mxcsr_save);
374 Label L1, L2, L3;
375 __ cmpptr(r15_thread, thread);
376 __ jcc(Assembler::equal, L1);
377 __ stop("StubRoutines::call_stub: r15_thread is corrupted");
378 __ bind(L1);
379 __ get_thread(rbx);
380 __ cmpptr(r15_thread, thread);
381 __ jcc(Assembler::equal, L2);
382 __ stop("StubRoutines::call_stub: r15_thread is modified by call");
383 __ bind(L2);
384 __ cmpptr(r15_thread, rbx);
385 __ jcc(Assembler::equal, L3);
386 __ stop("StubRoutines::call_stub: threads must correspond");
387 __ bind(L3);
388 }
389 #endif
390
391 // restore regs belonging to calling function
392 #ifdef _WIN64
393 // emit the restores for xmm regs
394 if (VM_Version::supports_avx512novl()) {
395 for (int i = xmm_save_first; i <= last_reg; i++) {
396 __ vinsertf32x4h(as_XMMRegister(i), xmm_save(i), 0);
397 }
398 } else {
399 for (int i = xmm_save_first; i <= last_reg; i++) {
400 __ movdqu(as_XMMRegister(i), xmm_save(i));
401 }
402 }
403 #endif
404 __ movptr(r15, r15_save);
405 __ movptr(r14, r14_save);
406 __ movptr(r13, r13_save);
407 __ movptr(r12, r12_save);
408 __ movptr(rbx, rbx_save);
409
410 #ifdef _WIN64
411 __ movptr(rdi, rdi_save);
412 __ movptr(rsi, rsi_save);
413 #else
414 __ ldmxcsr(mxcsr_save);
|
256 __ movptr(method, c_rarg3); // method
257 __ movl(result_type, c_rarg2); // result type
258 __ movptr(result, c_rarg1); // result
259 __ movptr(call_wrapper, c_rarg0); // call wrapper
260
261 // save regs belonging to calling function
262 __ movptr(rbx_save, rbx);
263 __ movptr(r12_save, r12);
264 __ movptr(r13_save, r13);
265 __ movptr(r14_save, r14);
266 __ movptr(r15_save, r15);
267 if (UseAVX > 2) {
268 __ movl(rbx, 0xffff);
269 __ kmovql(k1, rbx);
270 }
271 #ifdef _WIN64
272 int last_reg = 15;
273 if (UseAVX > 2) {
274 last_reg = 31;
275 }
276 if (VM_Version::supports_evex()) {
277 for (int i = xmm_save_first; i <= last_reg; i++) {
278 __ vextractf32x4h(xmm_save(i), as_XMMRegister(i), 0);
279 }
280 } else {
281 for (int i = xmm_save_first; i <= last_reg; i++) {
282 __ movdqu(xmm_save(i), as_XMMRegister(i));
283 }
284 }
285
286 const Address rdi_save(rbp, rdi_off * wordSize);
287 const Address rsi_save(rbp, rsi_off * wordSize);
288
289 __ movptr(rsi_save, rsi);
290 __ movptr(rdi_save, rdi);
291 #else
292 const Address mxcsr_save(rbp, mxcsr_off * wordSize);
293 {
294 Label skip_ldmx;
295 __ stmxcsr(mxcsr_save);
296 __ movl(rax, mxcsr_save);
374 Label L1, L2, L3;
375 __ cmpptr(r15_thread, thread);
376 __ jcc(Assembler::equal, L1);
377 __ stop("StubRoutines::call_stub: r15_thread is corrupted");
378 __ bind(L1);
379 __ get_thread(rbx);
380 __ cmpptr(r15_thread, thread);
381 __ jcc(Assembler::equal, L2);
382 __ stop("StubRoutines::call_stub: r15_thread is modified by call");
383 __ bind(L2);
384 __ cmpptr(r15_thread, rbx);
385 __ jcc(Assembler::equal, L3);
386 __ stop("StubRoutines::call_stub: threads must correspond");
387 __ bind(L3);
388 }
389 #endif
390
391 // restore regs belonging to calling function
392 #ifdef _WIN64
393 // emit the restores for xmm regs
394 if (VM_Version::supports_evex()) {
395 for (int i = xmm_save_first; i <= last_reg; i++) {
396 __ vinsertf32x4h(as_XMMRegister(i), xmm_save(i), 0);
397 }
398 } else {
399 for (int i = xmm_save_first; i <= last_reg; i++) {
400 __ movdqu(as_XMMRegister(i), xmm_save(i));
401 }
402 }
403 #endif
404 __ movptr(r15, r15_save);
405 __ movptr(r14, r14_save);
406 __ movptr(r13, r13_save);
407 __ movptr(r12, r12_save);
408 __ movptr(rbx, rbx_save);
409
410 #ifdef _WIN64
411 __ movptr(rdi, rdi_save);
412 __ movptr(rsi, rsi_save);
413 #else
414 __ ldmxcsr(mxcsr_save);
|