< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Print this page




 399     __ movptr(rbx, rbx_save);
 400 
 401 #ifdef _WIN64
 402     __ movptr(rdi, rdi_save);
 403     __ movptr(rsi, rsi_save);
 404 #else
 405     __ ldmxcsr(mxcsr_save);
 406 #endif
 407 
 408     // restore rsp
 409     __ addptr(rsp, -rsp_after_call_off * wordSize);
 410 
 411     // return
 412     __ vzeroupper();
 413     __ pop(rbp);
 414     __ ret(0);
 415 
 416     // handle return types different from T_INT
 417     __ BIND(is_value);
 418     if (ValueTypeReturnedAsFields) {
 419       // Handle value type returned as fields
 420       __ store_value_type_fields_to_buf(NULL);
 421       __ movptr(r13, result);








 422     }
 423     __ BIND(is_long);
 424     __ movq(Address(r13, 0), rax);
 425     __ jmp(exit);
 426 
 427     __ BIND(is_float);
 428     __ movflt(Address(r13, 0), xmm0);
 429     __ jmp(exit);
 430 
 431     __ BIND(is_double);
 432     __ movdbl(Address(r13, 0), xmm0);
 433     __ jmp(exit);
 434 
 435     return start;
 436   }
 437 
 438   // Return point for a Java call if there's an exception thrown in
 439   // Java code.  The exception is caught and transformed into a
 440   // pending exception stored in JavaThread that can be tested from
 441   // within the VM.




 399     __ movptr(rbx, rbx_save);
 400 
 401 #ifdef _WIN64
 402     __ movptr(rdi, rdi_save);
 403     __ movptr(rsi, rsi_save);
 404 #else
 405     __ ldmxcsr(mxcsr_save);
 406 #endif
 407 
 408     // restore rsp
 409     __ addptr(rsp, -rsp_after_call_off * wordSize);
 410 
 411     // return
 412     __ vzeroupper();
 413     __ pop(rbp);
 414     __ ret(0);
 415 
 416     // handle return types different from T_INT
 417     __ BIND(is_value);
 418     if (ValueTypeReturnedAsFields) {
 419       // Check for flattened return value
 420       __ testptr(rax, 1);
 421       __ jcc(Assembler::zero, is_long);
 422       // Initialize pre-allocated buffer
 423       __ mov(rbx, rax);
 424       __ andptr(rbx, -2);
 425       __ movptr(rbx, Address(rbx, InstanceKlass::adr_valueklass_fixed_block_offset()));
 426       __ movptr(rbx, Address(rbx, ValueKlass::pack_handler_offset()));
 427       __ movptr(rax, Address(r13, 0));
 428       __ call(rbx);
 429       __ jmp(exit);
 430     }
 431     __ BIND(is_long);
 432     __ movq(Address(r13, 0), rax);
 433     __ jmp(exit);
 434 
 435     __ BIND(is_float);
 436     __ movflt(Address(r13, 0), xmm0);
 437     __ jmp(exit);
 438 
 439     __ BIND(is_double);
 440     __ movdbl(Address(r13, 0), xmm0);
 441     __ jmp(exit);
 442 
 443     return start;
 444   }
 445 
 446   // Return point for a Java call if there's an exception thrown in
 447   // Java code.  The exception is caught and transformed into a
 448   // pending exception stored in JavaThread that can be tested from
 449   // within the VM.


< prev index next >