@@ -101,12 +101,12 @@ void G1BarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* mas
101
101
}
102
102
103
103
void G1BarrierSetAssembler::load_at (MacroAssembler* masm, DecoratorSet decorators, BasicType type,
104
- Register dst, Address src, Register tmp1, Register tmp_thread ) {
104
+ Register dst, Address src, Register tmp1, Register tmp2 ) {
105
105
bool on_oop = is_reference_type (type);
106
106
bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0 ;
107
107
bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0 ;
108
108
bool on_reference = on_weak || on_phantom;
109
- ModRefBarrierSetAssembler::load_at (masm, decorators, type, dst, src, tmp1, tmp_thread );
109
+ ModRefBarrierSetAssembler::load_at (masm, decorators, type, dst, src, tmp1, tmp2 );
110
110
if (on_oop && on_reference) {
111
111
// RA is live. It must be saved around calls.
112
112
__ enter (); // barrier may call runtime
@@ -116,7 +116,8 @@ void G1BarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorator
116
116
noreg /* obj */ ,
117
117
dst /* pre_val */ ,
118
118
TREG /* thread */ ,
119
- tmp1 /* tmp */ ,
119
+ tmp1 /* tmp1 */ ,
120
+ tmp2 /* tmp2 */ ,
120
121
true /* tosca_live */ ,
121
122
true /* expand_call */ );
122
123
__ leave ();
@@ -127,7 +128,8 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
127
128
Register obj,
128
129
Register pre_val,
129
130
Register thread,
130
- Register tmp,
131
+ Register tmp1,
132
+ Register tmp2,
131
133
bool tosca_live,
132
134
bool expand_call) {
133
135
// If expand_call is true then we expand the call_VM_leaf macro
@@ -139,29 +141,25 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
139
141
Label done;
140
142
Label runtime;
141
143
142
- assert (pre_val != noreg, " check this code" );
143
-
144
- if (obj != noreg) {
145
- assert_different_registers (obj, pre_val, tmp);
146
- assert (pre_val != V0, " check this code" );
147
- }
144
+ assert_different_registers (obj, pre_val, tmp1, tmp2);
145
+ assert (pre_val != noreg && tmp1 != noreg && tmp2 != noreg, " expecting a register" );
148
146
149
147
Address in_progress (thread, in_bytes (G1ThreadLocalData::satb_mark_queue_active_offset ()));
150
148
Address index (thread, in_bytes (G1ThreadLocalData::satb_mark_queue_index_offset ()));
151
149
Address buffer (thread, in_bytes (G1ThreadLocalData::satb_mark_queue_buffer_offset ()));
152
150
153
151
// Is marking active?
154
152
if (in_bytes (SATBMarkQueue::byte_width_of_active ()) == 4 ) {
155
- __ ld_w (AT , in_progress);
153
+ __ ld_w (tmp1 , in_progress);
156
154
} else {
157
155
assert (in_bytes (SATBMarkQueue::byte_width_of_active ()) == 1 , " Assumption" );
158
- __ ld_b (AT , in_progress);
156
+ __ ld_b (tmp1 , in_progress);
159
157
}
160
- __ beqz (AT , done);
158
+ __ beqz (tmp1 , done);
161
159
162
160
// Do we need to load the previous value?
163
161
if (obj != noreg) {
164
- __ load_heap_oop (pre_val, Address (obj, 0 ), tmp );
162
+ __ load_heap_oop (pre_val, Address (obj, 0 ), noreg, noreg, AS_RAW );
165
163
}
166
164
167
165
// Is the previous value null?
@@ -171,18 +169,19 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
171
169
// Is index == 0?
172
170
// (The index field is typed as size_t.)
173
171
174
- __ ld_d (tmp , index);
175
- __ beqz (tmp , runtime);
172
+ __ ld_d (tmp1 , index);
173
+ __ beqz (tmp1 , runtime);
176
174
177
- __ addi_d (tmp, tmp , -1 * wordSize);
178
- __ st_d (tmp , index);
179
- __ ld_d (AT , buffer);
175
+ __ addi_d (tmp1, tmp1 , -1 * wordSize);
176
+ __ st_d (tmp1 , index);
177
+ __ ld_d (tmp2 , buffer);
180
178
181
179
// Record the previous value
182
- __ stx_d (pre_val, tmp, AT );
180
+ __ stx_d (pre_val, tmp1, tmp2 );
183
181
__ b (done);
184
182
185
183
__ bind (runtime);
184
+
186
185
__ push_call_clobbered_registers ();
187
186
188
187
// Calling the runtime using the regular call_VM_leaf mechanism generates
@@ -199,8 +198,6 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
199
198
200
199
if (expand_call) {
201
200
assert (pre_val != A1, " smashed arg" );
202
- if (thread != A1) __ move (A1, thread);
203
- if (pre_val != A0) __ move (A0, pre_val);
204
201
__ super_call_VM_leaf (CAST_FROM_FN_PTR (address, G1BarrierSetRuntime::write_ref_field_pre_entry), pre_val, thread);
205
202
} else {
206
203
__ call_VM_leaf (CAST_FROM_FN_PTR (address, G1BarrierSetRuntime::write_ref_field_pre_entry), pre_val, thread);
@@ -215,10 +212,12 @@ void G1BarrierSetAssembler::g1_write_barrier_post(MacroAssembler* masm,
215
212
Register store_addr,
216
213
Register new_val,
217
214
Register thread,
218
- Register tmp ,
215
+ Register tmp1 ,
219
216
Register tmp2) {
220
- assert_different_registers (tmp, tmp2, AT);
221
217
assert (thread == TREG, " must be" );
218
+ assert_different_registers (store_addr, thread, tmp1, tmp2, SCR1);
219
+ assert (store_addr != noreg && new_val != noreg && tmp1 != noreg
220
+ && tmp2 != noreg, " expecting a register" );
222
221
223
222
Address queue_index (thread, in_bytes (G1ThreadLocalData::dirty_card_queue_index_offset ()));
224
223
Address buffer (thread, in_bytes (G1ThreadLocalData::dirty_card_queue_buffer_offset ()));
@@ -230,53 +229,49 @@ void G1BarrierSetAssembler::g1_write_barrier_post(MacroAssembler* masm,
230
229
Label runtime;
231
230
232
231
// Does store cross heap regions?
233
- __ xorr (AT , store_addr, new_val);
234
- __ srli_d (AT, AT , HeapRegion::LogOfHRGrainBytes);
235
- __ beqz (AT , done);
232
+ __ xorr (tmp1 , store_addr, new_val);
233
+ __ srli_d (tmp1, tmp1 , HeapRegion::LogOfHRGrainBytes);
234
+ __ beqz (tmp1 , done);
236
235
237
236
// crosses regions, storing null?
238
237
__ beqz (new_val, done);
239
238
240
239
// storing region crossing non-null, is card already dirty?
241
- const Register card_addr = tmp;
242
- const Register cardtable = tmp2;
240
+ const Register card_addr = tmp1;
243
241
244
- __ move (card_addr, store_addr);
245
- __ srli_d (card_addr, card_addr, CardTable::card_shift ());
242
+ __ srli_d (card_addr, store_addr, CardTable::card_shift ());
246
243
// Do not use ExternalAddress to load 'byte_map_base', since 'byte_map_base' is NOT
247
244
// a valid address and therefore is not properly handled by the relocation code.
248
- __ li (cardtable , (intptr_t )ct->card_table ()->byte_map_base ());
249
- __ add_d (card_addr, card_addr, cardtable );
245
+ __ li (tmp2 , (intptr_t )ct->card_table ()->byte_map_base ());
246
+ __ add_d (card_addr, card_addr, tmp2 );
250
247
251
- __ ld_bu (AT , card_addr, 0 );
252
- __ addi_d (AT, AT , -1 * (int )G1CardTable::g1_young_card_val ());
253
- __ beqz (AT , done);
248
+ __ ld_bu (tmp2 , card_addr, 0 );
249
+ __ addi_d (tmp2, tmp2 , -1 * (int )G1CardTable::g1_young_card_val ());
250
+ __ beqz (tmp2 , done);
254
251
255
252
assert ((int )CardTable::dirty_card_val () == 0 , " must be 0" );
256
253
257
254
__ membar (__ StoreLoad);
258
- __ ld_bu (AT , card_addr, 0 );
259
- __ beqz (AT , done);
255
+ __ ld_bu (tmp2 , card_addr, 0 );
256
+ __ beqz (tmp2 , done);
260
257
261
258
// storing a region crossing, non-null oop, card is clean.
262
259
// dirty card and log.
263
260
__ st_b (R0, card_addr, 0 );
264
261
265
- __ ld_d (AT , queue_index);
266
- __ beqz (AT , runtime);
267
- __ addi_d (AT, AT , -1 * wordSize);
268
- __ st_d (AT , queue_index);
262
+ __ ld_d (SCR1 , queue_index);
263
+ __ beqz (SCR1 , runtime);
264
+ __ addi_d (SCR1, SCR1 , -1 * wordSize);
265
+ __ st_d (SCR1 , queue_index);
269
266
__ ld_d (tmp2, buffer);
270
- __ ld_d (AT , queue_index);
271
- __ stx_d (card_addr, tmp2, AT );
267
+ __ ld_d (SCR1 , queue_index);
268
+ __ stx_d (card_addr, tmp2, SCR1 );
272
269
__ b (done);
273
270
274
271
__ bind (runtime);
275
272
// save the live input values
276
273
__ push (store_addr);
277
- __ push (new_val);
278
274
__ call_VM_leaf (CAST_FROM_FN_PTR (address, G1BarrierSetRuntime::write_ref_field_post_entry), card_addr, TREG);
279
- __ pop (new_val);
280
275
__ pop (store_addr);
281
276
282
277
__ bind (done);
@@ -306,7 +301,8 @@ void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet deco
306
301
tmp3 /* obj */ ,
307
302
tmp2 /* pre_val */ ,
308
303
TREG /* thread */ ,
309
- tmp1 /* tmp */ ,
304
+ tmp1 /* tmp1 */ ,
305
+ SCR1 /* tmp2 */ ,
310
306
val != noreg /* tosca_live */ ,
311
307
false /* expand_call */ );
312
308
}
@@ -327,7 +323,7 @@ void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet deco
327
323
tmp3 /* store_adr */ ,
328
324
new_val /* new_val */ ,
329
325
TREG /* thread */ ,
330
- tmp1 /* tmp */ ,
326
+ tmp1 /* tmp1 */ ,
331
327
tmp2 /* tmp2 */ );
332
328
}
333
329
}
0 commit comments