@@ -98,6 +98,80 @@ void G1BarrierSetAssembler::gen_write_ref_array_pre_barrier(MacroAssembler* masm
9898
9999void G1BarrierSetAssembler::gen_write_ref_array_post_barrier (MacroAssembler* masm, DecoratorSet decorators,
100100 Register addr, Register count, Register tmp) {
101+
102+ if (true ) {
103+ assert (sizeof (CardTable::CardValue) == 1 , " must be" );
104+
105+ Label done;
106+ __ testptr (count, count);
107+ __ jcc (Assembler::equal, done); // nothing to do if empty ref array.
108+
109+ // Calculate end address.
110+ __ shlptr (count, LogBytesPerHeapOop);
111+ __ addptr (count, addr);
112+ // Calculate start card address in "addr".
113+ __ shrptr (addr, CardTable::card_shift ());
114+ __ movptr (tmp, (intptr_t )barrier_set_cast<CardTableBarrierSet>(BarrierSet::barrier_set ())->card_table ()->byte_map_base ());
115+ __ addptr (addr, tmp);
116+
117+ if (!UseNewCode) {
118+ // If the object starts in a young region, there is nothing to do.
119+ __ cmpb (Address (addr, 0 ), G1CardTable::g1_young_card_val ());
120+ __ jcc (Assembler::equal, done);
121+ __ membar (Assembler::Membar_mask_bits (Assembler::StoreLoad));
122+ }
123+
124+ // Caclulate card address of last word.
125+ __ subptr (count, 1 );
126+ __ shrptr (count, CardTable::card_shift ());
127+ __ addptr (count, tmp);
128+
129+ Label loop;
130+ __ bind (loop);
131+
132+ Label next_card;
133+ __ cmpb (Address (addr, 0 ), G1CardTable::dirty_card_val ());
134+ __ jcc (Assembler::zero, next_card);
135+
136+ // Card was not dirty. Dirty card and enqueue.
137+ __ movb (Address (addr, 0 ), G1CardTable::dirty_card_val ());
138+
139+ Address queue_index (r15_thread, in_bytes (G1ThreadLocalData::dirty_card_queue_index_offset ()));
140+ Address buffer (r15_thread, in_bytes (G1ThreadLocalData::dirty_card_queue_buffer_offset ()));
141+
142+ __ movptr (tmp, queue_index);
143+ __ testptr (tmp, tmp);
144+ Label runtime;
145+ __ jcc (Assembler::zero, runtime);
146+ __ subptr (tmp, wordSize);
147+ __ movptr (queue_index, tmp);
148+ __ addptr (tmp, buffer);
149+ __ movptr (Address (tmp, 0 ), addr);
150+ __ jmp (next_card);
151+
152+ __ bind (runtime);
153+
154+ // Save caller saved registers.
155+ __ push_call_clobbered_registers (false /* save_fpu */ );
156+ // FIXME: probably issue with Windows....
157+ if (c_rarg1 != r15_thread) {
158+ __ mov (c_rarg1, r15_thread);
159+ }
160+ if (c_rarg0 != addr) {
161+ __ mov (c_rarg0, addr);
162+ }
163+
164+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, G1BarrierSetRuntime::write_ref_field_post_entry), c_rarg0, c_rarg1);
165+ __ pop_call_clobbered_registers (false /* save_fpu */ );
166+
167+ __ bind (next_card);
168+ __ addptr (addr, sizeof (CardTable::CardValue));
169+ __ cmpptr (addr, count);
170+ __ jcc (Assembler::belowEqual, loop);
171+
172+ __ bind (done);
173+ return ;
174+ }
101175 __ push_call_clobbered_registers (false /* save_fpu */ );
102176#ifdef _LP64
103177 if (c_rarg0 == count) { // On win64 c_rarg0 == rcx
@@ -308,10 +382,12 @@ void G1BarrierSetAssembler::g1_write_barrier_post(MacroAssembler* masm,
308382 __ movptr (cardtable, (intptr_t )ct->card_table ()->byte_map_base ());
309383 __ addptr (card_addr, cardtable);
310384
311- __ cmpb (Address (card_addr, 0 ), G1CardTable::g1_young_card_val ());
312- __ jcc (Assembler::equal, done);
385+ if (!UseNewCode) {
386+ __ cmpb (Address (card_addr, 0 ), G1CardTable::g1_young_card_val ());
387+ __ jcc (Assembler::equal, done);
313388
314- __ membar (Assembler::Membar_mask_bits (Assembler::StoreLoad));
389+ __ membar (Assembler::Membar_mask_bits (Assembler::StoreLoad));
390+ }
315391 __ cmpb (Address (card_addr, 0 ), G1CardTable::dirty_card_val ());
316392 __ jcc (Assembler::equal, done);
317393
@@ -541,11 +617,12 @@ void G1BarrierSetAssembler::generate_c1_post_barrier_runtime_stub(StubAssembler*
541617 __ addptr (card_addr, cardtable);
542618
543619 NOT_LP64 (__ get_thread (thread);)
620+ if (!UseNewCode) {
621+ __ cmpb (Address (card_addr, 0 ), G1CardTable::g1_young_card_val ());
622+ __ jcc (Assembler::equal, done);
544623
545- __ cmpb (Address (card_addr, 0 ), G1CardTable::g1_young_card_val ());
546- __ jcc (Assembler::equal, done);
547-
548- __ membar (Assembler::Membar_mask_bits (Assembler::StoreLoad));
624+ __ membar (Assembler::Membar_mask_bits (Assembler::StoreLoad));
625+ }
549626 __ cmpb (Address (card_addr, 0 ), CardTable::dirty_card_val ());
550627 __ jcc (Assembler::equal, done);
551628
0 commit comments