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");
37
- if (can_remove_barrier (decorators, val, /* skip_const_null */ true )) return ;
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
+ // if (can_remove_barrier(decorators, val, /* skip_const_null */ true)) return;
38
38
Register obj = dst.base ();
39
39
assert (obj->is_valid (), " dst must be an offset from a base register" );
40
40
RegSet saved = RegSet::of (obj); // see void G1BarrierSetAssembler::g1_write_barrier_post
41
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 );
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);
68
68
69
- __ bind (done);
70
- #else
71
- __ mv (c_rarg0, obj);
72
- __ la (c_rarg1, dst);
73
- __ mv (c_rarg2, val == noreg ? zr : val);
74
- __ call_VM_leaf_base (FN_ADDR (MMTkBarrierSetRuntime::object_reference_write_post_call), 3 );
75
- #endif
69
+ // __ bind(done);
70
+ // #else
71
+ // __ push_reg(c_rarg0, obj);
72
+ // // __ mv(c_rarg0, obj);
73
+ // // //__ la(c_rarg1, dst);
74
+ // // //__ mv(c_rarg2, val == noreg ? zr : val);
75
+ // // __ call_VM_leaf_base(FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_post_call), 3);
76
+ // __ pop_reg(c_rarg0, obj);
77
+ // #endif
76
78
__ pop_reg (saved, sp);
77
79
}
78
80
79
81
void MMTkObjectBarrierSetAssembler::arraycopy_epilogue (MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
80
82
Register src, Register dst, Register count, Register tmp, RegSet saved_regs) {
81
83
// see also void G1BarrierSetAssembler::gen_write_ref_array_post_barrier
82
- assert_different_registers (src, dst, count);
83
- const bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0 ;
84
- if (is_oop && !dest_uninitialized) {
85
- // in address generate_checkcast_copy, caller tells us to save count
86
- __ push_reg (saved_regs, sp);
87
- __ call_VM_leaf (FN_ADDR (MMTkBarrierSetRuntime::object_reference_array_copy_post_call), src, dst, count);
88
- __ pop_reg (saved_regs, sp);
89
- }
84
+ // assert_different_registers(src, dst, count);
85
+ // const bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
86
+ // 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
+ // }
90
92
}
91
93
92
94
#undef __
0 commit comments