31
31
// mv a0,a4
32
32
// tail _Z32object_reference_write_slow_callPvS_m
33
33
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");
37
37
// 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 );
68
72
69
- // __ bind(done);
70
- // #else
71
- // __ push_reg(c_rarg0, obj);
73
+ __ bind (done);
74
+ #else
72
75
__ 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);
75
78
__ 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
+ }
79
83
}
80
84
81
85
void MMTkObjectBarrierSetAssembler::arraycopy_epilogue (MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
82
86
Register src, Register dst, Register count, Register tmp, RegSet saved_regs) {
83
87
// see also void G1BarrierSetAssembler::gen_write_ref_array_post_barrier
84
- // assert_different_registers(src, dst, count);
88
+ assert_different_registers (src, dst, count);
85
89
// const bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
86
90
// 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
+ }
92
97
}
93
98
94
99
#undef __
0 commit comments