< prev index next >

src/hotspot/cpu/x86/gc/shared/cardTableBarrierSetAssembler_x86.cpp

Print this page

153     AddressLiteral cardtable((address)byte_map_base, relocInfo::none);
154     Address index(noreg, obj, Address::times_1);
155     card_addr = __ as_Address(ArrayAddress(cardtable, index), rscratch1);
156   }
157 
158   int dirty = CardTable::dirty_card_val();
159   if (UseCondCardMark) {
160     Label L_already_dirty;
161     __ cmpb(card_addr, dirty);
162     __ jccb(Assembler::equal, L_already_dirty);
163     __ movb(card_addr, dirty);
164     __ bind(L_already_dirty);
165   } else {
166     __ movb(card_addr, dirty);
167   }
168 }
169 
170 void CardTableBarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
171                                                 Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
172   bool in_heap = (decorators & IN_HEAP) != 0;
173 
174   bool is_array = (decorators & IS_ARRAY) != 0;
175   bool on_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
176   bool precise = is_array || on_anonymous;
177 
178   bool needs_post_barrier = val != noreg && in_heap;
179 
180   BarrierSetAssembler::store_at(masm, decorators, type, dst, val, noreg, noreg, noreg);
181   if (needs_post_barrier) {
182     // flatten object address if needed
183     if (!precise || (dst.index() == noreg && dst.disp() == 0)) {
184       store_check(masm, dst.base(), dst);







185     } else {
186       __ lea(tmp1, dst);
187       store_check(masm, tmp1, dst);
188     }
189   }
190 }

153     AddressLiteral cardtable((address)byte_map_base, relocInfo::none);
154     Address index(noreg, obj, Address::times_1);
155     card_addr = __ as_Address(ArrayAddress(cardtable, index), rscratch1);
156   }
157 
158   int dirty = CardTable::dirty_card_val();
159   if (UseCondCardMark) {
160     Label L_already_dirty;
161     __ cmpb(card_addr, dirty);
162     __ jccb(Assembler::equal, L_already_dirty);
163     __ movb(card_addr, dirty);
164     __ bind(L_already_dirty);
165   } else {
166     __ movb(card_addr, dirty);
167   }
168 }
169 
170 void CardTableBarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
171                                                 Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
172   bool in_heap = (decorators & IN_HEAP) != 0;

173   bool is_array = (decorators & IS_ARRAY) != 0;
174   bool on_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
175   bool precise = is_array || on_anonymous;
176 
177   bool needs_post_barrier = val != noreg && in_heap;
178 
179   BarrierSetAssembler::store_at(masm, decorators, type, dst, val, noreg, noreg, noreg);
180   if (needs_post_barrier) {
181     // flatten object address if needed
182     if (!precise || (dst.index() == noreg && dst.disp() == 0)) {
183       if (tmp3 != noreg) {
184         // Called by MacroAssembler::pack_inline_helper. We cannot corrupt the dst.base() register
185         __ movptr(tmp3, dst.base());
186         store_check(masm, tmp3, dst);
187       } else {
188         // It's OK to corrupt the dst.base() register.
189         store_check(masm, dst.base(), dst);
190       }
191     } else {
192       __ lea(tmp1, dst);
193       store_check(masm, tmp1, dst);
194     }
195   }
196 }
< prev index next >