< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page
rev 50076 : Fold Partial GC into Traversal GC

*** 1648,1695 **** __ branch_destination(slow->continuation()); } void LIRGenerator::Shenandoah_pre_barrier(LIR_Opr addr_opr, LIR_Opr pre_val, bool do_load, bool patch, CodeEmitInfo* info) { - if (ShenandoahConditionalSATBBarrier) { - LIR_Opr gc_state_addr = new_pointer_register(); - __ move(LIR_OprFact::intptrConst((intptr_t) ShenandoahHeap::gc_state_addr()), gc_state_addr); - LIR_Opr gc_state = new_register(T_INT); - __ move(new LIR_Address(gc_state_addr, T_BYTE), gc_state); - __ logical_and(gc_state, LIR_OprFact::intConst(ShenandoahHeap::MARKING), gc_state); - __ cmp(lir_cond_equal, gc_state, LIR_OprFact::intConst(0)); - - LIR_PatchCode pre_val_patch_code = lir_patch_none; - - CodeStub* slow; - - if (do_load) { - assert(pre_val == LIR_OprFact::illegalOpr, "sanity"); - assert(addr_opr != LIR_OprFact::illegalOpr, "sanity"); - - if (patch) - pre_val_patch_code = lir_patch_normal; - - pre_val = new_register(T_OBJECT); - - if (!addr_opr->is_address()) { - assert(addr_opr->is_register(), "must be"); - addr_opr = LIR_OprFact::address(new LIR_Address(addr_opr, T_OBJECT)); - } - slow = new G1PreBarrierStub(addr_opr, pre_val, pre_val_patch_code, info); - } else { - assert(addr_opr == LIR_OprFact::illegalOpr, "sanity"); - assert(pre_val->is_register(), "must be"); - assert(pre_val->type() == T_OBJECT, "must be an object"); - assert(info == NULL, "sanity"); - - slow = new G1PreBarrierStub(pre_val); - } - - __ branch(lir_cond_notEqual, T_CHAR, slow); - __ branch_destination(slow->continuation()); - } if (ShenandoahSATBBarrier) { G1BarrierSet_pre_barrier(addr_opr, pre_val, do_load, patch, info); } } --- 1648,1657 ----
*** 2075,2102 **** return obj; } } LIR_Opr LIRGenerator::shenandoah_write_barrier_impl(LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) { ! assert(UseShenandoahGC && (ShenandoahWriteBarrier || ShenandoahStoreValWriteBarrier || ShenandoahStoreValEnqueueBarrier), "Should be enabled"); LIR_Opr result = new_register(T_OBJECT); __ shenandoah_wb(obj, result, info ? new CodeEmitInfo(info) : NULL, need_null_check); return result; } LIR_Opr LIRGenerator::shenandoah_storeval_barrier(LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) { if (UseShenandoahGC) { ! if (ShenandoahStoreValWriteBarrier || ShenandoahStoreValEnqueueBarrier) { // TODO: Maybe we can simply avoid this stuff on constants? if (! obj->is_register()) { LIR_Opr result = new_register(T_OBJECT); __ move(obj, result); obj = result; } obj = shenandoah_write_barrier_impl(obj, info, need_null_check); - } - if (ShenandoahStoreValEnqueueBarrier) { G1BarrierSet_pre_barrier(LIR_OprFact::illegalOpr, obj, false, false, NULL); } if (ShenandoahStoreValReadBarrier) { obj = shenandoah_read_barrier_impl(obj, info, need_null_check); } --- 2037,2062 ---- return obj; } } LIR_Opr LIRGenerator::shenandoah_write_barrier_impl(LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) { ! assert(UseShenandoahGC && (ShenandoahWriteBarrier || ShenandoahStoreValEnqueueBarrier), "Should be enabled"); LIR_Opr result = new_register(T_OBJECT); __ shenandoah_wb(obj, result, info ? new CodeEmitInfo(info) : NULL, need_null_check); return result; } LIR_Opr LIRGenerator::shenandoah_storeval_barrier(LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) { if (UseShenandoahGC) { ! if (ShenandoahStoreValEnqueueBarrier) { // TODO: Maybe we can simply avoid this stuff on constants? if (! obj->is_register()) { LIR_Opr result = new_register(T_OBJECT); __ move(obj, result); obj = result; } obj = shenandoah_write_barrier_impl(obj, info, need_null_check); G1BarrierSet_pre_barrier(LIR_OprFact::illegalOpr, obj, false, false, NULL); } if (ShenandoahStoreValReadBarrier) { obj = shenandoah_read_barrier_impl(obj, info, need_null_check); }
< prev index next >