< prev index next >

src/cpu/x86/vm/stubGenerator_x86_64.cpp

Print this page




 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);


< prev index next >