Skip to content

Commit ea7e722

Browse files
committedNov 20, 2024
8344010: RISC-V: Zacas do not work with LW locking
Reviewed-by: fyang, mli
1 parent e2f8f1a commit ea7e722

File tree

2 files changed

+25
-87
lines changed

2 files changed

+25
-87
lines changed
 

‎src/hotspot/cpu/riscv/macroAssembler_riscv.cpp

+25-77
Original file line numberDiff line numberDiff line change
@@ -3466,15 +3466,27 @@ void MacroAssembler::cmpxchg(Register addr, Register expected,
34663466
assert_different_registers(expected, t0);
34673467
assert_different_registers(new_val, t0);
34683468

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+
34693480
if (UseZacas) {
34703481
if (result_as_bool) {
34713482
mv(t0, expected);
34723483
atomic_cas(t0, new_val, addr, size, acquire, release);
34733484
xorr(t0, t0, expected);
34743485
seqz(result, t0);
34753486
} 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);
34783490
}
34793491
return;
34803492
}
@@ -3510,15 +3522,16 @@ void MacroAssembler::cmpxchg_weak(Register addr, Register expected,
35103522
enum operand_size size,
35113523
Assembler::Aqrl acquire, Assembler::Aqrl release,
35123524
Register result) {
3513-
if (UseZacas) {
3514-
cmpxchg(addr, expected, new_val, size, acquire, release, result, true);
3515-
return;
3516-
}
35173525

35183526
assert_different_registers(addr, t0);
35193527
assert_different_registers(expected, t0);
35203528
assert_different_registers(new_val, t0);
35213529

3530+
if (UseZacas) {
3531+
cmpxchg(addr, expected, new_val, size, acquire, release, result, true);
3532+
return;
3533+
}
3534+
35223535
Label fail, done;
35233536
load_reserved(t0, addr, size, acquire);
35243537
bne(t0, expected, fail);
@@ -3581,83 +3594,18 @@ ATOMIC_XCHGU(xchgalwu, xchgalw)
35813594

35823595
#undef ATOMIC_XCHGU
35833596

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) {
36163599
switch (size) {
36173600
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));
36313602
break;
36323603
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));
36463605
break;
36473606
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);
36613609
break;
36623610
default:
36633611
ShouldNotReachHere();

‎src/hotspot/cpu/riscv/macroAssembler_riscv.hpp

-10
Original file line numberDiff line numberDiff line change
@@ -1175,16 +1175,6 @@ class MacroAssembler: public Assembler {
11751175
void atomic_xchgwu(Register prev, Register newv, Register addr);
11761176
void atomic_xchgalwu(Register prev, Register newv, Register addr);
11771177

1178-
void atomic_cas(Register prev, Register newv, Register addr);
1179-
void atomic_casw(Register prev, Register newv, Register addr);
1180-
void atomic_casl(Register prev, Register newv, Register addr);
1181-
void atomic_caslw(Register prev, Register newv, Register addr);
1182-
void atomic_casal(Register prev, Register newv, Register addr);
1183-
void atomic_casalw(Register prev, Register newv, Register addr);
1184-
void atomic_caswu(Register prev, Register newv, Register addr);
1185-
void atomic_caslwu(Register prev, Register newv, Register addr);
1186-
void atomic_casalwu(Register prev, Register newv, Register addr);
1187-
11881178
void atomic_cas(Register prev, Register newv, Register addr, enum operand_size size,
11891179
Assembler::Aqrl acquire = Assembler::relaxed, Assembler::Aqrl release = Assembler::relaxed);
11901180

1 commit comments

Comments
 (1)

openjdk-notifier[bot] commented on Nov 20, 2024

@openjdk-notifier[bot]
Please sign in to comment.