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~