Skip to content

Commit 05ce800

Browse files
committed
No barrier fast path but with slow path call (only pass the first argument)
fop working with interpreter with no mmtk-core change MMTK_PLAN=GenCopy /mnt/jdk/build/linux-riscv64-server-slowdebug/jdk/bin/java -XX:+UseThirdPartyHeap -XX:MetaspaceSize=1G -XX:+UnlockDiagnosticVMOptions -Xint -Xmx60M -Xms60M -jar /mnt/dacapo/dacapo-evaluation-git-f480064.jar fop
1 parent f164ca3 commit 05ce800

File tree

3 files changed

+54
-49
lines changed

3 files changed

+54
-49
lines changed

mmtk/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ lto = true
1717
[package.metadata.openjdk]
1818
# Our CI matches the following line and extract mmtk/openjdk. If this line is updated, please check ci yaml files and make sure it works.
1919
openjdk_repo = "https://github.com/caizixian/jdk-mmtk.git"
20-
openjdk_version = "118483bfe38ddc716272cc92461dfbefdffb7047"
20+
openjdk_version = "e6c607ee6cae86a54cb5f061ddbd29585a517fe0"
2121

2222
[dependencies]
2323
libc = "0.2"

openjdk/cpu/riscv/mmtkBarrierSetAssembler_riscv.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ void MMTkBarrierSetAssembler::generate_c1_write_barrier_runtime_stub(StubAssembl
146146

147147
// void C1_MacroAssembler::load_parameter(int offset_in_words, Register reg)
148148
// ld(reg, Address(fp, offset_in_words * BytesPerWord));
149-
// ra is free to use here, because calll prologue/epilogue handles it
149+
// ra is free to use here, because call prologue/epilogue handles it
150150
const Register src = t0;
151151
const Register slot = t1;
152152
const Register new_val = ra;

openjdk/cpu/riscv/mmtkObjectBarrierSetAssembler_riscv.cpp

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -31,64 +31,69 @@
3131
// mv a0,a4
3232
// tail _Z32object_reference_write_slow_callPvS_m
3333
void MMTkObjectBarrierSetAssembler::object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2) const {
34-
// // tmp1 and tmp2 is from MacroAssembler::access_store_at
35-
// // For do_oop_store, we have three tmps, x28/t3, x29/t4, x13/a3
36-
// // printf("object_reference_write_post\n");
34+
// tmp1 and tmp2 is from MacroAssembler::access_store_at
35+
// For do_oop_store, we have three tmps, x28/t3, x29/t4, x13/a3
36+
// printf("object_reference_write_post\n");
3737
// if (can_remove_barrier(decorators, val, /* skip_const_null */ true)) return;
38-
Register obj = dst.base();
39-
assert(obj->is_valid(), "dst must be an offset from a base register");
40-
RegSet saved = RegSet::of(obj); // see void G1BarrierSetAssembler::g1_write_barrier_post
41-
__ push_reg(saved, sp);
42-
// #if MMTK_ENABLE_BARRIER_FASTPATH
43-
// Label done;
44-
// assert_different_registers(obj, tmp1, tmp2);
45-
// assert_different_registers(val, tmp1, tmp2);
46-
// assert(tmp1->is_valid(), "need temp reg");
47-
// assert(tmp2->is_valid(), "need temp reg");
48-
// // tmp1 = load-byte (SIDE_METADATA_BASE_ADDRESS + (obj >> 6));
49-
// __ mv(tmp1, obj);
50-
// __ srli(tmp1, tmp1, 6); // tmp1 = obj >> 6;
51-
// __ li(tmp2, SIDE_METADATA_BASE_ADDRESS);
52-
// __ add(tmp1, tmp1, tmp2); // tmp1 = SIDE_METADATA_BASE_ADDRESS + (obj >> 6);
53-
// __ lbu(tmp1, Address(tmp1, 0));
54-
// // tmp2 = (obj >> 3) & 7
55-
// __ mv(tmp2, obj);
56-
// __ srli(tmp2, tmp2, 3);
57-
// __ andi(tmp2, tmp2, 7);
58-
// // tmp1 = tmp1 >> tmp2
59-
// __ sraw(tmp1, tmp1, tmp2);
60-
// // if ((tmp1 & 1) == 1) fall through to slowpath;
61-
// __ andi(tmp1, tmp1, 1);
62-
// __ bnez(tmp1, done); // (tmp1 & 1) == 1 is equivalent to (tmp1 & 1) != 0
63-
// // setup calling convention
64-
// __ mv(c_rarg0, obj);
65-
// __ la(c_rarg1, dst);
66-
// __ mv(c_rarg2, val == noreg ? zr : val);
67-
// __ call_VM_leaf_base(FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_slow_call), 3);
38+
Register obj = dst._obj_start;
39+
assert(obj->is_valid(), "RISC-V template interpreter originally passes the slot instead of the object reference. MMTk barriers require the object reference.");
40+
// see void G1BarrierSetAssembler::g1_write_barrier_post
41+
// the slot is still alive after the post barrier
42+
if (dst.base()->is_valid()) {
43+
__ push_reg(dst.base());
44+
}
45+
46+
#if MMTK_ENABLE_BARRIER_FASTPATH
47+
Label done;
48+
assert_different_registers(obj, tmp1, tmp2);
49+
assert_different_registers(val, tmp1, tmp2);
50+
assert(tmp1->is_valid(), "need temp reg");
51+
assert(tmp2->is_valid(), "need temp reg");
52+
// tmp1 = load-byte (SIDE_METADATA_BASE_ADDRESS + (obj >> 6));
53+
__ mv(tmp1, obj);
54+
__ srli(tmp1, tmp1, 6); // tmp1 = obj >> 6;
55+
__ li(tmp2, SIDE_METADATA_BASE_ADDRESS);
56+
__ add(tmp1, tmp1, tmp2); // tmp1 = SIDE_METADATA_BASE_ADDRESS + (obj >> 6);
57+
__ lbu(tmp1, Address(tmp1, 0));
58+
// tmp2 = (obj >> 3) & 7
59+
__ mv(tmp2, obj);
60+
__ srli(tmp2, tmp2, 3);
61+
__ andi(tmp2, tmp2, 7);
62+
// tmp1 = tmp1 >> tmp2
63+
__ sraw(tmp1, tmp1, tmp2);
64+
// if ((tmp1 & 1) == 1) fall through to slowpath;
65+
__ andi(tmp1, tmp1, 1);
66+
__ bnez(tmp1, done); // (tmp1 & 1) == 1 is equivalent to (tmp1 & 1) != 0
67+
// setup calling convention
68+
__ mv(c_rarg0, obj);
69+
__ la(c_rarg1, dst);
70+
__ mv(c_rarg2, val == noreg ? zr : val);
71+
__ call_VM_leaf_base(FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_slow_call), 3);
6872

