< prev index next >

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

Print this page

101     AddressLiteral cardtable((address)byte_map_base, relocInfo::none);
102     Address index(noreg, obj, Address::times_1);
103     card_addr = __ as_Address(ArrayAddress(cardtable, index), rscratch1);
104   }
105 
106   int dirty = CardTable::dirty_card_val();
107   if (UseCondCardMark) {
108     Label L_already_dirty;
109     __ cmpb(card_addr, dirty);
110     __ jccb(Assembler::equal, L_already_dirty);
111     __ movb(card_addr, dirty);
112     __ bind(L_already_dirty);
113   } else {
114     __ movb(card_addr, dirty);
115   }
116 }
117 
118 void CardTableBarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
119                                                 Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
120   bool in_heap = (decorators & IN_HEAP) != 0;
121 
122   bool is_array = (decorators & IS_ARRAY) != 0;
123   bool on_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
124   bool precise = is_array || on_anonymous;
125 
126   bool needs_post_barrier = val != noreg && in_heap;
127 
128   BarrierSetAssembler::store_at(masm, decorators, type, dst, val, noreg, noreg, noreg);
129   if (needs_post_barrier) {
130     // flatten object address if needed
131     if (!precise || (dst.index() == noreg && dst.disp() == 0)) {
132       store_check(masm, dst.base(), dst);







133     } else {
134       __ lea(tmp1, dst);
135       store_check(masm, tmp1, dst);
136     }
137   }
138 }

101     AddressLiteral cardtable((address)byte_map_base, relocInfo::none);
102     Address index(noreg, obj, Address::times_1);
103     card_addr = __ as_Address(ArrayAddress(cardtable, index), rscratch1);
104   }
105 
106   int dirty = CardTable::dirty_card_val();
107   if (UseCondCardMark) {
108     Label L_already_dirty;
109     __ cmpb(card_addr, dirty);
110     __ jccb(Assembler::equal, L_already_dirty);
111     __ movb(card_addr, dirty);
112     __ bind(L_already_dirty);
113   } else {
114     __ movb(card_addr, dirty);
115   }
116 }
117 
118 void CardTableBarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
119                                                 Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
120   bool in_heap = (decorators & IN_HEAP) != 0;

121   bool is_array = (decorators & IS_ARRAY) != 0;
122   bool on_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
123   bool precise = is_array || on_anonymous;
124 
125   bool needs_post_barrier = val != noreg && in_heap;
126 
127   BarrierSetAssembler::store_at(masm, decorators, type, dst, val, noreg, noreg, noreg);
128   if (needs_post_barrier) {
129     // flatten object address if needed
130     if (!precise || (dst.index() == noreg && dst.disp() == 0)) {
131       if (tmp3 != noreg) {
132         // Called by MacroAssembler::pack_inline_helper. We cannot corrupt the dst.base() register
133         __ movptr(tmp3, dst.base());
134         store_check(masm, tmp3, dst);
135       } else {
136         // It's OK to corrupt the dst.base() register.
137         store_check(masm, dst.base(), dst);
138       }
139     } else {
140       __ lea(tmp1, dst);
141       store_check(masm, tmp1, dst);
142     }
143   }
144 }
< prev index next >