< prev index next >
src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp
Print this page
@@ -273,47 +273,67 @@
}
void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
+ bool in_heap = (decorators & IN_HEAP) != 0;
+ bool as_normal = (decorators & AS_NORMAL) != 0;
+ assert((decorators & IS_DEST_UNINITIALIZED) == 0, "unsupported");
+
+ bool needs_pre_barrier = as_normal;
+ bool needs_post_barrier = (val != noreg && in_heap);
+
+
if (tmp3 == noreg) {
- tmp3 = r8;
+ tmp3 = rscratch2;
}
+ // assert_different_registers(val, tmp1, tmp2, tmp3, rscratch1, rscratch2);
+ assert_different_registers(val, tmp1, tmp2, tmp3);
// flatten object address if needed
if (dst.index() == noreg && dst.offset() == 0) {
- if (dst.base() != r3) {
- __ mov(r3, dst.base());
+ if (dst.base() != tmp1) {
+ __ mov(tmp1, dst.base());
}
} else {
- __ lea(r3, dst);
+ __ lea(tmp1, dst);
}
+
+ if (needs_pre_barrier) {
g1_write_barrier_pre(masm,
- r3 /* obj */,
+ tmp1 /* obj */,
tmp2 /* pre_val */,
rthread /* thread */,
- tmp1 /* tmp */,
+ tmp3 /* tmp */,
val != noreg /* tosca_live */,
false /* expand_call */);
+ }
if (val == noreg) {
- BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), noreg, noreg, noreg, noreg);
+ BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), noreg, noreg, noreg, noreg);
} else {
// G1 barrier needs uncompressed oop for region cross check.
Register new_val = val;
+ if (needs_post_barrier) {
if (UseCompressedOops) {
- new_val = rscratch2;
+ // FIXME: Refactor the code to avoid usage of r19 and stay within tmpX
+ new_val = r19;
__ mov(new_val, val);
}
- BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), val, noreg, noreg, noreg);
+ }
+
+ BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), val, noreg, noreg, noreg);
+
+ if (needs_post_barrier) {
g1_write_barrier_post(masm,
- r3 /* store_adr */,
+ tmp1 /* store_adr */,
new_val /* new_val */,
rthread /* thread */,
- tmp1 /* tmp */,
- tmp2 /* tmp2 */);
+ tmp2 /* tmp */,
+ tmp3 /* tmp2 */);
+ }
}
}
#ifdef COMPILER1
< prev index next >