486 __ unlock_object(rdi, rbx, rax, *stub->entry()); |
486 __ unlock_object(rdi, rbx, rax, *stub->entry()); |
487 __ bind(*stub->continuation()); |
487 __ bind(*stub->continuation()); |
488 } |
488 } |
489 |
489 |
490 if (compilation()->env()->dtrace_method_probes()) { |
490 if (compilation()->env()->dtrace_method_probes()) { |
491 __ movoop(Address(rsp, 0), method()->constant_encoding()); |
491 __ get_thread(rax); |
|
492 __ movptr(Address(rsp, 0), rax); |
|
493 __ movoop(Address(rsp, sizeof(void*)), method()->constant_encoding()); |
492 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit))); |
494 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit))); |
493 } |
495 } |
494 |
496 |
495 if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) { |
497 if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) { |
496 __ mov(rax, rsi); // Restore the exception |
498 __ mov(rax, rsi); // Restore the exception |
1614 } |
1616 } |
1615 |
1617 |
1616 void LIR_Assembler::type_profile_helper(Register mdo, |
1618 void LIR_Assembler::type_profile_helper(Register mdo, |
1617 ciMethodData *md, ciProfileData *data, |
1619 ciMethodData *md, ciProfileData *data, |
1618 Register recv, Label* update_done) { |
1620 Register recv, Label* update_done) { |
1619 uint i; |
1621 for (uint i = 0; i < ReceiverTypeData::row_limit(); i++) { |
1620 for (i = 0; i < ReceiverTypeData::row_limit(); i++) { |
|
1621 Label next_test; |
1622 Label next_test; |
1622 // See if the receiver is receiver[n]. |
1623 // See if the receiver is receiver[n]. |
1623 __ cmpptr(recv, Address(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i)))); |
1624 __ cmpptr(recv, Address(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i)))); |
1624 __ jccb(Assembler::notEqual, next_test); |
1625 __ jccb(Assembler::notEqual, next_test); |
1625 Address data_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_count_offset(i))); |
1626 Address data_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_count_offset(i))); |
1627 __ jmp(*update_done); |
1628 __ jmp(*update_done); |
1628 __ bind(next_test); |
1629 __ bind(next_test); |
1629 } |
1630 } |
1630 |
1631 |
1631 // Didn't find receiver; find next empty slot and fill it in |
1632 // Didn't find receiver; find next empty slot and fill it in |
1632 for (i = 0; i < ReceiverTypeData::row_limit(); i++) { |
1633 for (uint i = 0; i < ReceiverTypeData::row_limit(); i++) { |
1633 Label next_test; |
1634 Label next_test; |
1634 Address recv_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i))); |
1635 Address recv_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i))); |
1635 __ cmpptr(recv_addr, (intptr_t)NULL_WORD); |
1636 __ cmpptr(recv_addr, (intptr_t)NULL_WORD); |
1636 __ jccb(Assembler::notEqual, next_test); |
1637 __ jccb(Assembler::notEqual, next_test); |
1637 __ movptr(recv_addr, recv); |
1638 __ movptr(recv_addr, recv); |