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);