165 }
166 } else {
167 __ lea(rdx, obj);
168 }
169
170 Register rtmp = LP64_ONLY(r8) NOT_LP64(rsi);
171 Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx);
172
173 NOT_LP64(__ get_thread(rcx));
174 NOT_LP64(__ save_bcp());
175
176 __ g1_write_barrier_pre(rdx /* obj */,
177 rbx /* pre_val */,
178 rthread /* thread */,
179 rtmp /* tmp */,
180 val != noreg /* tosca_live */,
181 false /* expand_call */);
182 if (val == noreg) {
183 __ store_heap_oop_null(Address(rdx, 0));
184 } else {
185 // G1 barrier needs uncompressed oop for region cross check.
186 Register new_val = val;
187 if (UseCompressedOops) {
188 new_val = rbx;
189 __ movptr(new_val, val);
190 }
191 // For Shenandoah, make sure we only store refs into to-space.
192 oopDesc::bs()->interpreter_read_barrier(_masm, val);
193
194 __ store_heap_oop(Address(rdx, 0), val);
195 __ g1_write_barrier_post(rdx /* store_adr */,
196 new_val /* new_val */,
197 rthread /* thread */,
198 rtmp /* tmp */,
199 rbx /* tmp2 */);
200 }
201 NOT_LP64( __ restore_bcp());
202 }
203 break;
204 #endif // INCLUDE_ALL_GCS
205 case BarrierSet::CardTableForRS:
206 case BarrierSet::CardTableExtension:
207 {
208 if (val == noreg) {
209 __ store_heap_oop_null(obj);
210 } else {
211 __ store_heap_oop(obj, val);
212 // flatten object address if needed
213 if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
214 __ store_check(obj.base());
215 } else {
216 __ lea(rdx, obj);
217 __ store_check(rdx);
218 }
219 }
|
165 }
166 } else {
167 __ lea(rdx, obj);
168 }
169
170 Register rtmp = LP64_ONLY(r8) NOT_LP64(rsi);
171 Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx);
172
173 NOT_LP64(__ get_thread(rcx));
174 NOT_LP64(__ save_bcp());
175
176 __ g1_write_barrier_pre(rdx /* obj */,
177 rbx /* pre_val */,
178 rthread /* thread */,
179 rtmp /* tmp */,
180 val != noreg /* tosca_live */,
181 false /* expand_call */);
182 if (val == noreg) {
183 __ store_heap_oop_null(Address(rdx, 0));
184 } else {
185 // For Shenandoah, make sure we only store refs into to-space.
186 oopDesc::bs()->interpreter_read_barrier(_masm, val);
187
188 // G1 barrier needs uncompressed oop for region cross check.
189 Register new_val = val;
190 if (UseCompressedOops) {
191 new_val = rbx;
192 __ movptr(new_val, val);
193 }
194
195 __ store_heap_oop(Address(rdx, 0), val);
196 if (UseG1GC) {
197 __ g1_write_barrier_post(rdx /* store_adr */,
198 new_val /* new_val */,
199 rthread /* thread */,
200 rtmp /* tmp */,
201 rbx /* tmp2 */);
202 } else {
203 assert(UseShenandoahGC, "sanity");
204 __ shenandoah_write_barrier_post(rdx /* store_adr */,
205 new_val /* new_val */,
206 rthread /* thread */,
207 rtmp /* tmp */,
208 rbx /* tmp2 */);
209 }
210 }
211 NOT_LP64( __ restore_bcp());
212 }
213 break;
214 #endif // INCLUDE_ALL_GCS
215 case BarrierSet::CardTableForRS:
216 case BarrierSet::CardTableExtension:
217 {
218 if (val == noreg) {
219 __ store_heap_oop_null(obj);
220 } else {
221 __ store_heap_oop(obj, val);
222 // flatten object address if needed
223 if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
224 __ store_check(obj.base());
225 } else {
226 __ lea(rdx, obj);
227 __ store_check(rdx);
228 }
229 }
|