< prev index next >
src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp
Print this page
rev 58062 : 8239081: Shenandoah: Consolidate C1 LRB and native barriers
*** 105,123 ****
__ branch(lir_cond_notEqual, T_INT, slow);
__ branch_destination(slow->continuation());
}
! LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr) {
if (ShenandoahLoadRefBarrier) {
! return load_reference_barrier_impl(gen, obj, addr);
} else {
return obj;
}
}
! LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr) {
assert(ShenandoahLoadRefBarrier, "Should be enabled");
obj = ensure_in_register(gen, obj, T_OBJECT);
assert(obj->is_register(), "must be a register at this point");
addr = ensure_in_register(gen, addr, T_ADDRESS);
--- 105,123 ----
__ branch(lir_cond_notEqual, T_INT, slow);
__ branch_destination(slow->continuation());
}
! LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr, bool is_native) {
if (ShenandoahLoadRefBarrier) {
! return load_reference_barrier_impl(gen, obj, addr, is_native);
} else {
return obj;
}
}
! LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr, bool is_native) {
assert(ShenandoahLoadRefBarrier, "Should be enabled");
obj = ensure_in_register(gen, obj, T_OBJECT);
assert(obj->is_register(), "must be a register at this point");
addr = ensure_in_register(gen, addr, T_ADDRESS);
*** 148,158 ****
__ logical_and(flag_val, mask_reg, masked_flag);
flag_val = masked_flag;
}
__ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));
! CodeStub* slow = new ShenandoahLoadReferenceBarrierStub(obj, addr, result, tmp1, tmp2);
__ branch(lir_cond_notEqual, T_INT, slow);
__ branch_destination(slow->continuation());
return result;
}
--- 148,158 ----
__ logical_and(flag_val, mask_reg, masked_flag);
flag_val = masked_flag;
}
__ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));
! CodeStub* slow = new ShenandoahLoadReferenceBarrierStub(obj, addr, result, tmp1, tmp2, is_native);
__ branch(lir_cond_notEqual, T_INT, slow);
__ branch_destination(slow->continuation());
return result;
}
*** 209,238 ****
DecoratorSet decorators = access.decorators();
BasicType type = access.type();
// 2: load a reference from src location and apply LRB if ShenandoahLoadRefBarrier is set
if (ShenandoahBarrierSet::need_load_reference_barrier(decorators, type)) {
- if (ShenandoahBarrierSet::use_load_reference_barrier_native(decorators, type)) {
- BarrierSetC1::load_at_resolved(access, result);
- LIR_OprList* args = new LIR_OprList();
- LIR_Opr addr = access.resolved_addr();
- addr = ensure_in_register(gen, addr, T_ADDRESS);
- args->append(result);
- args->append(addr);
- BasicTypeList signature;
- signature.append(T_OBJECT);
- signature.append(T_ADDRESS);
- LIR_Opr call_result = gen->call_runtime(&signature, args,
- CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native),
- objectType, NULL);
- __ move(call_result, result);
- } else {
LIR_Opr tmp = gen->new_register(T_OBJECT);
BarrierSetC1::load_at_resolved(access, tmp);
! tmp = load_reference_barrier(gen, tmp, access.resolved_addr());
__ move(tmp, result);
- }
} else {
BarrierSetC1::load_at_resolved(access, result);
}
// 3: apply keep-alive barrier if ShenandoahKeepAliveBarrier is set
--- 209,223 ----
DecoratorSet decorators = access.decorators();
BasicType type = access.type();
// 2: load a reference from src location and apply LRB if ShenandoahLoadRefBarrier is set
if (ShenandoahBarrierSet::need_load_reference_barrier(decorators, type)) {
LIR_Opr tmp = gen->new_register(T_OBJECT);
BarrierSetC1::load_at_resolved(access, tmp);
! bool native = ShenandoahBarrierSet::use_load_reference_barrier_native(decorators, type);
! tmp = load_reference_barrier(gen, tmp, access.resolved_addr(), native);
__ move(tmp, result);
} else {
BarrierSetC1::load_at_resolved(access, result);
}
// 3: apply keep-alive barrier if ShenandoahKeepAliveBarrier is set
*** 266,296 ****
return NULL;
}
};
class C1ShenandoahLoadReferenceBarrierCodeGenClosure : public StubAssemblerCodeGenClosure {
virtual OopMapSet* generate_code(StubAssembler* sasm) {
ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
! bs->generate_c1_load_reference_barrier_runtime_stub(sasm);
return NULL;
}
};
void ShenandoahBarrierSetC1::generate_c1_runtime_stubs(BufferBlob* buffer_blob) {
C1ShenandoahPreBarrierCodeGenClosure pre_code_gen_cl;
_pre_barrier_c1_runtime_code_blob = Runtime1::generate_blob(buffer_blob, -1,
"shenandoah_pre_barrier_slow",
false, &pre_code_gen_cl);
if (ShenandoahLoadRefBarrier) {
! C1ShenandoahLoadReferenceBarrierCodeGenClosure lrb_code_gen_cl;
_load_reference_barrier_rt_code_blob = Runtime1::generate_blob(buffer_blob, -1,
"shenandoah_load_reference_barrier_slow",
false, &lrb_code_gen_cl);
- }
- }
! const char* ShenandoahBarrierSetC1::rtcall_name_for_address(address entry) {
! if (entry == CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native)) {
! return "ShenandoahRuntime::load_reference_barrier_native";
}
- return NULL;
}
--- 251,285 ----
return NULL;
}
};
class C1ShenandoahLoadReferenceBarrierCodeGenClosure : public StubAssemblerCodeGenClosure {
+ private:
+ const bool _native;
+
+ public:
+ C1ShenandoahLoadReferenceBarrierCodeGenClosure(bool is_native) : _native(is_native) {}
+
virtual OopMapSet* generate_code(StubAssembler* sasm) {
ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
! bs->generate_c1_load_reference_barrier_runtime_stub(sasm, _native);
return NULL;
}
};
void ShenandoahBarrierSetC1::generate_c1_runtime_stubs(BufferBlob* buffer_blob) {
C1ShenandoahPreBarrierCodeGenClosure pre_code_gen_cl;
_pre_barrier_c1_runtime_code_blob = Runtime1::generate_blob(buffer_blob, -1,
"shenandoah_pre_barrier_slow",
false, &pre_code_gen_cl);
if (ShenandoahLoadRefBarrier) {
! C1ShenandoahLoadReferenceBarrierCodeGenClosure lrb_code_gen_cl(false);
_load_reference_barrier_rt_code_blob = Runtime1::generate_blob(buffer_blob, -1,
"shenandoah_load_reference_barrier_slow",
false, &lrb_code_gen_cl);
! C1ShenandoahLoadReferenceBarrierCodeGenClosure lrb_native_code_gen_cl(true);
! _load_reference_barrier_native_rt_code_blob = Runtime1::generate_blob(buffer_blob, -1,
! "shenandoah_load_reference_barrier_native_slow",
! false, &lrb_native_code_gen_cl);
}
}
< prev index next >