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 }
|