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