@@ -291,25 +291,34 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
291
291
__ testb (gc_state, ShenandoahHeap::HAS_FORWARDED);
292
292
__ jcc (Assembler::zero, heap_stable);
293
293
294
- Register tmp1 = noreg;
294
+ Register tmp1 = noreg, tmp2 = noreg ;
295
295
if (kind == ShenandoahBarrierSet::AccessKind::NORMAL) {
296
296
// Test for object in cset
297
- // Allocate tmp-reg.
297
+ // Allocate temporary registers
298
298
for (int i = 0 ; i < 8 ; i++) {
299
299
Register r = as_Register (i);
300
300
if (r != rsp && r != rbp && r != dst && r != src.base () && r != src.index ()) {
301
- tmp1 = r;
302
- break ;
301
+ if (tmp1 == noreg) {
302
+ tmp1 = r;
303
+ } else {
304
+ tmp2 = r;
305
+ break ;
306
+ }
303
307
}
304
308
}
309
+ assert (tmp1 != noreg, " tmp1 allocated" );
310
+ assert (tmp2 != noreg, " tmp2 allocated" );
311
+ assert_different_registers (tmp1, tmp2, src.base (), src.index ());
312
+ assert_different_registers (tmp1, tmp2, dst);
313
+
305
314
__ push (tmp1);
306
- assert_different_registers (tmp1, src.base (), src.index ());
307
- assert_different_registers (tmp1, dst);
315
+ __ push (tmp2);
308
316
309
317
// Optimized cset-test
310
318
__ movptr (tmp1, dst);
311
319
__ shrptr (tmp1, ShenandoahHeapRegion::region_size_bytes_shift_jint ());
312
- __ movbool (tmp1, Address (tmp1, (intptr_t ) ShenandoahHeap::in_cset_fast_test_addr (), Address::times_1));
320
+ __ movptr (tmp2, (intptr_t ) ShenandoahHeap::in_cset_fast_test_addr ());
321
+ __ movbool (tmp1, Address (tmp1, tmp2, Address::times_1));
313
322
__ testbool (tmp1);
314
323
__ jcc (Assembler::zero, not_cset);
315
324
}
@@ -333,28 +342,38 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
333
342
#endif
334
343
assert (slot == 0 , " must use all slots" );
335
344
336
- Register tmp2 = (dst == rsi) ? rdx : rsi;
337
- assert_different_registers (dst, tmp2);
338
- __ lea (tmp2, src);
345
+ // Shuffle registers such that dst is in c_rarg0 and addr in c_rarg1.
346
+ #ifdef _LP64
347
+ Register arg0 = c_rarg0, arg1 = c_rarg1;
348
+ #else
349
+ Register arg0 = rdi, arg1 = rsi;
350
+ #endif
351
+ if (dst == arg1) {
352
+ __ lea (arg0, src);
353
+ __ xchgptr (arg1, arg0);
354
+ } else {
355
+ __ lea (arg1, src);
356
+ __ movptr (arg0, dst);
357
+ }
339
358
340
359
save_xmm_registers (masm);
341
360
switch (kind) {
342
361
case ShenandoahBarrierSet::AccessKind::NORMAL:
343
362
if (UseCompressedOops) {
344
- __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_narrow), dst, tmp2 );
363
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_narrow), arg0, arg1 );
345
364
} else {
346
- __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier), dst, tmp2 );
365
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier), arg0, arg1 );
347
366
}
348
367
break ;
349
368
case ShenandoahBarrierSet::AccessKind::WEAK:
350
369
if (UseCompressedOops) {
351
- __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow), dst, tmp2 );
370
+ __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow), arg0, arg1 );
352
371
} else {
353
- __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), dst, tmp2 );
372
+ __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), arg0, arg1 );
354
373
}
355
374
break ;
356
375
case ShenandoahBarrierSet::AccessKind::NATIVE:
357
- __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), dst, tmp2 );
376
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), arg0, arg1 );
358
377
break ;
359
378
default :
360
379
ShouldNotReachHere ();
@@ -383,6 +402,7 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
383
402
__ bind (not_cset);
384
403
385
404
if (kind == ShenandoahBarrierSet::AccessKind::NORMAL) {
405
+ __ pop (tmp2);
386
406
__ pop (tmp1);
387
407
}
388
408
0 commit comments