8292867: RISC-V: Simplify weak CAS return value handling
Reviewed-by: yadongwang, fyang
This commit is contained in:
parent
88af204027
commit
f57d34242c
src/hotspot/cpu/riscv
@ -2300,7 +2300,7 @@ void MacroAssembler::cmpxchg_narrow_value(Register addr, Register expected,
|
||||
bnez(tmp, retry);
|
||||
|
||||
if (result_as_bool) {
|
||||
addi(result, zr, 1);
|
||||
li(result, 1);
|
||||
j(done);
|
||||
|
||||
bind(fail);
|
||||
@ -2335,7 +2335,7 @@ void MacroAssembler::weak_cmpxchg_narrow_value(Register addr, Register expected,
|
||||
assert_different_registers(addr, old, mask, not_mask, new_val, expected, shift, tmp);
|
||||
cmpxchg_narrow_value_helper(addr, expected, new_val, size, tmp1, tmp2, tmp3);
|
||||
|
||||
Label succ, fail, done;
|
||||
Label fail, done;
|
||||
|
||||
lr_w(old, aligned_addr, acquire);
|
||||
andr(tmp, old, mask);
|
||||
@ -2344,13 +2344,14 @@ void MacroAssembler::weak_cmpxchg_narrow_value(Register addr, Register expected,
|
||||
andr(tmp, old, not_mask);
|
||||
orr(tmp, tmp, new_val);
|
||||
sc_w(tmp, tmp, aligned_addr, release);
|
||||
beqz(tmp, succ);
|
||||
bnez(tmp, fail);
|
||||
|
||||
bind(fail);
|
||||
addi(result, zr, 1);
|
||||
// Success
|
||||
li(result, 1);
|
||||
j(done);
|
||||
|
||||
bind(succ);
|
||||
// Fail
|
||||
bind(fail);
|
||||
mv(result, zr);
|
||||
|
||||
bind(done);
|
||||
@ -2394,20 +2395,20 @@ void MacroAssembler::cmpxchg_weak(Register addr, Register expected,
|
||||
enum operand_size size,
|
||||
Assembler::Aqrl acquire, Assembler::Aqrl release,
|
||||
Register result) {
|
||||
Label fail, done, sc_done;
|
||||
Label fail, done;
|
||||
load_reserved(addr, size, acquire);
|
||||
bne(t0, expected, fail);
|
||||
store_conditional(addr, new_val, size, release);
|
||||
beqz(t0, sc_done);
|
||||
bnez(t0, fail);
|
||||
|
||||
// fail
|
||||
bind(fail);
|
||||
// Success
|
||||
li(result, 1);
|
||||
j(done);
|
||||
|
||||
// sc_done
|
||||
bind(sc_done);
|
||||
mv(result, 0);
|
||||
// Fail
|
||||
bind(fail);
|
||||
mv(result, zr);
|
||||
|
||||
bind(done);
|
||||
}
|
||||
|
||||
|
@ -5650,14 +5650,13 @@ instruct weakCompareAndSwapB(iRegINoSp res, indirect mem, iRegI_R12 oldval, iReg
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak $mem, $oldval, $newval\t# (byte, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapB"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapB"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ weak_cmpxchg_narrow_value(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int8,
|
||||
/*acquire*/ Assembler::relaxed, /*release*/ Assembler::rl, $res$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5674,14 +5673,13 @@ instruct weakCompareAndSwapS(iRegINoSp res, indirect mem, iRegI_R12 oldval, iReg
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak $mem, $oldval, $newval\t# (short, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapS"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapS"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ weak_cmpxchg_narrow_value(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int16,
|
||||
/*acquire*/ Assembler::relaxed, /*release*/ Assembler::rl, $res$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5695,13 +5693,12 @@ instruct weakCompareAndSwapI(iRegINoSp res, indirect mem, iRegI oldval, iRegI ne
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak $mem, $oldval, $newval\t# (int, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapI"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapI"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpxchg_weak(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int32,
|
||||
/*acquire*/ Assembler::relaxed, /*release*/ Assembler::rl, $res$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5715,13 +5712,12 @@ instruct weakCompareAndSwapL(iRegINoSp res, indirect mem, iRegL oldval, iRegL ne
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak $mem, $oldval, $newval\t# (long, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapL"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapL"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpxchg_weak(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
/*acquire*/ Assembler::relaxed, /*release*/ Assembler::rl, $res$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5735,13 +5731,12 @@ instruct weakCompareAndSwapN(iRegINoSp res, indirect mem, iRegN oldval, iRegN ne
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapN"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapN"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpxchg_weak(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::uint32,
|
||||
/*acquire*/ Assembler::relaxed, /*release*/ Assembler::rl, $res$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5756,13 +5751,12 @@ instruct weakCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP ne
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapP"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapP"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpxchg_weak(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
/*acquire*/ Assembler::relaxed, /*release*/ Assembler::rl, $res$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5781,14 +5775,13 @@ instruct weakCompareAndSwapBAcq(iRegINoSp res, indirect mem, iRegI_R12 oldval, i
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak_acq $mem, $oldval, $newval\t# (byte, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapBAcq"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapBAcq"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ weak_cmpxchg_narrow_value(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int8,
|
||||
/*acquire*/ Assembler::aq, /*release*/ Assembler::rl, $res$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5807,14 +5800,13 @@ instruct weakCompareAndSwapSAcq(iRegINoSp res, indirect mem, iRegI_R12 oldval, i
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak_acq $mem, $oldval, $newval\t# (short, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapSAcq"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapSAcq"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ weak_cmpxchg_narrow_value(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int16,
|
||||
/*acquire*/ Assembler::aq, /*release*/ Assembler::rl, $res$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5830,13 +5822,12 @@ instruct weakCompareAndSwapIAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak_acq $mem, $oldval, $newval\t# (int, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapIAcq"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapIAcq"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpxchg_weak(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int32,
|
||||
/*acquire*/ Assembler::aq, /*release*/ Assembler::rl, $res$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5852,13 +5843,12 @@ instruct weakCompareAndSwapLAcq(iRegINoSp res, indirect mem, iRegL oldval, iRegL
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak_acq $mem, $oldval, $newval\t# (long, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapLAcq"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapLAcq"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpxchg_weak(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
/*acquire*/ Assembler::aq, /*release*/ Assembler::rl, $res$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5874,13 +5864,12 @@ instruct weakCompareAndSwapNAcq(iRegINoSp res, indirect mem, iRegN oldval, iRegN
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak_acq $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapNAcq"
|
||||
"# $res == 1 when success, #@weakCompareAndSwapNAcq"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpxchg_weak(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::uint32,
|
||||
/*acquire*/ Assembler::aq, /*release*/ Assembler::rl, $res$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
@ -5896,13 +5885,12 @@ instruct weakCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP
|
||||
|
||||
format %{
|
||||
"cmpxchg_weak_acq $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval\n\t"
|
||||
"xori $res, $res, 1\t# $res == 1 when success, #@weakCompareAndSwapPAcq"
|
||||
"\t# $res == 1 when success, #@weakCompareAndSwapPAcq"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpxchg_weak(as_Register($mem$$base), $oldval$$Register, $newval$$Register, Assembler::int64,
|
||||
/*acquire*/ Assembler::aq, /*release*/ Assembler::rl, $res$$Register);
|
||||
__ xori($res$$Register, $res$$Register, 1);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_slow);
|
||||
|
Loading…
x
Reference in New Issue
Block a user