@rr_i14s2 .... .... .............. rj:5 rd:5 &rr_i imm=%i14s2
@rr_i16 .... .. imm:s16 rj:5 rd:5 &rr_i
@rr_i16s2 .... .. ................ rj:5 rd:5 &rr_i imm=%offs16
+@rr_i0 .... .. ................ rj:5 rd:5 &rr_i imm=0
@hint_r_i12 .... ...... imm:s12 rj:5 hint:5 &hint_r_i
@hint_rr .... ........ ..... rk:5 rj:5 hint:5 &hint_rr
@rrr_sa2p1 .... ........ ... .. rk:5 rj:5 rd:5 &rrr_sa sa=%sa2p1
sc_w 0010 0001 .............. ..... ..... @rr_i14s2
ll_d 0010 0010 .............. ..... ..... @rr_i14s2
sc_d 0010 0011 .............. ..... ..... @rr_i14s2
+llacq_w 0011 10000101 01111 00000 ..... ..... @rr_i0
+screl_w 0011 10000101 01111 00001 ..... ..... @rr_i0
+llacq_d 0011 10000101 01111 00010 ..... ..... @rr_i0
+screl_d 0011 10000101 01111 00011 ..... ..... @rr_i0
amcas_b 0011 10000101 10000 ..... ..... ..... @rrr
amcas_h 0011 10000101 10001 ..... ..... ..... @rrr
amcas_w 0011 10000101 10010 ..... ..... ..... @rrr
* Copyright (c) 2021 Loongson Technology Corporation Limited
*/
-static bool gen_ll(DisasContext *ctx, arg_rr_i *a, MemOp mop)
+static bool gen_ll(DisasContext *ctx, arg_rr_i *a, MemOp mop, bool acq)
{
TCGv t1 = tcg_temp_new();
TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
tcg_gen_st_tl(t1, tcg_env, offsetof(CPULoongArchState, llval));
gen_set_gpr(a->rd, t1, EXT_NONE);
+ if (acq) {
+ tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ);
+ }
+
return true;
}
-static bool gen_sc(DisasContext *ctx, arg_rr_i *a, MemOp mop)
+static bool gen_sc(DisasContext *ctx, arg_rr_i *a, MemOp mop, bool rel)
{
TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
TCGLabel *done = gen_new_label();
tcg_gen_addi_tl(t0, src1, a->imm);
+
+ if (rel) {
+ tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL);
+ }
tcg_gen_brcond_tl(TCG_COND_EQ, t0, cpu_lladdr, l1);
tcg_gen_movi_tl(dest, 0);
tcg_gen_br(done);
return true;
}
-TRANS(ll_w, ALL, gen_ll, MO_LESL)
-TRANS(sc_w, ALL, gen_sc, MO_LESL)
-TRANS(ll_d, 64, gen_ll, MO_LEUQ)
-TRANS(sc_d, 64, gen_sc, MO_LEUQ)
+TRANS(ll_w, ALL, gen_ll, MO_LESL, false)
+TRANS(sc_w, ALL, gen_sc, MO_LESL, false)
+TRANS(ll_d, 64, gen_ll, MO_LEUQ, false)
+TRANS(sc_d, 64, gen_sc, MO_LEUQ, false)
+TRANS(llacq_w, LLACQ_SCREL, gen_ll, MO_LESL, true)
+TRANS(screl_w, LLACQ_SCREL, gen_sc, MO_LESL, true)
+TRANS(llacq_d, LLACQ_SCREL_64, gen_ll, MO_LEUQ, true)
+TRANS(screl_d, LLACQ_SCREL_64, gen_sc, MO_LEUQ, true)
TRANS(amcas_b, LAMCAS, gen_cas, tcg_gen_atomic_cmpxchg_tl, MO_SB)
TRANS(amcas_h, LAMCAS, gen_cas, tcg_gen_atomic_cmpxchg_tl, MO_LESW)
TRANS(amcas_w, LAMCAS, gen_cas, tcg_gen_atomic_cmpxchg_tl, MO_LESL)