201 BarrierSet* bs = BarrierSet::barrier_set();
202 CardTableBarrierSet* ctbs = barrier_set_cast<CardTableBarrierSet>(bs);
203 CardTable* ct = ctbs->card_table();
204 Label done;
205 Label runtime;
206
207 // Does store cross heap regions?
208
209 __ eor(tmp1, store_addr, new_val);
210 __ movs(tmp1, AsmOperand(tmp1, lsr, HeapRegion::LogOfHRGrainBytes));
211 __ b(done, eq);
212
213 // crosses regions, storing NULL?
214
215 __ cbz(new_val, done);
216
217 // storing region crossing non-NULL, is card already dirty?
218 const Register card_addr = tmp1;
219 assert(sizeof(*ct->byte_map_base()) == sizeof(jbyte), "adjust this code");
220
221 __ mov_address(tmp2, (address)ct->byte_map_base(), symbolic_Relocation::card_table_reference);
222 __ add(card_addr, tmp2, AsmOperand(store_addr, lsr, CardTable::card_shift));
223
224 __ ldrb(tmp2, Address(card_addr));
225 __ cmp(tmp2, (int)G1CardTable::g1_young_card_val());
226 __ b(done, eq);
227
228 __ membar(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreLoad), tmp2);
229
230 assert(CardTable::dirty_card_val() == 0, "adjust this code");
231 __ ldrb(tmp2, Address(card_addr));
232 __ cbz(tmp2, done);
233
234 // storing a region crossing, non-NULL oop, card is clean.
235 // dirty card and log.
236
237 __ strb(__ zero_register(tmp2), Address(card_addr));
238
239 __ ldr(tmp2, queue_index);
240 __ ldr(tmp3, buffer);
241
|
201 BarrierSet* bs = BarrierSet::barrier_set();
202 CardTableBarrierSet* ctbs = barrier_set_cast<CardTableBarrierSet>(bs);
203 CardTable* ct = ctbs->card_table();
204 Label done;
205 Label runtime;
206
207 // Does store cross heap regions?
208
209 __ eor(tmp1, store_addr, new_val);
210 __ movs(tmp1, AsmOperand(tmp1, lsr, HeapRegion::LogOfHRGrainBytes));
211 __ b(done, eq);
212
213 // crosses regions, storing NULL?
214
215 __ cbz(new_val, done);
216
217 // storing region crossing non-NULL, is card already dirty?
218 const Register card_addr = tmp1;
219 assert(sizeof(*ct->byte_map_base()) == sizeof(jbyte), "adjust this code");
220
221 __ mov_address(tmp2, (address)ct->byte_map_base());
222 __ add(card_addr, tmp2, AsmOperand(store_addr, lsr, CardTable::card_shift));
223
224 __ ldrb(tmp2, Address(card_addr));
225 __ cmp(tmp2, (int)G1CardTable::g1_young_card_val());
226 __ b(done, eq);
227
228 __ membar(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreLoad), tmp2);
229
230 assert(CardTable::dirty_card_val() == 0, "adjust this code");
231 __ ldrb(tmp2, Address(card_addr));
232 __ cbz(tmp2, done);
233
234 // storing a region crossing, non-NULL oop, card is clean.
235 // dirty card and log.
236
237 __ strb(__ zero_register(tmp2), Address(card_addr));
238
239 __ ldr(tmp2, queue_index);
240 __ ldr(tmp3, buffer);
241
|