Skip to content

Commit 4678b70

Browse files
committed
fix: o174 CompareAndExchangeN === o168 o169 o23 o268 [[ o175 o176 o181 o262 o264 o267 o219 4 8 12 18 42 ]]
1 parent 6a776ed commit 4678b70

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

src/hotspot/cpu/s390/s390.ad

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5560,6 +5560,38 @@ instruct compareAndSwapN_bool(iRegP mem_ptr, rarg5RegN oldval, iRegN_P2N newval,
55605560
ins_pipe(pipe_class_dummy);
55615561
%}
55625562

5563+
instruct compareAndExchangeN(iRegN res, iRegP mem_ptr, rarg5RegN oldval, iRegN_P2N newval, flagsReg cr) %{
5564+
match(Set res (CompareAndExchangeN mem_ptr (Binary oldval newval)));
5565+
predicate(n->as_LoadStore()->barrier_data() == 0);
5566+
effect(TEMP_DEF res, USE mem_ptr, USE_KILL oldval, KILL cr);
5567+
format %{ "$res = CompareAndExchangeN $oldval,$newval,$mem_ptr" %}
5568+
ins_encode %{
5569+
Register Rcomp = reg_to_register_object($oldval$$reg);
5570+
Register Rnew = reg_to_register_object($newval$$reg);
5571+
Register Raddr = reg_to_register_object($mem_ptr$$reg);
5572+
Register Rres = reg_to_register_object($res$$reg);
5573+
__ z_lr(Rres, Rcomp);
5574+
__ z_cs(Rres, Rnew, 0, Raddr);
5575+
%}
5576+
ins_pipe(pipe_class_dummy);
5577+
%}
5578+
5579+
instruct compareAndExchangeP(iRegP res, iRegP mem_ptr, rarg5RegP oldval, iRegP_N2P newval, flagsReg cr) %{
5580+
match(Set res (CompareAndExchangeP mem_ptr (Binary oldval newval)));
5581+
predicate(n->as_LoadStore()->barrier_data() == 0);
5582+
effect(TEMP_DEF res, USE mem_ptr, USE_KILL oldval, KILL cr);
5583+
format %{ "$res = CompareAndExchangeP $oldval,$newval,$mem_ptr" %}
5584+
ins_encode %{
5585+
Register Rcomp = reg_to_register_object($oldval$$reg);
5586+
Register Rnew = reg_to_register_object($newval$$reg);
5587+
Register Raddr = reg_to_register_object($mem_ptr$$reg);
5588+
Register Rres = reg_to_register_object($res$$reg);
5589+
__ z_lgr(Rres, Rcomp);
5590+
__ z_csg(Rres, Rnew, 0, Raddr);
5591+
%}
5592+
ins_pipe(pipe_class_dummy);
5593+
%}
5594+
55635595
//----------Atomic operations on memory (GetAndSet*, GetAndAdd*)---------------
55645596

55655597
// Exploit: direct memory arithmetic

0 commit comments

Comments
 (0)