@@ -3466,15 +3466,27 @@ void MacroAssembler::cmpxchg(Register addr, Register expected,
3466
3466
assert_different_registers (expected, t0);
3467
3467
assert_different_registers (new_val, t0);
3468
3468
3469
+ // NOTE:
3470
+ // Register _result_ may be the same register as _new_val_ or _expected_.
3471
+ // Hence do NOT use _result_ until after 'cas'.
3472
+ //
3473
+ // Register _expected_ may be the same register as _new_val_ and is assumed to be preserved.
3474
+ // Hence do NOT change _expected_ or _new_val_.
3475
+ //
3476
+ // Having _expected_ and _new_val_ being the same register is a very puzzling cas.
3477
+ //
3478
+ // TODO: Address these issues.
3479
+
3469
3480
if (UseZacas) {
3470
3481
if (result_as_bool) {
3471
3482
mv (t0, expected);
3472
3483
atomic_cas (t0, new_val, addr, size, acquire, release);
3473
3484
xorr (t0, t0, expected);
3474
3485
seqz (result, t0);
3475
3486
} else {
3476
- mv (result, expected);
3477
- atomic_cas (result, new_val, addr, size, acquire, release);
3487
+ mv (t0, expected);
3488
+ atomic_cas (t0, new_val, addr, size, acquire, release);
3489
+ mv (result, t0);
3478
3490
}
3479
3491
return ;
3480
3492
}
@@ -3510,15 +3522,16 @@ void MacroAssembler::cmpxchg_weak(Register addr, Register expected,
3510
3522
enum operand_size size,
3511
3523
Assembler::Aqrl acquire, Assembler::Aqrl release,
3512
3524
Register result) {
3513
- if (UseZacas) {
3514
- cmpxchg (addr, expected, new_val, size, acquire, release, result, true );
3515
- return ;
3516
- }
3517
3525
3518
3526
assert_different_registers (addr, t0);
3519
3527
assert_different_registers (expected, t0);
3520
3528
assert_different_registers (new_val, t0);
3521
3529
3530
+ if (UseZacas) {
3531
+ cmpxchg (addr, expected, new_val, size, acquire, release, result, true );
3532
+ return ;
3533
+ }
3534
+
3522
3535
Label fail, done;
3523
3536
load_reserved (t0, addr, size, acquire);
3524
3537
bne (t0, expected, fail);
@@ -3581,83 +3594,18 @@ ATOMIC_XCHGU(xchgalwu, xchgalw)
3581
3594
3582
3595
#undef ATOMIC_XCHGU
3583
3596
3584
- #define ATOMIC_CAS (OP, AOP, ACQUIRE, RELEASE ) \
3585
- void MacroAssembler::atomic_##OP(Register prev, Register newv, Register addr) { \
3586
- assert (UseZacas, " invariant" ); \
3587
- prev = prev->is_valid () ? prev : zr; \
3588
- AOP (prev, addr, newv, (Assembler::Aqrl)(ACQUIRE | RELEASE)); \
3589
- return ; \
3590
- }
3591
-
3592
- ATOMIC_CAS (cas, amocas_d, Assembler::relaxed, Assembler::relaxed)
3593
- ATOMIC_CAS(casw, amocas_w, Assembler::relaxed, Assembler::relaxed)
3594
- ATOMIC_CAS(casl, amocas_d, Assembler::relaxed, Assembler::rl)
3595
- ATOMIC_CAS(caslw, amocas_w, Assembler::relaxed, Assembler::rl)
3596
- ATOMIC_CAS(casal, amocas_d, Assembler::aq, Assembler::rl)
3597
- ATOMIC_CAS(casalw, amocas_w, Assembler::aq, Assembler::rl)
3598
-
3599
- #undef ATOMIC_CAS
3600
-
3601
- #define ATOMIC_CASU (OP1, OP2 ) \
3602
- void MacroAssembler::atomic_##OP1(Register prev, Register newv, Register addr) { \
3603
- atomic_##OP2 (prev, newv, addr); \
3604
- zero_extend (prev, prev, 32 ); \
3605
- return ; \
3606
- }
3607
-
3608
- ATOMIC_CASU (caswu, casw)
3609
- ATOMIC_CASU(caslwu, caslw)
3610
- ATOMIC_CASU(casalwu, casalw)
3611
-
3612
- #undef ATOMIC_CASU
3613
-
3614
- void MacroAssembler::atomic_cas (
3615
- Register prev, Register newv, Register addr, enum operand_size size, Assembler::Aqrl acquire, Assembler::Aqrl release) {
3597
+ void MacroAssembler::atomic_cas (Register prev, Register newv, Register addr,
3598
+ enum operand_size size, Assembler::Aqrl acquire, Assembler::Aqrl release) {
3616
3599
switch (size) {
3617
3600
case int64:
3618
- switch ((Assembler::Aqrl)(acquire | release)) {
3619
- case Assembler::relaxed:
3620
- atomic_cas (prev, newv, addr);
3621
- break ;
3622
- case Assembler::rl:
3623
- atomic_casl (prev, newv, addr);
3624
- break ;
3625
- case Assembler::aqrl:
3626
- atomic_casal (prev, newv, addr);
3627
- break ;
3628
- default :
3629
- ShouldNotReachHere ();
3630
- }
3601
+ amocas_d (prev, addr, newv, (Assembler::Aqrl)(acquire | release));
3631
3602
break ;
3632
3603
case int32:
3633
- switch ((Assembler::Aqrl)(acquire | release)) {
3634
- case Assembler::relaxed:
3635
- atomic_casw (prev, newv, addr);
3636
- break ;
3637
- case Assembler::rl:
3638
- atomic_caslw (prev, newv, addr);
3639
- break ;
3640
- case Assembler::aqrl:
3641
- atomic_casalw (prev, newv, addr);
3642
- break ;
3643
- default :
3644
- ShouldNotReachHere ();
3645
- }
3604
+ amocas_w (prev, addr, newv, (Assembler::Aqrl)(acquire | release));
3646
3605
break ;
3647
3606
case uint32:
3648
- switch ((Assembler::Aqrl)(acquire | release)) {
3649
- case Assembler::relaxed:
3650
- atomic_caswu (prev, newv, addr);
3651
- break ;
3652
- case Assembler::rl:
3653
- atomic_caslwu (prev, newv, addr);
3654
- break ;
3655
- case Assembler::aqrl:
3656
- atomic_casalwu (prev, newv, addr);
3657
- break ;
3658
- default :
3659
- ShouldNotReachHere ();
3660
- }
3607
+ amocas_w (prev, addr, newv, (Assembler::Aqrl)(acquire | release));
3608
+ zero_extend (prev, prev, 32 );
3661
3609
break ;
3662
3610
default :
3663
3611
ShouldNotReachHere ();
1 commit comments
openjdk-notifier[bot] commentedon Nov 20, 2024
Review
Issues