2
2
#include " mmtkObjectBarrier.hpp"
3
3
#include " runtime/interfaceSupport.inline.hpp"
4
4
5
- void MMTkObjectBarrierSetRuntime::record_modified_node_slow (void * obj) {
6
- ::post_write_barrier_slow ((MMTk_Mutator) &Thread::current()->third_party_heap_mutator, (void *) obj);
7
- }
8
-
9
- void MMTkObjectBarrierSetRuntime::record_modified_node_full (void * obj) {
10
- ::post_write_barrier ((MMTk_Mutator) &Thread::current()->third_party_heap_mutator, (void *) obj);
11
- }
12
-
13
- void MMTkObjectBarrierSetRuntime::record_modified_node (oop src) {
14
- #if MMTK_ENABLE_OBJECT_BARRIER_FASTPATH
5
+ void MMTkObjectBarrierSetRuntime::object_reference_write_post (oop src, oop* slot, oop target) const {
6
+ #if MMTK_ENABLE_BARRIER_FASTPATH
15
7
intptr_t addr = (intptr_t ) (void *) src;
16
8
uint8_t * meta_addr = (uint8_t *) (SIDE_METADATA_BASE_ADDRESS + (addr >> 6 ));
17
9
intptr_t shift = (addr >> 3 ) & 0b111 ;
18
10
uint8_t byte_val = *meta_addr;
19
11
if (((byte_val >> shift) & 1 ) == 1 ) {
20
- record_modified_node_slow ((void *) src);
12
+ // MMTkObjectBarrierSetRuntime::object_reference_write_pre_slow()((void*) src);
13
+ object_reference_write_slow_call ((void *) src, (void *) slot, (void *) target);
21
14
}
22
15
#else
23
- record_modified_node_full ((void *) src);
16
+ object_reference_write_post_call ((void *) src, ( void *) slot, ( void *) target );
24
17
#endif
25
18
}
26
19
27
20
#define __ masm->
28
21
29
- void MMTkObjectBarrierSetAssembler::oop_store_at (MacroAssembler* masm, DecoratorSet decorators, BasicType type, Address dst, Register val, Register tmp1, Register tmp2) {
30
- bool in_heap = (decorators & IN_HEAP) != 0 ;
31
- bool as_normal = (decorators & AS_NORMAL) != 0 ;
32
- assert ((decorators & IS_DEST_UNINITIALIZED) == 0 , " unsupported" );
33
-
34
- if (!in_heap || val == noreg) {
35
- BarrierSetAssembler::store_at (masm, decorators, type, dst, val, tmp1, tmp2);
36
- return ;
37
- }
38
-
39
- BarrierSetAssembler::store_at (masm, decorators, type, dst, val, tmp1, tmp2);
40
-
41
- record_modified_node (masm, dst.base (), tmp1, tmp2);
42
- }
43
-
44
- void MMTkObjectBarrierSetAssembler::record_modified_node (MacroAssembler* masm, Register obj, Register tmp1, Register tmp2) {
45
- #if MMTK_ENABLE_OBJECT_BARRIER_FASTPATH
22
+ void MMTkObjectBarrierSetAssembler::object_reference_write_post (MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2) const {
23
+ if (can_remove_barrier (decorators, val, /* skip_const_null */ true )) return ;
24
+ #if MMTK_ENABLE_BARRIER_FASTPATH
46
25
Label done;
47
26
48
27
Register tmp3 = rscratch1;
49
28
Register tmp4 = rscratch2;
29
+ Register obj = dst.base ();
50
30
assert_different_registers (obj, tmp2, tmp3);
51
31
assert_different_registers (tmp4, rcx);
52
32
@@ -69,18 +49,32 @@ void MMTkObjectBarrierSetAssembler::record_modified_node(MacroAssembler* masm, R
69
49
__ cmpptr (tmp2, 1 );
70
50
__ jcc (Assembler::notEqual, done);
71
51
72
- assert_different_registers (c_rarg0, obj);
73
52
__ movptr (c_rarg0, obj);
74
- __ call_VM_leaf_base (CAST_FROM_FN_PTR (address, MMTkObjectBarrierSetRuntime::record_modified_node_slow), 1 );
53
+ __ lea (c_rarg1, dst);
54
+ __ movptr (c_rarg2, val == noreg ? (int32_t ) NULL_WORD : val);
55
+ __ call_VM_leaf_base (FN_ADDR (MMTkBarrierSetRuntime::object_reference_write_slow_call), 3 );
75
56
76
57
__ bind (done);
77
58
#else
78
- assert_different_registers (c_rarg0, obj);
79
59
__ movptr (c_rarg0, obj);
80
- __ call_VM_leaf_base (CAST_FROM_FN_PTR (address, MMTkObjectBarrierSetRuntime::record_modified_node_full), 1 );
60
+ __ lea (c_rarg1, dst);
61
+ __ movptr (c_rarg2, val == noreg ? (int32_t ) NULL_WORD : val);
62
+ __ call_VM_leaf_base (FN_ADDR (MMTkBarrierSetRuntime::object_reference_write_post_call), 3 );
81
63
#endif
82
64
}
83
65
66
+ void MMTkObjectBarrierSetAssembler::arraycopy_epilogue (MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) {
67
+ const bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0 ;
68
+ if ((type == T_OBJECT || type == T_ARRAY) && !dest_uninitialized) {
69
+ __ pusha ();
70
+ __ movptr (c_rarg0, src);
71
+ __ movptr (c_rarg1, dst);
72
+ __ movptr (c_rarg2, count);
73
+ __ call_VM_leaf_base (FN_ADDR (MMTkBarrierSetRuntime::object_reference_array_copy_post_call), 3 );
74
+ __ popa ();
75
+ }
76
+ }
77
+
84
78
#undef __
85
79
86
80
#ifdef ASSERT
@@ -89,7 +83,7 @@ void MMTkObjectBarrierSetAssembler::record_modified_node(MacroAssembler* masm, R
89
83
#define __ gen->lir ()->
90
84
#endif
91
85
92
- void MMTkObjectBarrierSetC1::record_modified_node (LIRAccess& access, LIR_Opr src, LIR_Opr slot, LIR_Opr new_val) {
86
+ void MMTkObjectBarrierSetC1::object_reference_write_post (LIRAccess& access, LIR_Opr src, LIR_Opr slot, LIR_Opr new_val) const {
93
87
LIRGenerator* gen = access .gen ();
94
88
DecoratorSet decorators = access .decorators ();
95
89
if ((decorators & IN_HEAP) == 0 ) return ;
@@ -123,35 +117,31 @@ void MMTkObjectBarrierSetC1::record_modified_node(LIRAccess& access, LIR_Opr src
123
117
new_val = new_val_reg;
124
118
}
125
119
assert (new_val->is_register (), " must be a register at this point" );
126
- CodeStub* slow = new MMTkObjectBarrierStub (src, slot, new_val);
120
+ CodeStub* slow = new MMTkC1BarrierStub (src, slot, new_val);
127
121
128
- #if MMTK_ENABLE_OBJECT_BARRIER_FASTPATH
122
+ #if MMTK_ENABLE_BARRIER_FASTPATH
129
123
LIR_Opr addr = src;
130
124
// uint8_t* meta_addr = (uint8_t*) (SIDE_METADATA_BASE_ADDRESS + (addr >> 6));
131
125
LIR_Opr offset = gen->new_pointer_register ();
132
126
__ move (addr, offset);
133
- __ shift_right (offset, 6 , offset);
127
+ __ unsigned_shift_right (offset, 6 , offset);
134
128
LIR_Opr base = gen->new_pointer_register ();
135
129
__ move (LIR_OprFact::longConst (SIDE_METADATA_BASE_ADDRESS), base);
136
130
LIR_Address* meta_addr = new LIR_Address (base, offset, T_BYTE);
137
- // intptr_t shift = (addr >> 3) & 0b111;
138
- LIR_Opr shift_long = gen->new_pointer_register ();
139
- __ move (addr, shift_long);
140
- __ shift_right (shift_long, 3 , shift_long);
141
- __ logical_and (shift_long, LIR_OprFact::longConst (0b111 ), shift_long);
142
- LIR_Opr shift_int = gen->new_register (T_INT);
143
- __ convert (Bytecodes::_l2i, shift_long, shift_int);
144
- LIR_Opr shift = LIRGenerator::shiftCountOpr ();
145
- __ move (shift_int, shift);
146
131
// uint8_t byte_val = *meta_addr;
147
132
LIR_Opr byte_val = gen->new_register (T_INT);
148
133
__ move (meta_addr, byte_val);
134
+ // intptr_t shift = (addr >> 3) & 0b111;
135
+ LIR_Opr shift = gen->new_register (T_INT);
136
+ __ move (addr, shift);
137
+ __ unsigned_shift_right (shift, 3 , shift);
138
+ __ logical_and (shift, LIR_OprFact::intConst (0b111 ), shift);
149
139
// if (((byte_val >> shift) & 1) == 1) slow;
150
140
LIR_Opr result = byte_val;
151
- __ shift_right (result, shift, result, LIR_OprFact::illegalOpr);
141
+ __ unsigned_shift_right (result, shift, result, LIR_OprFact::illegalOpr);
152
142
__ logical_and (result, LIR_OprFact::intConst (1 ), result);
153
143
__ cmp (lir_cond_equal, result, LIR_OprFact::intConst (1 ));
154
- __ branch (lir_cond_equal, LP64_ONLY (T_LONG) NOT_LP64 (T_INT) , slow);
144
+ __ branch (lir_cond_equal, T_BYTE , slow);
155
145
#else
156
146
__ jump (slow);
157
147
#endif
@@ -163,24 +153,12 @@ void MMTkObjectBarrierSetC1::record_modified_node(LIRAccess& access, LIR_Opr src
163
153
164
154
#define __ ideal.
165
155
166
- const TypeFunc* record_modified_node_entry_Type () {
167
- const Type **fields = TypeTuple::fields (1 );
168
- fields[TypeFunc::Parms+0 ] = TypeOopPtr::BOTTOM; // oop src
169
- const TypeTuple *domain = TypeTuple::make (TypeFunc::Parms+1 , fields);
170
- fields = TypeTuple::fields (0 );
171
- const TypeTuple *range = TypeTuple::make (TypeFunc::Parms+0 , fields);
172
- return TypeFunc::make (domain, range);
173
- }
174
-
175
- void MMTkObjectBarrierSetC2::record_modified_node (GraphKit* kit, Node* src, Node* val) const {
176
- if (val != NULL && val->is_Con ()) {
177
- const Type* t = val->bottom_type ();
178
- if (t == TypePtr::NULL_PTR) return ;
179
- }
156
+ void MMTkObjectBarrierSetC2::object_reference_write_post (GraphKit* kit, Node* src, Node* slot, Node* val) const {
157
+ if (can_remove_barrier (kit, &kit->gvn (), src, slot, val, /* skip_const_null */ true )) return ;
180
158
181
159
MMTkIdealKit ideal (kit, true );
182
160
183
- #if MMTK_ENABLE_OBJECT_BARRIER_FASTPATH
161
+ #if MMTK_ENABLE_BARRIER_FASTPATH
184
162
Node* no_base = __ top ();
185
163
float unlikely = PROB_UNLIKELY (0.999 );
186
164
@@ -193,12 +171,12 @@ void MMTkObjectBarrierSetC2::record_modified_node(GraphKit* kit, Node* src, Node
193
171
Node* result = __ AndI (__ URShiftI (byte, shift), __ ConI (1 ));
194
172
195
173
__ if_then (result, BoolTest::ne, zero, unlikely); {
196
- const TypeFunc* tf = __ func_type (TypeOopPtr::BOTTOM);
197
- Node* x = __ make_leaf_call (tf, CAST_FROM_FN_PTR (address, MMTkObjectBarrierSetRuntime::record_modified_node_slow ), " record_modified_node " , src);
174
+ const TypeFunc* tf = __ func_type (TypeOopPtr::BOTTOM, TypeOopPtr::BOTTOM, TypeOopPtr::BOTTOM );
175
+ Node* x = __ make_leaf_call (tf, FN_ADDR (MMTkBarrierSetRuntime::object_reference_write_slow_call ), " mmtk_barrier_call " , src, slot, val );
198
176
} __ end_if ();
199
177
#else
200
- const TypeFunc* tf = __ func_type (TypeOopPtr::BOTTOM);
201
- Node* x = __ make_leaf_call (tf, CAST_FROM_FN_PTR (address, MMTkObjectBarrierSetRuntime::record_modified_node_full ), " record_modified_node " , src);
178
+ const TypeFunc* tf = __ func_type (TypeOopPtr::BOTTOM, TypeOopPtr::BOTTOM, TypeOopPtr::BOTTOM );
179
+ Node* x = __ make_leaf_call (tf, FN_ADDR (MMTkBarrierSetRuntime::object_reference_write_post_call ), " mmtk_barrier_call " , src, slot, val );
202
180
#endif
203
181
204
182
kit->final_sync (ideal); // Final sync IdealKit and GraphKit.
0 commit comments