Commit 2a4e6c1b authored by Richard Henderson's avatar Richard Henderson Committed by David Gibson
Browse files

target/ppc: Split out gen_load_locked



Leave only the minimal amount of code within the LDAR macro,
moving the rest of the code into gen_load_locked.  Use MO_ALIGN
and remove the explicit call to gen_check_align.

Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
parent d8b86898
Loading
Loading
Loading
Loading
+18 −17
Original line number Original line Diff line number Diff line
@@ -3070,23 +3070,24 @@ static void gen_isync(DisasContext *ctx)


#define MEMOP_GET_SIZE(x)  (1 << ((x) & MO_SIZE))
#define MEMOP_GET_SIZE(x)  (1 << ((x) & MO_SIZE))


static void gen_load_locked(DisasContext *ctx, TCGMemOp memop)
{
    TCGv gpr = cpu_gpr[rD(ctx->opcode)];
    TCGv t0 = tcg_temp_new();

    gen_set_access_type(ctx, ACCESS_RES);
    gen_addr_reg_index(ctx, t0);
    tcg_gen_qemu_ld_tl(gpr, t0, ctx->mem_idx, memop | MO_ALIGN);
    tcg_gen_mov_tl(cpu_reserve, t0);
    tcg_gen_mov_tl(cpu_reserve_val, gpr);
    tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ);
    tcg_temp_free(t0);
}

#define LARX(name, memop)                  \
#define LARX(name, memop)                  \
static void gen_##name(DisasContext *ctx)  \
static void gen_##name(DisasContext *ctx)  \
{                                          \
{                                          \
    TCGv t0;                                                         \
    gen_load_locked(ctx, memop);           \
    TCGv gpr = cpu_gpr[rD(ctx->opcode)];                             \
    int len = MEMOP_GET_SIZE(memop);                                 \
    gen_set_access_type(ctx, ACCESS_RES);                            \
    t0 = tcg_temp_local_new();                                       \
    gen_addr_reg_index(ctx, t0);                                     \
    if ((len) > 1) {                                                 \
        gen_check_align(ctx, t0, (len)-1);                           \
    }                                                                \
    tcg_gen_qemu_ld_tl(gpr, t0, ctx->mem_idx, memop);                \
    tcg_gen_mov_tl(cpu_reserve, t0);                                 \
    tcg_gen_mov_tl(cpu_reserve_val, gpr);                            \
    tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ);                           \
    tcg_temp_free(t0);                                               \
}
}


/* lwarx */
/* lwarx */