194 int slot_offset = monitor_offset - ((i * BasicObjectLock::size()) * BytesPerWord); |
194 int slot_offset = monitor_offset - ((i * BasicObjectLock::size()) * BytesPerWord); |
195 #ifdef ASSERT |
195 #ifdef ASSERT |
196 // verify the interpreter's monitor has a non-null object |
196 // verify the interpreter's monitor has a non-null object |
197 { |
197 { |
198 Label L; |
198 Label L; |
199 __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::obj_offset_in_bytes()), O7); |
199 __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7); |
200 __ cmp(G0, O7); |
200 __ cmp(G0, O7); |
201 __ br(Assembler::notEqual, false, Assembler::pt, L); |
201 __ br(Assembler::notEqual, false, Assembler::pt, L); |
202 __ delayed()->nop(); |
202 __ delayed()->nop(); |
203 __ stop("locked object is NULL"); |
203 __ stop("locked object is NULL"); |
204 __ bind(L); |
204 __ bind(L); |
205 } |
205 } |
206 #endif // ASSERT |
206 #endif // ASSERT |
207 // Copy the lock field into the compiled activation. |
207 // Copy the lock field into the compiled activation. |
208 __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::lock_offset_in_bytes()), O7); |
208 __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::lock_offset_in_bytes(), O7); |
209 __ st_ptr(O7, frame_map()->address_for_monitor_lock(i)); |
209 __ st_ptr(O7, frame_map()->address_for_monitor_lock(i)); |
210 __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::obj_offset_in_bytes()), O7); |
210 __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7); |
211 __ st_ptr(O7, frame_map()->address_for_monitor_object(i)); |
211 __ st_ptr(O7, frame_map()->address_for_monitor_object(i)); |
212 } |
212 } |
213 } |
213 } |
214 } |
214 } |
215 |
215 |
236 |
236 |
237 int value_offset = java_lang_String:: value_offset_in_bytes(); // char array |
237 int value_offset = java_lang_String:: value_offset_in_bytes(); // char array |
238 int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position |
238 int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position |
239 int count_offset = java_lang_String:: count_offset_in_bytes(); |
239 int count_offset = java_lang_String:: count_offset_in_bytes(); |
240 |
240 |
241 __ ld_ptr(Address(str0, 0, value_offset), tmp0); |
241 __ ld_ptr(str0, value_offset, tmp0); |
242 __ ld(Address(str0, 0, offset_offset), tmp2); |
242 __ ld(str0, offset_offset, tmp2); |
243 __ add(tmp0, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0); |
243 __ add(tmp0, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0); |
244 __ ld(Address(str0, 0, count_offset), str0); |
244 __ ld(str0, count_offset, str0); |
245 __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); |
245 __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); |
246 |
246 |
247 // str1 may be null |
247 // str1 may be null |
248 add_debug_info_for_null_check_here(info); |
248 add_debug_info_for_null_check_here(info); |
249 |
249 |
250 __ ld_ptr(Address(str1, 0, value_offset), tmp1); |
250 __ ld_ptr(str1, value_offset, tmp1); |
251 __ add(tmp0, tmp2, tmp0); |
251 __ add(tmp0, tmp2, tmp0); |
252 |
252 |
253 __ ld(Address(str1, 0, offset_offset), tmp2); |
253 __ ld(str1, offset_offset, tmp2); |
254 __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1); |
254 __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1); |
255 __ ld(Address(str1, 0, count_offset), str1); |
255 __ ld(str1, count_offset, str1); |
256 __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); |
256 __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); |
257 __ subcc(str0, str1, O7); |
257 __ subcc(str0, str1, O7); |
258 __ add(tmp1, tmp2, tmp1); |
258 __ add(tmp1, tmp2, tmp1); |
259 } |
259 } |
260 |
260 |
410 #ifdef ASSERT |
410 #ifdef ASSERT |
411 int offset = code_offset(); |
411 int offset = code_offset(); |
412 #endif // ASSERT |
412 #endif // ASSERT |
413 compilation()->offsets()->set_value(CodeOffsets::Deopt, code_offset()); |
413 compilation()->offsets()->set_value(CodeOffsets::Deopt, code_offset()); |
414 |
414 |
415 Address deopt_blob(G3_scratch, SharedRuntime::deopt_blob()->unpack()); |
415 AddressLiteral deopt_blob(SharedRuntime::deopt_blob()->unpack()); |
416 |
416 |
417 __ JUMP(deopt_blob, 0); // sethi;jmp |
417 __ JUMP(deopt_blob, G3_scratch, 0); // sethi;jmp |
418 __ delayed()->nop(); |
418 __ delayed()->nop(); |
419 |
419 |
420 assert(code_offset() - offset <= deopt_handler_size, "overflow"); |
420 assert(code_offset() - offset <= deopt_handler_size, "overflow"); |
421 |
421 |
422 debug_only(__ stop("should have gone to the caller");) |
422 debug_only(__ stop("should have gone to the caller");) |
439 void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo *info) { |
439 void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo *info) { |
440 // Allocate a new index in oop table to hold the oop once it's been patched |
440 // Allocate a new index in oop table to hold the oop once it's been patched |
441 int oop_index = __ oop_recorder()->allocate_index((jobject)NULL); |
441 int oop_index = __ oop_recorder()->allocate_index((jobject)NULL); |
442 PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id, oop_index); |
442 PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id, oop_index); |
443 |
443 |
444 Address addr = Address(reg, address(NULL), oop_Relocation::spec(oop_index)); |
444 AddressLiteral addrlit(NULL, oop_Relocation::spec(oop_index)); |
445 assert(addr.rspec().type() == relocInfo::oop_type, "must be an oop reloc"); |
445 assert(addrlit.rspec().type() == relocInfo::oop_type, "must be an oop reloc"); |
446 // It may not seem necessary to use a sethi/add pair to load a NULL into dest, but the |
446 // It may not seem necessary to use a sethi/add pair to load a NULL into dest, but the |
447 // NULL will be dynamically patched later and the patched value may be large. We must |
447 // NULL will be dynamically patched later and the patched value may be large. We must |
448 // therefore generate the sethi/add as a placeholders |
448 // therefore generate the sethi/add as a placeholders |
449 __ sethi(addr, true); |
449 __ patchable_set(addrlit, reg); |
450 __ add(addr, reg, 0); |
|
451 |
450 |
452 patching_epilog(patch, lir_patch_normal, reg, info); |
451 patching_epilog(patch, lir_patch_normal, reg, info); |
453 } |
452 } |
454 |
453 |
455 |
454 |
704 } |
703 } |
705 |
704 |
706 |
705 |
707 void LIR_Assembler::vtable_call(int vtable_offset, CodeEmitInfo* info) { |
706 void LIR_Assembler::vtable_call(int vtable_offset, CodeEmitInfo* info) { |
708 add_debug_info_for_null_check_here(info); |
707 add_debug_info_for_null_check_here(info); |
709 __ ld_ptr(Address(O0, 0, oopDesc::klass_offset_in_bytes()), G3_scratch); |
708 __ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), G3_scratch); |
710 if (__ is_simm13(vtable_offset) ) { |
709 if (__ is_simm13(vtable_offset) ) { |
711 __ ld_ptr(G3_scratch, vtable_offset, G5_method); |
710 __ ld_ptr(G3_scratch, vtable_offset, G5_method); |
712 } else { |
711 } else { |
713 // This will generate 2 instructions |
712 // This will generate 2 instructions |
714 __ set(vtable_offset, G5_method); |
713 __ set(vtable_offset, G5_method); |
715 // ld_ptr, set_hi, set |
714 // ld_ptr, set_hi, set |
716 __ ld_ptr(G3_scratch, G5_method, G5_method); |
715 __ ld_ptr(G3_scratch, G5_method, G5_method); |
717 } |
716 } |
718 __ ld_ptr(G5_method, in_bytes(methodOopDesc::from_compiled_offset()), G3_scratch); |
717 __ ld_ptr(G5_method, methodOopDesc::from_compiled_offset(), G3_scratch); |
719 __ callr(G3_scratch, G0); |
718 __ callr(G3_scratch, G0); |
720 // the peephole pass fills the delay slot |
719 // the peephole pass fills the delay slot |
721 } |
720 } |
722 |
721 |
723 |
722 |
736 case T_ARRAY : // fall through |
735 case T_ARRAY : // fall through |
737 case T_OBJECT: __ ld_ptr(s, disp, d); break; |
736 case T_OBJECT: __ ld_ptr(s, disp, d); break; |
738 default : ShouldNotReachHere(); |
737 default : ShouldNotReachHere(); |
739 } |
738 } |
740 } else { |
739 } else { |
741 __ sethi(disp & ~0x3ff, O7, true); |
740 __ set(disp, O7); |
742 __ add(O7, disp & 0x3ff, O7); |
|
743 if (info != NULL) add_debug_info_for_null_check_here(info); |
741 if (info != NULL) add_debug_info_for_null_check_here(info); |
744 load_offset = code_offset(); |
742 load_offset = code_offset(); |
745 switch(ld_type) { |
743 switch(ld_type) { |
746 case T_BOOLEAN: // fall through |
744 case T_BOOLEAN: // fall through |
747 case T_BYTE : __ ldsb(s, O7, d); break; |
745 case T_BYTE : __ ldsb(s, O7, d); break; |
773 case T_ARRAY : // fall through |
771 case T_ARRAY : // fall through |
774 case T_OBJECT: __ st_ptr(value, base, offset); break; |
772 case T_OBJECT: __ st_ptr(value, base, offset); break; |
775 default : ShouldNotReachHere(); |
773 default : ShouldNotReachHere(); |
776 } |
774 } |
777 } else { |
775 } else { |
778 __ sethi(offset & ~0x3ff, O7, true); |
776 __ set(offset, O7); |
779 __ add(O7, offset & 0x3ff, O7); |
|
780 if (info != NULL) add_debug_info_for_null_check_here(info); |
777 if (info != NULL) add_debug_info_for_null_check_here(info); |
781 switch (type) { |
778 switch (type) { |
782 case T_BOOLEAN: // fall through |
779 case T_BOOLEAN: // fall through |
783 case T_BYTE : __ stb(value, base, O7); break; |
780 case T_BYTE : __ stb(value, base, O7); break; |
784 case T_CHAR : __ sth(value, base, O7); break; |
781 case T_CHAR : __ sth(value, base, O7); break; |
837 __ stf(FloatRegisterImpl::S, value , base, offset); |
833 __ stf(FloatRegisterImpl::S, value , base, offset); |
838 } else { |
834 } else { |
839 __ stf(w, value, base, offset); |
835 __ stf(w, value, base, offset); |
840 } |
836 } |
841 } else { |
837 } else { |
842 __ sethi(offset & ~0x3ff, O7, true); |
838 __ set(offset, O7); |
843 __ add(O7, offset & 0x3ff, O7); |
|
844 if (info != NULL) add_debug_info_for_null_check_here(info); |
839 if (info != NULL) add_debug_info_for_null_check_here(info); |
845 __ stf(w, value, O7, base); |
840 __ stf(w, value, O7, base); |
846 } |
841 } |
847 } |
842 } |
848 |
843 |
850 int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool unaligned) { |
845 int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool unaligned) { |
851 int store_offset; |
846 int store_offset; |
852 if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) { |
847 if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) { |
853 assert(!unaligned, "can't handle this"); |
848 assert(!unaligned, "can't handle this"); |
854 // for offsets larger than a simm13 we setup the offset in O7 |
849 // for offsets larger than a simm13 we setup the offset in O7 |
855 __ sethi(offset & ~0x3ff, O7, true); |
850 __ set(offset, O7); |
856 __ add(O7, offset & 0x3ff, O7); |
|
857 store_offset = store(from_reg, base, O7, type); |
851 store_offset = store(from_reg, base, O7, type); |
858 } else { |
852 } else { |
859 if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(from_reg->as_register()); |
853 if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(from_reg->as_register()); |
860 store_offset = code_offset(); |
854 store_offset = code_offset(); |
861 switch (type) { |
855 switch (type) { |
935 int load_offset; |
929 int load_offset; |
936 if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) { |
930 if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) { |
937 assert(base != O7, "destroying register"); |
931 assert(base != O7, "destroying register"); |
938 assert(!unaligned, "can't handle this"); |
932 assert(!unaligned, "can't handle this"); |
939 // for offsets larger than a simm13 we setup the offset in O7 |
933 // for offsets larger than a simm13 we setup the offset in O7 |
940 __ sethi(offset & ~0x3ff, O7, true); |
934 __ set(offset, O7); |
941 __ add(O7, offset & 0x3ff, O7); |
|
942 load_offset = load(base, O7, to_reg, type); |
935 load_offset = load(base, O7, to_reg, type); |
943 } else { |
936 } else { |
944 load_offset = code_offset(); |
937 load_offset = code_offset(); |
945 switch(type) { |
938 switch(type) { |
946 case T_BOOLEAN: // fall through |
939 case T_BOOLEAN: // fall through |
1236 __ set(con, to_reg->as_register()); |
1229 __ set(con, to_reg->as_register()); |
1237 #endif |
1230 #endif |
1238 } else { |
1231 } else { |
1239 ShouldNotReachHere(); |
1232 ShouldNotReachHere(); |
1240 assert(to_reg->is_double_fpu(), "wrong register kind"); |
1233 assert(to_reg->is_double_fpu(), "wrong register kind"); |
1241 Address temp_slot_lo(SP, 0, ((frame::register_save_words ) * wordSize) + STACK_BIAS); |
1234 Address temp_slot_lo(SP, ((frame::register_save_words ) * wordSize) + STACK_BIAS); |
1242 Address temp_slot_hi(SP, 0, ((frame::register_save_words) * wordSize) + (longSize/2) + STACK_BIAS); |
1235 Address temp_slot_hi(SP, ((frame::register_save_words) * wordSize) + (longSize/2) + STACK_BIAS); |
1243 __ set(low(con), O7); |
1236 __ set(low(con), O7); |
1244 __ st(O7, temp_slot_lo); |
1237 __ st(O7, temp_slot_lo); |
1245 __ set(high(con), O7); |
1238 __ set(high(con), O7); |
1246 __ st(O7, temp_slot_hi); |
1239 __ st(O7, temp_slot_hi); |
1247 __ ldf(FloatRegisterImpl::D, temp_slot_lo, to_reg->as_double_reg()); |
1240 __ ldf(FloatRegisterImpl::D, temp_slot_lo, to_reg->as_double_reg()); |
1265 if (const_addr == NULL) { |
1258 if (const_addr == NULL) { |
1266 bailout("const section overflow"); |
1259 bailout("const section overflow"); |
1267 break; |
1260 break; |
1268 } |
1261 } |
1269 RelocationHolder rspec = internal_word_Relocation::spec(const_addr); |
1262 RelocationHolder rspec = internal_word_Relocation::spec(const_addr); |
|
1263 AddressLiteral const_addrlit(const_addr, rspec); |
1270 if (to_reg->is_single_fpu()) { |
1264 if (to_reg->is_single_fpu()) { |
1271 __ sethi( (intx)const_addr & ~0x3ff, O7, true, rspec); |
1265 __ patchable_sethi(const_addrlit, O7); |
1272 __ relocate(rspec); |
1266 __ relocate(rspec); |
1273 |
1267 __ ldf(FloatRegisterImpl::S, O7, const_addrlit.low10(), to_reg->as_float_reg()); |
1274 int offset = (intx)const_addr & 0x3ff; |
|
1275 __ ldf (FloatRegisterImpl::S, O7, offset, to_reg->as_float_reg()); |
|
1276 |
1268 |
1277 } else { |
1269 } else { |
1278 assert(to_reg->is_single_cpu(), "Must be a cpu register."); |
1270 assert(to_reg->is_single_cpu(), "Must be a cpu register."); |
1279 |
1271 |
1280 __ set((intx)const_addr, O7, rspec); |
1272 __ set(const_addrlit, O7); |
1281 load(O7, 0, to_reg->as_register(), T_INT); |
1273 load(O7, 0, to_reg->as_register(), T_INT); |
1282 } |
1274 } |
1283 } |
1275 } |
1284 break; |
1276 break; |
1285 |
1277 |
1291 break; |
1283 break; |
1292 } |
1284 } |
1293 RelocationHolder rspec = internal_word_Relocation::spec(const_addr); |
1285 RelocationHolder rspec = internal_word_Relocation::spec(const_addr); |
1294 |
1286 |
1295 if (to_reg->is_double_fpu()) { |
1287 if (to_reg->is_double_fpu()) { |
1296 __ sethi( (intx)const_addr & ~0x3ff, O7, true, rspec); |
1288 AddressLiteral const_addrlit(const_addr, rspec); |
1297 int offset = (intx)const_addr & 0x3ff; |
1289 __ patchable_sethi(const_addrlit, O7); |
1298 __ relocate(rspec); |
1290 __ relocate(rspec); |
1299 __ ldf (FloatRegisterImpl::D, O7, offset, to_reg->as_double_reg()); |
1291 __ ldf (FloatRegisterImpl::D, O7, const_addrlit.low10(), to_reg->as_double_reg()); |
1300 } else { |
1292 } else { |
1301 assert(to_reg->is_double_cpu(), "Must be a long register."); |
1293 assert(to_reg->is_double_cpu(), "Must be a long register."); |
1302 #ifdef _LP64 |
1294 #ifdef _LP64 |
1303 __ set(jlong_cast(c->as_jdouble()), to_reg->as_register_lo()); |
1295 __ set(jlong_cast(c->as_jdouble()), to_reg->as_register_lo()); |
1304 #else |
1296 #else |
1358 } |
1350 } |
1359 |
1351 |
1360 |
1352 |
1361 Address LIR_Assembler::as_Address_hi(LIR_Address* addr) { |
1353 Address LIR_Assembler::as_Address_hi(LIR_Address* addr) { |
1362 Address base = as_Address(addr); |
1354 Address base = as_Address(addr); |
1363 return Address(base.base(), 0, base.disp() + hi_word_offset_in_bytes); |
1355 return Address(base.base(), base.disp() + hi_word_offset_in_bytes); |
1364 } |
1356 } |
1365 |
1357 |
1366 |
1358 |
1367 Address LIR_Assembler::as_Address_lo(LIR_Address* addr) { |
1359 Address LIR_Assembler::as_Address_lo(LIR_Address* addr) { |
1368 Address base = as_Address(addr); |
1360 Address base = as_Address(addr); |
1369 return Address(base.base(), 0, base.disp() + lo_word_offset_in_bytes); |
1361 return Address(base.base(), base.disp() + lo_word_offset_in_bytes); |
1370 } |
1362 } |
1371 |
1363 |
1372 |
1364 |
1373 void LIR_Assembler::mem2reg(LIR_Opr src_opr, LIR_Opr dest, BasicType type, |
1365 void LIR_Assembler::mem2reg(LIR_Opr src_opr, LIR_Opr dest, BasicType type, |
1374 LIR_PatchCode patch_code, CodeEmitInfo* info, bool unaligned) { |
1366 LIR_PatchCode patch_code, CodeEmitInfo* info, bool unaligned) { |
1625 int start = __ offset(); |
1615 int start = __ offset(); |
1626 __ relocate(static_stub_Relocation::spec(call_pc)); |
1616 __ relocate(static_stub_Relocation::spec(call_pc)); |
1627 |
1617 |
1628 __ set_oop(NULL, G5); |
1618 __ set_oop(NULL, G5); |
1629 // must be set to -1 at code generation time |
1619 // must be set to -1 at code generation time |
1630 Address a(G3, (address)-1); |
1620 AddressLiteral addrlit(-1); |
1631 __ jump_to(a, 0); |
1621 __ jump_to(addrlit, G3); |
1632 __ delayed()->nop(); |
1622 __ delayed()->nop(); |
1633 |
1623 |
1634 assert(__ offset() - start <= call_stub_size, "stub too big"); |
1624 assert(__ offset() - start <= call_stub_size, "stub too big"); |
1635 __ end_a_stub(); |
1625 __ end_a_stub(); |
1636 } |
1626 } |
2061 } else { |
2051 } else { |
2062 // reuse the debug info from the safepoint poll for the throw op itself |
2052 // reuse the debug info from the safepoint poll for the throw op itself |
2063 address pc_for_athrow = __ pc(); |
2053 address pc_for_athrow = __ pc(); |
2064 int pc_for_athrow_offset = __ offset(); |
2054 int pc_for_athrow_offset = __ offset(); |
2065 RelocationHolder rspec = internal_word_Relocation::spec(pc_for_athrow); |
2055 RelocationHolder rspec = internal_word_Relocation::spec(pc_for_athrow); |
2066 __ set((intptr_t)pc_for_athrow, Oissuing_pc, rspec); |
2056 __ set(pc_for_athrow, Oissuing_pc, rspec); |
2067 add_call_info(pc_for_athrow_offset, info); // for exception handler |
2057 add_call_info(pc_for_athrow_offset, info); // for exception handler |
2068 |
2058 |
2069 __ call(Runtime1::entry_for(Runtime1::handle_exception_id), relocInfo::runtime_call_type); |
2059 __ call(Runtime1::entry_for(Runtime1::handle_exception_id), relocInfo::runtime_call_type); |
2070 __ delayed()->nop(); |
2060 __ delayed()->nop(); |
2071 } |
2061 } |
2449 __ set(mdo_offset_bias, data_val); |
2439 __ set(mdo_offset_bias, data_val); |
2450 __ add(mdo, data_val, mdo); |
2440 __ add(mdo, data_val, mdo); |
2451 } |
2441 } |
2452 |
2442 |
2453 |
2443 |
2454 Address flags_addr(mdo, 0, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias); |
2444 Address flags_addr(mdo, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias); |
2455 __ ldub(flags_addr, data_val); |
2445 __ ldub(flags_addr, data_val); |
2456 __ or3(data_val, BitData::null_seen_byte_constant(), data_val); |
2446 __ or3(data_val, BitData::null_seen_byte_constant(), data_val); |
2457 __ stb(data_val, flags_addr); |
2447 __ stb(data_val, flags_addr); |
2458 __ bind(profile_done); |
2448 __ bind(profile_done); |
2459 } |
2449 } |
2736 mdo_offset_bias = md->byte_offset_of_slot(data, CounterData::count_offset()); |
2726 mdo_offset_bias = md->byte_offset_of_slot(data, CounterData::count_offset()); |
2737 __ set(mdo_offset_bias, O7); |
2727 __ set(mdo_offset_bias, O7); |
2738 __ add(mdo, O7, mdo); |
2728 __ add(mdo, O7, mdo); |
2739 } |
2729 } |
2740 |
2730 |
2741 Address counter_addr(mdo, 0, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); |
2731 Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); |
2742 __ lduw(counter_addr, tmp1); |
2732 __ lduw(counter_addr, tmp1); |
2743 __ add(tmp1, DataLayout::counter_increment, tmp1); |
2733 __ add(tmp1, DataLayout::counter_increment, tmp1); |
2744 __ stw(tmp1, counter_addr); |
2734 __ stw(tmp1, counter_addr); |
2745 Bytecodes::Code bc = method->java_code_at_bci(bci); |
2735 Bytecodes::Code bc = method->java_code_at_bci(bci); |
2746 // Perform additional virtual call profiling for invokevirtual and |
2736 // Perform additional virtual call profiling for invokevirtual and |
2762 ciVirtualCallData* vc_data = (ciVirtualCallData*) data; |
2752 ciVirtualCallData* vc_data = (ciVirtualCallData*) data; |
2763 uint i; |
2753 uint i; |
2764 for (i = 0; i < VirtualCallData::row_limit(); i++) { |
2754 for (i = 0; i < VirtualCallData::row_limit(); i++) { |
2765 ciKlass* receiver = vc_data->receiver(i); |
2755 ciKlass* receiver = vc_data->receiver(i); |
2766 if (known_klass->equals(receiver)) { |
2756 if (known_klass->equals(receiver)) { |
2767 Address data_addr(mdo, 0, md->byte_offset_of_slot(data, |
2757 Address data_addr(mdo, md->byte_offset_of_slot(data, |
2768 VirtualCallData::receiver_count_offset(i)) - |
2758 VirtualCallData::receiver_count_offset(i)) - |
2769 mdo_offset_bias); |
2759 mdo_offset_bias); |
2770 __ lduw(data_addr, tmp1); |
2760 __ lduw(data_addr, tmp1); |
2771 __ add(tmp1, DataLayout::counter_increment, tmp1); |
2761 __ add(tmp1, DataLayout::counter_increment, tmp1); |
2772 __ stw(tmp1, data_addr); |
2762 __ stw(tmp1, data_addr); |
2773 return; |
2763 return; |
2780 // always does a write to the receiver part of the |
2770 // always does a write to the receiver part of the |
2781 // VirtualCallData rather than just the first time |
2771 // VirtualCallData rather than just the first time |
2782 for (i = 0; i < VirtualCallData::row_limit(); i++) { |
2772 for (i = 0; i < VirtualCallData::row_limit(); i++) { |
2783 ciKlass* receiver = vc_data->receiver(i); |
2773 ciKlass* receiver = vc_data->receiver(i); |
2784 if (receiver == NULL) { |
2774 if (receiver == NULL) { |
2785 Address recv_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - |
2775 Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - |
2786 mdo_offset_bias); |
2776 mdo_offset_bias); |
2787 jobject2reg(known_klass->encoding(), tmp1); |
2777 jobject2reg(known_klass->encoding(), tmp1); |
2788 __ st_ptr(tmp1, recv_addr); |
2778 __ st_ptr(tmp1, recv_addr); |
2789 Address data_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - |
2779 Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - |
2790 mdo_offset_bias); |
2780 mdo_offset_bias); |
2791 __ lduw(data_addr, tmp1); |
2781 __ lduw(data_addr, tmp1); |
2792 __ add(tmp1, DataLayout::counter_increment, tmp1); |
2782 __ add(tmp1, DataLayout::counter_increment, tmp1); |
2793 __ stw(tmp1, data_addr); |
2783 __ stw(tmp1, data_addr); |
2794 return; |
2784 return; |
2795 } |
2785 } |
2796 } |
2786 } |
2797 } else { |
2787 } else { |
2798 load(Address(recv, 0, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT); |
2788 load(Address(recv, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT); |
2799 Label update_done; |
2789 Label update_done; |
2800 uint i; |
2790 uint i; |
2801 for (i = 0; i < VirtualCallData::row_limit(); i++) { |
2791 for (i = 0; i < VirtualCallData::row_limit(); i++) { |
2802 Label next_test; |
2792 Label next_test; |
2803 // See if the receiver is receiver[n]. |
2793 // See if the receiver is receiver[n]. |
2804 Address receiver_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - |
2794 Address receiver_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - |
2805 mdo_offset_bias); |
2795 mdo_offset_bias); |
2806 __ ld_ptr(receiver_addr, tmp1); |
2796 __ ld_ptr(receiver_addr, tmp1); |
2807 __ verify_oop(tmp1); |
2797 __ verify_oop(tmp1); |
2808 __ cmp(recv, tmp1); |
2798 __ cmp(recv, tmp1); |
2809 __ brx(Assembler::notEqual, false, Assembler::pt, next_test); |
2799 __ brx(Assembler::notEqual, false, Assembler::pt, next_test); |
2810 __ delayed()->nop(); |
2800 __ delayed()->nop(); |
2811 Address data_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - |
2801 Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - |
2812 mdo_offset_bias); |
2802 mdo_offset_bias); |
2813 __ lduw(data_addr, tmp1); |
2803 __ lduw(data_addr, tmp1); |
2814 __ add(tmp1, DataLayout::counter_increment, tmp1); |
2804 __ add(tmp1, DataLayout::counter_increment, tmp1); |
2815 __ stw(tmp1, data_addr); |
2805 __ stw(tmp1, data_addr); |
2816 __ br(Assembler::always, false, Assembler::pt, update_done); |
2806 __ br(Assembler::always, false, Assembler::pt, update_done); |
2819 } |
2809 } |
2820 |
2810 |
2821 // Didn't find receiver; find next empty slot and fill it in |
2811 // Didn't find receiver; find next empty slot and fill it in |
2822 for (i = 0; i < VirtualCallData::row_limit(); i++) { |
2812 for (i = 0; i < VirtualCallData::row_limit(); i++) { |
2823 Label next_test; |
2813 Label next_test; |
2824 Address recv_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - |
2814 Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - |
2825 mdo_offset_bias); |
2815 mdo_offset_bias); |
2826 load(recv_addr, tmp1, T_OBJECT); |
2816 load(recv_addr, tmp1, T_OBJECT); |
2827 __ tst(tmp1); |
2817 __ tst(tmp1); |
2828 __ brx(Assembler::notEqual, false, Assembler::pt, next_test); |
2818 __ brx(Assembler::notEqual, false, Assembler::pt, next_test); |
2829 __ delayed()->nop(); |
2819 __ delayed()->nop(); |
2830 __ st_ptr(recv, recv_addr); |
2820 __ st_ptr(recv, recv_addr); |
2831 __ set(DataLayout::counter_increment, tmp1); |
2821 __ set(DataLayout::counter_increment, tmp1); |
2832 __ st_ptr(tmp1, Address(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - |
2822 __ st_ptr(tmp1, mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - |
2833 mdo_offset_bias)); |
2823 mdo_offset_bias); |
2834 if (i < (VirtualCallData::row_limit() - 1)) { |
2824 if (i < (VirtualCallData::row_limit() - 1)) { |
2835 __ br(Assembler::always, false, Assembler::pt, update_done); |
2825 __ br(Assembler::always, false, Assembler::pt, update_done); |
2836 __ delayed()->nop(); |
2826 __ delayed()->nop(); |
2837 } |
2827 } |
2838 __ bind(next_test); |
2828 __ bind(next_test); |