69-
// __ bind(done);
70-
// #else
71-
// __ push_reg(c_rarg0, obj);
73+
__ bind(done);
74+
#else
7275
__ mv(c_rarg0, obj);
73-
// // //__ la(c_rarg1, dst);
74-
// // //__ mv(c_rarg2, val == noreg ? zr : val);
76+
// __ la(c_rarg1, dst);
77+
// __ mv(c_rarg2, val == noreg ? zr : val);
7578
__ call_VM_leaf_base(FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_post_call), 3);
76-
// __ pop_reg(c_rarg0, obj);
77-
// #endif
78-
__ pop_reg(saved, sp);
79+
#endif
80+
if (dst.base()->is_valid()) {
81+
__ pop_reg(dst.base());
82+
}
7983
}
8084

8185
void MMTkObjectBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
8286
Register src, Register dst, Register count, Register tmp, RegSet saved_regs) {
8387
// see also void G1BarrierSetAssembler::gen_write_ref_array_post_barrier
84-
// assert_different_registers(src, dst, count);
88+
assert_different_registers(src, dst, count);
8589
// const bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
8690
// if (is_oop && !dest_uninitialized) {
87-
// // in address generate_checkcast_copy, caller tells us to save count
88-
// __ push_reg(saved_regs, sp);
89-
// __ call_VM_leaf(FN_ADDR(MMTkBarrierSetRuntime::object_reference_array_copy_post_call), src, dst, count);
90-
// __ pop_reg(saved_regs, sp);
91-
// }
91+
if (is_oop) {
92+
// in address generate_checkcast_copy, caller tells us to save count
93+
__ push_reg(saved_regs, sp);
94+
__ call_VM_leaf(FN_ADDR(MMTkBarrierSetRuntime::object_reference_array_copy_post_call), zr, dst, count);
95+
__ pop_reg(saved_regs, sp);
96+
}
9297
}
9398

9499
#undef __

0 commit comments

Comments
 (0)