Mercurial > hg > truffle
comparison src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | 1d7922586cf6 |
children | 8a02ca5e5576 |
comparison
equal
deleted
inserted
replaced
6724:36d1d483d5d6 | 6725:da91efe96a93 |
---|---|
445 __ bind(*stub->continuation()); | 445 __ bind(*stub->continuation()); |
446 } | 446 } |
447 | 447 |
448 if (compilation()->env()->dtrace_method_probes()) { | 448 if (compilation()->env()->dtrace_method_probes()) { |
449 __ mov(G2_thread, O0); | 449 __ mov(G2_thread, O0); |
450 jobject2reg(method()->constant_encoding(), O1); | 450 metadata2reg(method()->constant_encoding(), O1); |
451 __ call(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), relocInfo::runtime_call_type); | 451 __ call(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), relocInfo::runtime_call_type); |
452 __ delayed()->nop(); | 452 __ delayed()->nop(); |
453 } | 453 } |
454 | 454 |
455 if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) { | 455 if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) { |
500 void LIR_Assembler::jobject2reg(jobject o, Register reg) { | 500 void LIR_Assembler::jobject2reg(jobject o, Register reg) { |
501 if (o == NULL) { | 501 if (o == NULL) { |
502 __ set(NULL_WORD, reg); | 502 __ set(NULL_WORD, reg); |
503 } else { | 503 } else { |
504 int oop_index = __ oop_recorder()->find_index(o); | 504 int oop_index = __ oop_recorder()->find_index(o); |
505 assert(Universe::heap()->is_in_reserved(JNIHandles::resolve(o)), "should be real oop"); | |
505 RelocationHolder rspec = oop_Relocation::spec(oop_index); | 506 RelocationHolder rspec = oop_Relocation::spec(oop_index); |
506 __ set(NULL_WORD, reg, rspec); // Will be set when the nmethod is created | 507 __ set(NULL_WORD, reg, rspec); // Will be set when the nmethod is created |
507 } | 508 } |
508 } | 509 } |
509 | 510 |
510 | 511 |
511 void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo *info) { | 512 void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo *info) { |
512 // Allocate a new index in oop table to hold the oop once it's been patched | 513 // Allocate a new index in table to hold the object once it's been patched |
513 int oop_index = __ oop_recorder()->allocate_index((jobject)NULL); | 514 int oop_index = __ oop_recorder()->allocate_oop_index(NULL); |
514 PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id, oop_index); | 515 PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_mirror_id, oop_index); |
515 | 516 |
516 AddressLiteral addrlit(NULL, oop_Relocation::spec(oop_index)); | 517 AddressLiteral addrlit(NULL, oop_Relocation::spec(oop_index)); |
517 assert(addrlit.rspec().type() == relocInfo::oop_type, "must be an oop reloc"); | 518 assert(addrlit.rspec().type() == relocInfo::oop_type, "must be an oop reloc"); |
518 // It may not seem necessary to use a sethi/add pair to load a NULL into dest, but the | 519 // It may not seem necessary to use a sethi/add pair to load a NULL into dest, but the |
519 // NULL will be dynamically patched later and the patched value may be large. We must | 520 // NULL will be dynamically patched later and the patched value may be large. We must |
521 __ patchable_set(addrlit, reg); | 522 __ patchable_set(addrlit, reg); |
522 | 523 |
523 patching_epilog(patch, lir_patch_normal, reg, info); | 524 patching_epilog(patch, lir_patch_normal, reg, info); |
524 } | 525 } |
525 | 526 |
527 | |
528 void LIR_Assembler::metadata2reg(Metadata* o, Register reg) { | |
529 __ set_metadata_constant(o, reg); | |
530 } | |
531 | |
532 void LIR_Assembler::klass2reg_with_patching(Register reg, CodeEmitInfo *info) { | |
533 // Allocate a new index in table to hold the klass once it's been patched | |
534 int index = __ oop_recorder()->allocate_metadata_index(NULL); | |
535 PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id, index); | |
536 AddressLiteral addrlit(NULL, metadata_Relocation::spec(index)); | |
537 assert(addrlit.rspec().type() == relocInfo::metadata_type, "must be an metadata reloc"); | |
538 // It may not seem necessary to use a sethi/add pair to load a NULL into dest, but the | |
539 // NULL will be dynamically patched later and the patched value may be large. We must | |
540 // therefore generate the sethi/add as a placeholders | |
541 __ patchable_set(addrlit, reg); | |
542 | |
543 patching_epilog(patch, lir_patch_normal, reg, info); | |
544 } | |
526 | 545 |
527 void LIR_Assembler::emit_op3(LIR_Op3* op) { | 546 void LIR_Assembler::emit_op3(LIR_Op3* op) { |
528 Register Rdividend = op->in_opr1()->as_register(); | 547 Register Rdividend = op->in_opr1()->as_register(); |
529 Register Rdivisor = noreg; | 548 Register Rdivisor = noreg; |
530 Register Rscratch = op->in_opr3()->as_register(); | 549 Register Rscratch = op->in_opr3()->as_register(); |
766 // LIR_Assembler::emit_delay. | 785 // LIR_Assembler::emit_delay. |
767 } | 786 } |
768 | 787 |
769 | 788 |
770 void LIR_Assembler::ic_call(LIR_OpJavaCall* op) { | 789 void LIR_Assembler::ic_call(LIR_OpJavaCall* op) { |
771 RelocationHolder rspec = virtual_call_Relocation::spec(pc()); | 790 __ ic_call(op->addr(), false); |
772 __ set_oop((jobject)Universe::non_oop_word(), G5_inline_cache_reg); | |
773 __ relocate(rspec); | |
774 __ call(op->addr(), relocInfo::none); | |
775 // The peephole pass fills the delay slot, add_call_info is done in | 791 // The peephole pass fills the delay slot, add_call_info is done in |
776 // LIR_Assembler::emit_delay. | 792 // LIR_Assembler::emit_delay. |
777 } | 793 } |
778 | 794 |
779 | 795 |
786 // This will generate 2 instructions | 802 // This will generate 2 instructions |
787 __ set(op->vtable_offset(), G5_method); | 803 __ set(op->vtable_offset(), G5_method); |
788 // ld_ptr, set_hi, set | 804 // ld_ptr, set_hi, set |
789 __ ld_ptr(G3_scratch, G5_method, G5_method); | 805 __ ld_ptr(G3_scratch, G5_method, G5_method); |
790 } | 806 } |
791 __ ld_ptr(G5_method, methodOopDesc::from_compiled_offset(), G3_scratch); | 807 __ ld_ptr(G5_method, Method::from_compiled_offset(), G3_scratch); |
792 __ callr(G3_scratch, G0); | 808 __ callr(G3_scratch, G0); |
793 // the peephole pass fills the delay slot | 809 // the peephole pass fills the delay slot |
794 } | 810 } |
795 | 811 |
796 int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool wide, bool unaligned) { | 812 int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool wide, bool unaligned) { |
1225 jobject2reg_with_patching(to_reg->as_register(), info); | 1241 jobject2reg_with_patching(to_reg->as_register(), info); |
1226 } | 1242 } |
1227 } | 1243 } |
1228 break; | 1244 break; |
1229 | 1245 |
1246 case T_METADATA: | |
1247 { | |
1248 if (patch_code == lir_patch_none) { | |
1249 metadata2reg(c->as_metadata(), to_reg->as_register()); | |
1250 } else { | |
1251 klass2reg_with_patching(to_reg->as_register(), info); | |
1252 } | |
1253 } | |
1254 break; | |
1255 | |
1230 case T_FLOAT: | 1256 case T_FLOAT: |
1231 { | 1257 { |
1232 address const_addr = __ float_constant(c->as_jfloat()); | 1258 address const_addr = __ float_constant(c->as_jfloat()); |
1233 if (const_addr == NULL) { | 1259 if (const_addr == NULL) { |
1234 bailout("const section overflow"); | 1260 bailout("const section overflow"); |
1592 } | 1618 } |
1593 | 1619 |
1594 int start = __ offset(); | 1620 int start = __ offset(); |
1595 __ relocate(static_stub_Relocation::spec(call_pc)); | 1621 __ relocate(static_stub_Relocation::spec(call_pc)); |
1596 | 1622 |
1597 __ set_oop(NULL, G5); | 1623 __ set_metadata(NULL, G5); |
1598 // must be set to -1 at code generation time | 1624 // must be set to -1 at code generation time |
1599 AddressLiteral addrlit(-1); | 1625 AddressLiteral addrlit(-1); |
1600 __ jump_to(addrlit, G3); | 1626 __ jump_to(addrlit, G3); |
1601 __ delayed()->nop(); | 1627 __ delayed()->nop(); |
1602 | 1628 |
2049 | 2075 |
2050 __ br(Assembler::always, false, Assembler::pt, _unwind_handler_entry); | 2076 __ br(Assembler::always, false, Assembler::pt, _unwind_handler_entry); |
2051 __ delayed()->nop(); | 2077 __ delayed()->nop(); |
2052 } | 2078 } |
2053 | 2079 |
2054 | |
2055 void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) { | 2080 void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) { |
2056 Register src = op->src()->as_register(); | 2081 Register src = op->src()->as_register(); |
2057 Register dst = op->dst()->as_register(); | 2082 Register dst = op->dst()->as_register(); |
2058 Register src_pos = op->src_pos()->as_register(); | 2083 Register src_pos = op->src_pos()->as_register(); |
2059 Register dst_pos = op->dst_pos()->as_register(); | 2084 Register dst_pos = op->dst_pos()->as_register(); |
2167 | 2192 |
2168 if (flags & LIR_OpArrayCopy::type_check) { | 2193 if (flags & LIR_OpArrayCopy::type_check) { |
2169 // We don't know the array types are compatible | 2194 // We don't know the array types are compatible |
2170 if (basic_type != T_OBJECT) { | 2195 if (basic_type != T_OBJECT) { |
2171 // Simple test for basic type arrays | 2196 // Simple test for basic type arrays |
2172 if (UseCompressedOops) { | 2197 if (UseCompressedKlassPointers) { |
2173 // We don't need decode because we just need to compare | 2198 // We don't need decode because we just need to compare |
2174 __ lduw(src, oopDesc::klass_offset_in_bytes(), tmp); | 2199 __ lduw(src, oopDesc::klass_offset_in_bytes(), tmp); |
2175 __ lduw(dst, oopDesc::klass_offset_in_bytes(), tmp2); | 2200 __ lduw(dst, oopDesc::klass_offset_in_bytes(), tmp2); |
2176 __ cmp(tmp, tmp2); | 2201 __ cmp(tmp, tmp2); |
2177 __ br(Assembler::notEqual, false, Assembler::pt, *stub->entry()); | 2202 __ br(Assembler::notEqual, false, Assembler::pt, *stub->entry()); |
2300 // object array case, if no type check is needed then either the | 2325 // object array case, if no type check is needed then either the |
2301 // dst type is exactly the expected type and the src type is a | 2326 // dst type is exactly the expected type and the src type is a |
2302 // subtype which we can't check or src is the same array as dst | 2327 // subtype which we can't check or src is the same array as dst |
2303 // but not necessarily exactly of type default_type. | 2328 // but not necessarily exactly of type default_type. |
2304 Label known_ok, halt; | 2329 Label known_ok, halt; |
2305 jobject2reg(op->expected_type()->constant_encoding(), tmp); | 2330 metadata2reg(op->expected_type()->constant_encoding(), tmp); |
2306 if (UseCompressedOops) { | 2331 if (UseCompressedKlassPointers) { |
2307 // tmp holds the default type. It currently comes uncompressed after the | 2332 // tmp holds the default type. It currently comes uncompressed after the |
2308 // load of a constant, so encode it. | 2333 // load of a constant, so encode it. |
2309 __ encode_heap_oop(tmp); | 2334 __ encode_heap_oop(tmp); |
2310 // load the raw value of the dst klass, since we will be comparing | 2335 // load the raw value of the dst klass, since we will be comparing |
2311 // uncompressed values directly. | 2336 // uncompressed values directly. |
2466 op->tmp3()->as_register() == G4 && | 2491 op->tmp3()->as_register() == G4 && |
2467 op->obj()->as_register() == O0 && | 2492 op->obj()->as_register() == O0 && |
2468 op->klass()->as_register() == G5, "must be"); | 2493 op->klass()->as_register() == G5, "must be"); |
2469 if (op->init_check()) { | 2494 if (op->init_check()) { |
2470 __ ldub(op->klass()->as_register(), | 2495 __ ldub(op->klass()->as_register(), |
2471 in_bytes(instanceKlass::init_state_offset()), | 2496 in_bytes(InstanceKlass::init_state_offset()), |
2472 op->tmp1()->as_register()); | 2497 op->tmp1()->as_register()); |
2473 add_debug_info_for_null_check_here(op->stub()->info()); | 2498 add_debug_info_for_null_check_here(op->stub()->info()); |
2474 __ cmp(op->tmp1()->as_register(), instanceKlass::fully_initialized); | 2499 __ cmp(op->tmp1()->as_register(), InstanceKlass::fully_initialized); |
2475 __ br(Assembler::notEqual, false, Assembler::pn, *op->stub()->entry()); | 2500 __ br(Assembler::notEqual, false, Assembler::pn, *op->stub()->entry()); |
2476 __ delayed()->nop(); | 2501 __ delayed()->nop(); |
2477 } | 2502 } |
2478 __ allocate_object(op->obj()->as_register(), | 2503 __ allocate_object(op->obj()->as_register(), |
2479 op->tmp1()->as_register(), | 2504 op->tmp1()->as_register(), |
2596 | 2621 |
2597 Label not_null; | 2622 Label not_null; |
2598 __ br_notnull_short(obj, Assembler::pn, not_null); | 2623 __ br_notnull_short(obj, Assembler::pn, not_null); |
2599 Register mdo = k_RInfo; | 2624 Register mdo = k_RInfo; |
2600 Register data_val = Rtmp1; | 2625 Register data_val = Rtmp1; |
2601 jobject2reg(md->constant_encoding(), mdo); | 2626 metadata2reg(md->constant_encoding(), mdo); |
2602 if (mdo_offset_bias > 0) { | 2627 if (mdo_offset_bias > 0) { |
2603 __ set(mdo_offset_bias, data_val); | 2628 __ set(mdo_offset_bias, data_val); |
2604 __ add(mdo, data_val, mdo); | 2629 __ add(mdo, data_val, mdo); |
2605 } | 2630 } |
2606 Address flags_addr(mdo, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias); | 2631 Address flags_addr(mdo, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias); |
2620 Label *success_target = op->should_profile() ? &profile_cast_success : success; | 2645 Label *success_target = op->should_profile() ? &profile_cast_success : success; |
2621 | 2646 |
2622 // patching may screw with our temporaries on sparc, | 2647 // patching may screw with our temporaries on sparc, |
2623 // so let's do it before loading the class | 2648 // so let's do it before loading the class |
2624 if (k->is_loaded()) { | 2649 if (k->is_loaded()) { |
2625 jobject2reg(k->constant_encoding(), k_RInfo); | 2650 metadata2reg(k->constant_encoding(), k_RInfo); |
2626 } else { | 2651 } else { |
2627 jobject2reg_with_patching(k_RInfo, op->info_for_patch()); | 2652 klass2reg_with_patching(k_RInfo, op->info_for_patch()); |
2628 } | 2653 } |
2629 assert(obj != k_RInfo, "must be different"); | 2654 assert(obj != k_RInfo, "must be different"); |
2630 | 2655 |
2631 // get object class | 2656 // get object class |
2632 // not a safepoint as obj null check happens earlier | 2657 // not a safepoint as obj null check happens earlier |
2665 | 2690 |
2666 if (op->should_profile()) { | 2691 if (op->should_profile()) { |
2667 Register mdo = klass_RInfo, recv = k_RInfo, tmp1 = Rtmp1; | 2692 Register mdo = klass_RInfo, recv = k_RInfo, tmp1 = Rtmp1; |
2668 assert_different_registers(obj, mdo, recv, tmp1); | 2693 assert_different_registers(obj, mdo, recv, tmp1); |
2669 __ bind(profile_cast_success); | 2694 __ bind(profile_cast_success); |
2670 jobject2reg(md->constant_encoding(), mdo); | 2695 metadata2reg(md->constant_encoding(), mdo); |
2671 if (mdo_offset_bias > 0) { | 2696 if (mdo_offset_bias > 0) { |
2672 __ set(mdo_offset_bias, tmp1); | 2697 __ set(mdo_offset_bias, tmp1); |
2673 __ add(mdo, tmp1, mdo); | 2698 __ add(mdo, tmp1, mdo); |
2674 } | 2699 } |
2675 __ load_klass(obj, recv); | 2700 __ load_klass(obj, recv); |
2677 // Jump over the failure case | 2702 // Jump over the failure case |
2678 __ ba(*success); | 2703 __ ba(*success); |
2679 __ delayed()->nop(); | 2704 __ delayed()->nop(); |
2680 // Cast failure case | 2705 // Cast failure case |
2681 __ bind(profile_cast_failure); | 2706 __ bind(profile_cast_failure); |
2682 jobject2reg(md->constant_encoding(), mdo); | 2707 metadata2reg(md->constant_encoding(), mdo); |
2683 if (mdo_offset_bias > 0) { | 2708 if (mdo_offset_bias > 0) { |
2684 __ set(mdo_offset_bias, tmp1); | 2709 __ set(mdo_offset_bias, tmp1); |
2685 __ add(mdo, tmp1, mdo); | 2710 __ add(mdo, tmp1, mdo); |
2686 } | 2711 } |
2687 Address data_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); | 2712 Address data_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); |
2722 if (op->should_profile()) { | 2747 if (op->should_profile()) { |
2723 Label not_null; | 2748 Label not_null; |
2724 __ br_notnull_short(value, Assembler::pn, not_null); | 2749 __ br_notnull_short(value, Assembler::pn, not_null); |
2725 Register mdo = k_RInfo; | 2750 Register mdo = k_RInfo; |
2726 Register data_val = Rtmp1; | 2751 Register data_val = Rtmp1; |
2727 jobject2reg(md->constant_encoding(), mdo); | 2752 metadata2reg(md->constant_encoding(), mdo); |
2728 if (mdo_offset_bias > 0) { | 2753 if (mdo_offset_bias > 0) { |
2729 __ set(mdo_offset_bias, data_val); | 2754 __ set(mdo_offset_bias, data_val); |
2730 __ add(mdo, data_val, mdo); | 2755 __ add(mdo, data_val, mdo); |
2731 } | 2756 } |
2732 Address flags_addr(mdo, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias); | 2757 Address flags_addr(mdo, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias); |
2758 | 2783 |
2759 if (op->should_profile()) { | 2784 if (op->should_profile()) { |
2760 Register mdo = klass_RInfo, recv = k_RInfo, tmp1 = Rtmp1; | 2785 Register mdo = klass_RInfo, recv = k_RInfo, tmp1 = Rtmp1; |
2761 assert_different_registers(value, mdo, recv, tmp1); | 2786 assert_different_registers(value, mdo, recv, tmp1); |
2762 __ bind(profile_cast_success); | 2787 __ bind(profile_cast_success); |
2763 jobject2reg(md->constant_encoding(), mdo); | 2788 metadata2reg(md->constant_encoding(), mdo); |
2764 if (mdo_offset_bias > 0) { | 2789 if (mdo_offset_bias > 0) { |
2765 __ set(mdo_offset_bias, tmp1); | 2790 __ set(mdo_offset_bias, tmp1); |
2766 __ add(mdo, tmp1, mdo); | 2791 __ add(mdo, tmp1, mdo); |
2767 } | 2792 } |
2768 __ load_klass(value, recv); | 2793 __ load_klass(value, recv); |
2769 type_profile_helper(mdo, mdo_offset_bias, md, data, recv, tmp1, &done); | 2794 type_profile_helper(mdo, mdo_offset_bias, md, data, recv, tmp1, &done); |
2770 __ ba_short(done); | 2795 __ ba_short(done); |
2771 // Cast failure case | 2796 // Cast failure case |
2772 __ bind(profile_cast_failure); | 2797 __ bind(profile_cast_failure); |
2773 jobject2reg(md->constant_encoding(), mdo); | 2798 metadata2reg(md->constant_encoding(), mdo); |
2774 if (mdo_offset_bias > 0) { | 2799 if (mdo_offset_bias > 0) { |
2775 __ set(mdo_offset_bias, tmp1); | 2800 __ set(mdo_offset_bias, tmp1); |
2776 __ add(mdo, tmp1, mdo); | 2801 __ add(mdo, tmp1, mdo); |
2777 } | 2802 } |
2778 Address data_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); | 2803 Address data_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); |
2970 Register tmp1 = op->tmp1()->as_register_lo(); | 2995 Register tmp1 = op->tmp1()->as_register_lo(); |
2971 #else | 2996 #else |
2972 assert(op->tmp1()->is_single_cpu(), "tmp1 must be allocated"); | 2997 assert(op->tmp1()->is_single_cpu(), "tmp1 must be allocated"); |
2973 Register tmp1 = op->tmp1()->as_register(); | 2998 Register tmp1 = op->tmp1()->as_register(); |
2974 #endif | 2999 #endif |
2975 jobject2reg(md->constant_encoding(), mdo); | 3000 metadata2reg(md->constant_encoding(), mdo); |
2976 int mdo_offset_bias = 0; | 3001 int mdo_offset_bias = 0; |
2977 if (!Assembler::is_simm13(md->byte_offset_of_slot(data, CounterData::count_offset()) + | 3002 if (!Assembler::is_simm13(md->byte_offset_of_slot(data, CounterData::count_offset()) + |
2978 data->size_in_bytes())) { | 3003 data->size_in_bytes())) { |
2979 // The offset is large so bias the mdo by the base of the slot so | 3004 // The offset is large so bias the mdo by the base of the slot so |
2980 // that the ld can use simm13s to reference the slots of the data | 3005 // that the ld can use simm13s to reference the slots of the data |
2996 assert_different_registers(mdo, tmp1, recv); | 3021 assert_different_registers(mdo, tmp1, recv); |
2997 assert(data->is_VirtualCallData(), "need VirtualCallData for virtual calls"); | 3022 assert(data->is_VirtualCallData(), "need VirtualCallData for virtual calls"); |
2998 ciKlass* known_klass = op->known_holder(); | 3023 ciKlass* known_klass = op->known_holder(); |
2999 if (C1OptimizeVirtualCallProfiling && known_klass != NULL) { | 3024 if (C1OptimizeVirtualCallProfiling && known_klass != NULL) { |
3000 // We know the type that will be seen at this call site; we can | 3025 // We know the type that will be seen at this call site; we can |
3001 // statically update the methodDataOop rather than needing to do | 3026 // statically update the MethodData* rather than needing to do |
3002 // dynamic tests on the receiver type | 3027 // dynamic tests on the receiver type |
3003 | 3028 |
3004 // NOTE: we should probably put a lock around this search to | 3029 // NOTE: we should probably put a lock around this search to |
3005 // avoid collisions by concurrent compilations | 3030 // avoid collisions by concurrent compilations |
3006 ciVirtualCallData* vc_data = (ciVirtualCallData*) data; | 3031 ciVirtualCallData* vc_data = (ciVirtualCallData*) data; |
3026 for (i = 0; i < VirtualCallData::row_limit(); i++) { | 3051 for (i = 0; i < VirtualCallData::row_limit(); i++) { |
3027 ciKlass* receiver = vc_data->receiver(i); | 3052 ciKlass* receiver = vc_data->receiver(i); |
3028 if (receiver == NULL) { | 3053 if (receiver == NULL) { |
3029 Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - | 3054 Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - |
3030 mdo_offset_bias); | 3055 mdo_offset_bias); |
3031 jobject2reg(known_klass->constant_encoding(), tmp1); | 3056 metadata2reg(known_klass->constant_encoding(), tmp1); |
3032 __ st_ptr(tmp1, recv_addr); | 3057 __ st_ptr(tmp1, recv_addr); |
3033 Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - | 3058 Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - |
3034 mdo_offset_bias); | 3059 mdo_offset_bias); |
3035 __ ld_ptr(data_addr, tmp1); | 3060 __ ld_ptr(data_addr, tmp1); |
3036 __ add(tmp1, DataLayout::counter_increment, tmp1); | 3061 __ add(tmp1, DataLayout::counter_increment, tmp1); |