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. |