On 5/20/26 06:58, Philippe Mathieu-Daudé wrote:
Alternatively passing the atomic function by argument to TRANS():

-- >8 --
+typedef void AtomicThreeOpFn(TCGv_i64, TCGv_va, TCGv_i64, TCGArg, MemOp);
+
+static bool do_atomic_ld(DisasContext *ctx, AtomicThreeOpFn *atomic_fn,
+                         int base, int add_reg, int rd, int64_t imm, MemOp mop)
+{
+    TCGv_i64 addr = tcg_temp_new_i64();
+    TCGv_i64 value = tcg_temp_new_i64();
+    TCGv_i64 old = tcg_temp_new_i64();
+    MemOp amo = mo_endian(ctx) | mop | MO_ALIGN;
+
+    gen_base_offset_addr(ctx, addr, base, 0);
+
+    if (add_reg >= 0) {
+        gen_load_gpr(value, add_reg);
+    } else {
+        tcg_gen_movi_i64(value, imm);
+    }

If you're going to tweak that, you might as well do

    if (add_reg >= 0) {
        value = tcg_temp_new_i64();
        gen_load_gpr(value, add_reg);
    } else {
        value = tcg_constant_i64(imm);
    }


r~

Reply via email to