@@ -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