@@ -98,6 +98,80 @@ void G1BarrierSetAssembler::gen_write_ref_array_pre_barrier(MacroAssembler* masm
98
98
99
99
void G1BarrierSetAssembler::gen_write_ref_array_post_barrier (MacroAssembler* masm, DecoratorSet decorators,
100
100
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
+ }
101
175
__ push_call_clobbered_registers (false /* save_fpu */ );
102
176
#ifdef _LP64
103
177
if (c_rarg0 == count) { // On win64 c_rarg0 == rcx
@@ -308,10 +382,12 @@ void G1BarrierSetAssembler::g1_write_barrier_post(MacroAssembler* masm,
308
382
__ movptr (cardtable, (intptr_t )ct->card_table ()->byte_map_base ());
309
383
__ addptr (card_addr, cardtable);
310
384
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);
313
388
314
- __ membar (Assembler::Membar_mask_bits (Assembler::StoreLoad));
389
+ __ membar (Assembler::Membar_mask_bits (Assembler::StoreLoad));
390
+ }
315
391
__ cmpb (Address (card_addr, 0 ), G1CardTable::dirty_card_val ());
316
392
__ jcc (Assembler::equal, done);
317
393
@@ -541,11 +617,12 @@ void G1BarrierSetAssembler::generate_c1_post_barrier_runtime_stub(StubAssembler*
541
617
__ addptr (card_addr, cardtable);
542
618
543
619
NOT_LP64 (__ get_thread (thread);)
620
+ if (!UseNewCode) {
621
+ __ cmpb (Address (card_addr, 0 ), G1CardTable::g1_young_card_val ());
622
+ __ jcc (Assembler::equal, done);
544
623
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
+ }
549
626
__ cmpb (Address (card_addr, 0 ), CardTable::dirty_card_val ());
550
627
__ jcc (Assembler::equal, done);
551
628
0 commit comments