@@ -101,12 +101,12 @@ void G1BarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* mas
101101}
102102
103103void 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 ) {
105105 bool on_oop = is_reference_type (type);
106106 bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0 ;
107107 bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0 ;
108108 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 );
110110 if (on_oop && on_reference) {
111111 // RA is live. It must be saved around calls.
112112 __ enter (); // barrier may call runtime
@@ -116,7 +116,8 @@ void G1BarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorator
116116 noreg /* obj */ ,
117117 dst /* pre_val */ ,
118118 TREG /* thread */ ,
119- tmp1 /* tmp */ ,
119+ tmp1 /* tmp1 */ ,
120+ tmp2 /* tmp2 */ ,
120121 true /* tosca_live */ ,
121122 true /* expand_call */ );
122123 __ leave ();
@@ -127,7 +128,8 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
127128 Register obj,
128129 Register pre_val,
129130 Register thread,
130- Register tmp,
131+ Register tmp1,
132+ Register tmp2,
131133 bool tosca_live,
132134 bool expand_call) {
133135 // 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,
139141 Label done;
140142 Label runtime;
141143
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" );
148146
149147 Address in_progress (thread, in_bytes (G1ThreadLocalData::satb_mark_queue_active_offset ()));
150148 Address index (thread, in_bytes (G1ThreadLocalData::satb_mark_queue_index_offset ()));
151149 Address buffer (thread, in_bytes (G1ThreadLocalData::satb_mark_queue_buffer_offset ()));
152150
153151 // Is marking active?
154152 if (in_bytes (SATBMarkQueue::byte_width_of_active ()) == 4 ) {
155- __ ld_w (AT , in_progress);
153+ __ ld_w (tmp1 , in_progress);
156154 } else {
157155 assert (in_bytes (SATBMarkQueue::byte_width_of_active ()) == 1 , " Assumption" );
158- __ ld_b (AT , in_progress);
156+ __ ld_b (tmp1 , in_progress);
159157 }
160- __ beqz (AT , done);
158+ __ beqz (tmp1 , done);
161159
162160 // Do we need to load the previous value?
163161 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 );
165163 }
166164
167165 // Is the previous value null?
@@ -171,18 +169,19 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
171169 // Is index == 0?
172170 // (The index field is typed as size_t.)
173171
174- __ ld_d (tmp , index);
175- __ beqz (tmp , runtime);
172+ __ ld_d (tmp1 , index);
173+ __ beqz (tmp1 , runtime);
176174
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);
180178
181179 // Record the previous value
182- __ stx_d (pre_val, tmp, AT );
180+ __ stx_d (pre_val, tmp1, tmp2 );
183181 __ b (done);
184182
185183 __ bind (runtime);
184+
186185 __ push_call_clobbered_registers ();
187186
188187 // Calling the runtime using the regular call_VM_leaf mechanism generates
@@ -199,8 +198,6 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm,
199198
200199 if (expand_call) {
201200 assert (pre_val != A1, " smashed arg" );
202- if (thread != A1) __ move (A1, thread);
203- if (pre_val != A0) __ move (A0, pre_val);
204201 __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, G1BarrierSetRuntime::write_ref_field_pre_entry), pre_val, thread);
205202 } else {
206203 __ 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,
215212 Register store_addr,
216213 Register new_val,
217214 Register thread,
218- Register tmp ,
215+ Register tmp1 ,
219216 Register tmp2) {
220- assert_different_registers (tmp, tmp2, AT);
221217 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" );
222221
223222 Address queue_index (thread, in_bytes (G1ThreadLocalData::dirty_card_queue_index_offset ()));
224223 Address buffer (thread, in_bytes (G1ThreadLocalData::dirty_card_queue_buffer_offset ()));
@@ -230,53 +229,49 @@ void G1BarrierSetAssembler::g1_write_barrier_post(MacroAssembler* masm,
230229 Label runtime;
231230
232231 // 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);
236235
237236 // crosses regions, storing null?
238237 __ beqz (new_val, done);
239238
240239 // 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;
243241
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 ());
246243 // Do not use ExternalAddress to load 'byte_map_base', since 'byte_map_base' is NOT
247244 // 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 );
250247
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);
254251
255252 assert ((int )CardTable::dirty_card_val () == 0 , " must be 0" );
256253
257254 __ membar (__ StoreLoad);
258- __ ld_bu (AT , card_addr, 0 );
259- __ beqz (AT , done);
255+ __ ld_bu (tmp2 , card_addr, 0 );
256+ __ beqz (tmp2 , done);
260257
261258 // storing a region crossing, non-null oop, card is clean.
262259 // dirty card and log.
263260 __ st_b (R0, card_addr, 0 );
264261
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);
269266 __ 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 );
272269 __ b (done);
273270
274271 __ bind (runtime);
275272 // save the live input values
276273 __ push (store_addr);
277- __ push (new_val);
278274 __ call_VM_leaf (CAST_FROM_FN_PTR (address, G1BarrierSetRuntime::write_ref_field_post_entry), card_addr, TREG);
279- __ pop (new_val);
280275 __ pop (store_addr);
281276
282277 __ bind (done);
@@ -306,7 +301,8 @@ void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet deco
306301 tmp3 /* obj */ ,
307302 tmp2 /* pre_val */ ,
308303 TREG /* thread */ ,
309- tmp1 /* tmp */ ,
304+ tmp1 /* tmp1 */ ,
305+ SCR1 /* tmp2 */ ,
310306 val != noreg /* tosca_live */ ,
311307 false /* expand_call */ );
312308 }
@@ -327,7 +323,7 @@ void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet deco
327323 tmp3 /* store_adr */ ,
328324 new_val /* new_val */ ,
329325 TREG /* thread */ ,
330- tmp1 /* tmp */ ,
326+ tmp1 /* tmp1 */ ,
331327 tmp2 /* tmp2 */ );
332328 }
333329 }
0 commit comments