< prev index next >

src/cpu/sparc/vm/interp_masm_sparc.cpp

Print this page

        

*** 1648,1706 **** // Record the receiver type. record_klass_in_profile(receiver, scratch, true); bind(skip_receiver_profile); // The method data pointer needs to be updated to reflect the new target. update_mdp_by_constant(in_bytes(VirtualCallData::virtual_call_data_size())); ! bind (profile_continue); } } ! void InterpreterMacroAssembler::record_klass_in_profile_helper( ! Register receiver, Register scratch, ! int start_row, Label& done, bool is_virtual_call) { if (TypeProfileWidth == 0) { if (is_virtual_call) { increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch); } ! return; } ! int last_row = VirtualCallData::row_limit() - 1; assert(start_row <= last_row, "must be work left to do"); ! // Test this row for both the receiver and for null. // Take any of three different outcomes: ! // 1. found receiver => increment count and goto done // 2. found null => keep looking for case 1, maybe allocate this cell // 3. found something else => keep looking for cases 1 and 2 // Case 3 is handled by a recursive call. for (int row = start_row; row <= last_row; row++) { Label next_test; bool test_for_null_also = (row == start_row); ! // See if the receiver is receiver[n]. ! int recvr_offset = in_bytes(VirtualCallData::receiver_offset(row)); ! test_mdp_data_at(recvr_offset, receiver, next_test, scratch); // delayed()->tst(scratch); ! // The receiver is receiver[n]. Increment count[n]. ! int count_offset = in_bytes(VirtualCallData::receiver_count_offset(row)); increment_mdp_data_at(count_offset, scratch); ba_short(done); bind(next_test); if (test_for_null_also) { Label found_null; ! // Failed the equality check on receiver[n]... Test for null. if (start_row == last_row) { // The only thing left to do is handle the null case. ! if (is_virtual_call) { brx(Assembler::zero, false, Assembler::pn, found_null); delayed()->nop(); ! // Receiver did not match any saved receiver and there is no empty row for it. // Increment total counter to indicate polymorphic case. ! increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch); ba_short(done); bind(found_null); } else { brx(Assembler::notZero, false, Assembler::pt, done); delayed()->nop(); --- 1648,1753 ---- // Record the receiver type. record_klass_in_profile(receiver, scratch, true); bind(skip_receiver_profile); // The method data pointer needs to be updated to reflect the new target. + #if INCLUDE_JVMCI + if (MethodProfileWidth == 0) { update_mdp_by_constant(in_bytes(VirtualCallData::virtual_call_data_size())); ! } ! #else ! update_mdp_by_constant(in_bytes(VirtualCallData::virtual_call_data_size())); ! #endif ! bind(profile_continue); } } ! #if INCLUDE_JVMCI ! void InterpreterMacroAssembler::profile_called_method(Register method, Register scratch) { ! assert_different_registers(method, scratch); ! if (ProfileInterpreter && MethodProfileWidth > 0) { ! Label profile_continue; ! ! // If no method data exists, go to profile_continue. ! test_method_data_pointer(profile_continue); ! ! Label done; ! record_item_in_profile_helper(method, scratch, 0, done, MethodProfileWidth, ! &VirtualCallData::method_offset, &VirtualCallData::method_count_offset, in_bytes(VirtualCallData::nonprofiled_receiver_count_offset())); ! bind(done); ! ! update_mdp_by_constant(in_bytes(VirtualCallData::virtual_call_data_size())); ! bind(profile_continue); ! } ! } ! #endif // INCLUDE_JVMCI ! ! void InterpreterMacroAssembler::record_klass_in_profile_helper(Register receiver, Register scratch, ! Label& done, bool is_virtual_call) { if (TypeProfileWidth == 0) { if (is_virtual_call) { increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch); } ! #if INCLUDE_JVMCI ! else if (EnableJVMCI) { ! increment_mdp_data_at(in_bytes(ReceiverTypeData::nonprofiled_receiver_count_offset()), scratch); ! } ! #endif ! } else { ! int non_profiled_offset = -1; ! if (is_virtual_call) { ! non_profiled_offset = in_bytes(CounterData::count_offset()); } + #if INCLUDE_JVMCI + else if (EnableJVMCI) { + non_profiled_offset = in_bytes(ReceiverTypeData::nonprofiled_receiver_count_offset()); + } + #endif ! record_item_in_profile_helper(receiver, scratch, 0, done, TypeProfileWidth, ! &VirtualCallData::receiver_offset, &VirtualCallData::receiver_count_offset, non_profiled_offset); ! } ! } ! ! void InterpreterMacroAssembler::record_item_in_profile_helper(Register item, ! Register scratch, int start_row, Label& done, int total_rows, ! OffsetFunction item_offset_fn, OffsetFunction item_count_offset_fn, ! int non_profiled_offset) { ! int last_row = total_rows - 1; assert(start_row <= last_row, "must be work left to do"); ! // Test this row for both the item and for null. // Take any of three different outcomes: ! // 1. found item => increment count and goto done // 2. found null => keep looking for case 1, maybe allocate this cell // 3. found something else => keep looking for cases 1 and 2 // Case 3 is handled by a recursive call. for (int row = start_row; row <= last_row; row++) { Label next_test; bool test_for_null_also = (row == start_row); ! // See if the item is item[n]. ! int item_offset = in_bytes(item_offset_fn(row)); ! test_mdp_data_at(item_offset, item, next_test, scratch); // delayed()->tst(scratch); ! // The receiver is item[n]. Increment count[n]. ! int count_offset = in_bytes(item_count_offset_fn(row)); increment_mdp_data_at(count_offset, scratch); ba_short(done); bind(next_test); if (test_for_null_also) { Label found_null; ! // Failed the equality check on item[n]... Test for null. if (start_row == last_row) { // The only thing left to do is handle the null case. ! if (non_profiled_offset >= 0) { brx(Assembler::zero, false, Assembler::pn, found_null); delayed()->nop(); ! // Item did not match any saved item and there is no empty row for it. // Increment total counter to indicate polymorphic case. ! increment_mdp_data_at(non_profiled_offset, scratch); ba_short(done); bind(found_null); } else { brx(Assembler::notZero, false, Assembler::pt, done); delayed()->nop();
*** 1710,1734 **** // Since null is rare, make it be the branch-taken case. brx(Assembler::zero, false, Assembler::pn, found_null); delayed()->nop(); // Put all the "Case 3" tests here. ! record_klass_in_profile_helper(receiver, scratch, start_row + 1, done, is_virtual_call); ! // Found a null. Keep searching for a matching receiver, // but remember that this is an empty (unused) slot. bind(found_null); } } ! // In the fall-through case, we found no matching receiver, but we ! // observed the receiver[start_row] is NULL. ! // Fill in the receiver field and increment the count. ! int recvr_offset = in_bytes(VirtualCallData::receiver_offset(start_row)); ! set_mdp_data_at(recvr_offset, receiver); ! int count_offset = in_bytes(VirtualCallData::receiver_count_offset(start_row)); mov(DataLayout::counter_increment, scratch); set_mdp_data_at(count_offset, scratch); if (start_row > 0) { ba_short(done); } --- 1757,1782 ---- // Since null is rare, make it be the branch-taken case. brx(Assembler::zero, false, Assembler::pn, found_null); delayed()->nop(); // Put all the "Case 3" tests here. ! record_item_in_profile_helper(item, scratch, start_row + 1, done, total_rows, ! item_offset_fn, item_count_offset_fn, non_profiled_offset); ! // Found a null. Keep searching for a matching item, // but remember that this is an empty (unused) slot. bind(found_null); } } ! // In the fall-through case, we found no matching item, but we ! // observed the item[start_row] is NULL. ! // Fill in the item field and increment the count. ! int item_offset = in_bytes(item_offset_fn(start_row)); ! set_mdp_data_at(item_offset, item); ! int count_offset = in_bytes(item_count_offset_fn(start_row)); mov(DataLayout::counter_increment, scratch); set_mdp_data_at(count_offset, scratch); if (start_row > 0) { ba_short(done); }
*** 1737,1747 **** void InterpreterMacroAssembler::record_klass_in_profile(Register receiver, Register scratch, bool is_virtual_call) { assert(ProfileInterpreter, "must be profiling"); Label done; ! record_klass_in_profile_helper(receiver, scratch, 0, done, is_virtual_call); bind (done); } --- 1785,1795 ---- void InterpreterMacroAssembler::record_klass_in_profile(Register receiver, Register scratch, bool is_virtual_call) { assert(ProfileInterpreter, "must be profiling"); Label done; ! record_klass_in_profile_helper(receiver, scratch, done, is_virtual_call); bind (done); }
*** 1793,1803 **** set_mdp_flag_at(BitData::null_seen_byte_constant(), scratch); // The method data pointer needs to be updated. int mdp_delta = in_bytes(BitData::bit_data_size()); if (TypeProfileCasts) { ! mdp_delta = in_bytes(VirtualCallData::virtual_call_data_size()); } update_mdp_by_constant(mdp_delta); bind (profile_continue); } --- 1841,1851 ---- set_mdp_flag_at(BitData::null_seen_byte_constant(), scratch); // The method data pointer needs to be updated. int mdp_delta = in_bytes(BitData::bit_data_size()); if (TypeProfileCasts) { ! mdp_delta = in_bytes(ReceiverTypeData::receiver_type_data_size()); } update_mdp_by_constant(mdp_delta); bind (profile_continue); }
*** 1811,1821 **** // If no method data exists, go to profile_continue. test_method_data_pointer(profile_continue); int mdp_delta = in_bytes(BitData::bit_data_size()); if (TypeProfileCasts) { ! mdp_delta = in_bytes(VirtualCallData::virtual_call_data_size()); // Record the object type. record_klass_in_profile(klass, scratch, false); } --- 1859,1869 ---- // If no method data exists, go to profile_continue. test_method_data_pointer(profile_continue); int mdp_delta = in_bytes(BitData::bit_data_size()); if (TypeProfileCasts) { ! mdp_delta = in_bytes(ReceiverTypeData::receiver_type_data_size()); // Record the object type. record_klass_in_profile(klass, scratch, false); }
*** 1833,1843 **** // If no method data exists, go to profile_continue. test_method_data_pointer(profile_continue); int count_offset = in_bytes(CounterData::count_offset()); // Back up the address, since we have already bumped the mdp. ! count_offset -= in_bytes(VirtualCallData::virtual_call_data_size()); // *Decrement* the counter. We expect to see zero or small negatives. increment_mdp_data_at(count_offset, scratch, true); bind (profile_continue); --- 1881,1891 ---- // If no method data exists, go to profile_continue. test_method_data_pointer(profile_continue); int count_offset = in_bytes(CounterData::count_offset()); // Back up the address, since we have already bumped the mdp. ! count_offset -= in_bytes(ReceiverTypeData::receiver_type_data_size()); // *Decrement* the counter. We expect to see zero or small negatives. increment_mdp_data_at(count_offset, scratch, true); bind (profile_continue);
< prev index next >