< prev index next >
src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp
Print this page
rev 58025 : Shenandoah: C1: Resolve into registers of correct type
*** 116,133 ****
}
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);
assert(obj->is_register(), "must be a register at this point");
! addr = ensure_in_register(gen, addr);
assert(addr->is_register(), "must be a register at this point");
LIR_Opr result = gen->result_register_for(obj->value_type());
__ move(obj, result);
! LIR_Opr tmp1 = gen->new_register(T_OBJECT);
! LIR_Opr tmp2 = gen->new_register(T_OBJECT);
LIR_Opr thrd = gen->getThreadPointer();
LIR_Address* active_flag_addr =
new LIR_Address(thrd,
in_bytes(ShenandoahThreadLocalData::gc_state_offset()),
--- 116,133 ----
}
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);
assert(addr->is_register(), "must be a register at this point");
LIR_Opr result = gen->result_register_for(obj->value_type());
__ move(obj, result);
! LIR_Opr tmp1 = gen->new_register(T_ADDRESS);
! LIR_Opr tmp2 = gen->new_register(T_ADDRESS);
LIR_Opr thrd = gen->getThreadPointer();
LIR_Address* active_flag_addr =
new LIR_Address(thrd,
in_bytes(ShenandoahThreadLocalData::gc_state_offset()),
*** 155,188 ****
__ branch_destination(slow->continuation());
return result;
}
! LIR_Opr ShenandoahBarrierSetC1::ensure_in_register(LIRGenerator* gen, LIR_Opr obj) {
if (!obj->is_register()) {
LIR_Opr obj_reg;
if (obj->is_constant()) {
! obj_reg = gen->new_register(T_OBJECT);
__ move(obj, obj_reg);
} else {
- #ifdef AARCH64
- // AArch64 expects double-size register.
obj_reg = gen->new_pointer_register();
- #else
- // x86 expects single-size register.
- obj_reg = gen->new_register(T_OBJECT);
- #endif
__ leal(obj, obj_reg);
}
obj = obj_reg;
}
return obj;
}
LIR_Opr ShenandoahBarrierSetC1::storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators) {
if (ShenandoahStoreValEnqueueBarrier) {
! obj = ensure_in_register(gen, obj);
pre_barrier(gen, info, decorators, LIR_OprFact::illegalOpr, obj);
}
return obj;
}
--- 155,182 ----
__ branch_destination(slow->continuation());
return result;
}
! LIR_Opr ShenandoahBarrierSetC1::ensure_in_register(LIRGenerator* gen, LIR_Opr obj, BasicType type) {
if (!obj->is_register()) {
LIR_Opr obj_reg;
if (obj->is_constant()) {
! obj_reg = gen->new_register(type);
__ move(obj, obj_reg);
} else {
obj_reg = gen->new_pointer_register();
__ leal(obj, obj_reg);
}
obj = obj_reg;
}
return obj;
}
LIR_Opr ShenandoahBarrierSetC1::storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators) {
if (ShenandoahStoreValEnqueueBarrier) {
! obj = ensure_in_register(gen, obj, T_OBJECT);
pre_barrier(gen, info, decorators, LIR_OprFact::illegalOpr, obj);
}
return obj;
}
*** 219,229 ****
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);
args->append(result);
args->append(addr);
BasicTypeList signature;
signature.append(T_OBJECT);
signature.append(T_ADDRESS);
--- 213,223 ----
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);
< prev index next >