mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 18:23:57 -06:00
target/ppc: Use tcg_gen_qemu_{ld,st}_i128 for LQARX, LQ, STQ
No need to roll our own, as this is now provided by tcg. This was the last use of retxl, so remove that too. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
333c813b06
commit
57b38ffd0c
5 changed files with 11 additions and 132 deletions
|
@ -72,7 +72,7 @@ static bool do_ldst_quad(DisasContext *ctx, arg_D *a, bool store, bool prefixed)
|
|||
#if defined(TARGET_PPC64)
|
||||
TCGv ea;
|
||||
TCGv_i64 low_addr_gpr, high_addr_gpr;
|
||||
MemOp mop;
|
||||
TCGv_i128 t16;
|
||||
|
||||
REQUIRE_INSNS_FLAGS(ctx, 64BX);
|
||||
|
||||
|
@ -101,51 +101,14 @@ static bool do_ldst_quad(DisasContext *ctx, arg_D *a, bool store, bool prefixed)
|
|||
low_addr_gpr = cpu_gpr[a->rt + 1];
|
||||
high_addr_gpr = cpu_gpr[a->rt];
|
||||
}
|
||||
t16 = tcg_temp_new_i128();
|
||||
|
||||
if (tb_cflags(ctx->base.tb) & CF_PARALLEL) {
|
||||
if (HAVE_ATOMIC128) {
|
||||
mop = DEF_MEMOP(MO_128);
|
||||
TCGv_i32 oi = tcg_constant_i32(make_memop_idx(mop, ctx->mem_idx));
|
||||
if (store) {
|
||||
if (ctx->le_mode) {
|
||||
gen_helper_stq_le_parallel(cpu_env, ea, low_addr_gpr,
|
||||
high_addr_gpr, oi);
|
||||
} else {
|
||||
gen_helper_stq_be_parallel(cpu_env, ea, high_addr_gpr,
|
||||
low_addr_gpr, oi);
|
||||
|
||||
}
|
||||
} else {
|
||||
if (ctx->le_mode) {
|
||||
gen_helper_lq_le_parallel(low_addr_gpr, cpu_env, ea, oi);
|
||||
tcg_gen_ld_i64(high_addr_gpr, cpu_env,
|
||||
offsetof(CPUPPCState, retxh));
|
||||
} else {
|
||||
gen_helper_lq_be_parallel(high_addr_gpr, cpu_env, ea, oi);
|
||||
tcg_gen_ld_i64(low_addr_gpr, cpu_env,
|
||||
offsetof(CPUPPCState, retxh));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Restart with exclusive lock. */
|
||||
gen_helper_exit_atomic(cpu_env);
|
||||
ctx->base.is_jmp = DISAS_NORETURN;
|
||||
}
|
||||
if (store) {
|
||||
tcg_gen_concat_i64_i128(t16, low_addr_gpr, high_addr_gpr);
|
||||
tcg_gen_qemu_st_i128(t16, ea, ctx->mem_idx, DEF_MEMOP(MO_128));
|
||||
} else {
|
||||
mop = DEF_MEMOP(MO_UQ);
|
||||
if (store) {
|
||||
tcg_gen_qemu_st_i64(low_addr_gpr, ea, ctx->mem_idx, mop);
|
||||
} else {
|
||||
tcg_gen_qemu_ld_i64(low_addr_gpr, ea, ctx->mem_idx, mop);
|
||||
}
|
||||
|
||||
gen_addr_add(ctx, ea, ea, 8);
|
||||
|
||||
if (store) {
|
||||
tcg_gen_qemu_st_i64(high_addr_gpr, ea, ctx->mem_idx, mop);
|
||||
} else {
|
||||
tcg_gen_qemu_ld_i64(high_addr_gpr, ea, ctx->mem_idx, mop);
|
||||
}
|
||||
tcg_gen_qemu_ld_i128(t16, ea, ctx->mem_idx, DEF_MEMOP(MO_128));
|
||||
tcg_gen_extr_i128_i64(low_addr_gpr, high_addr_gpr, t16);
|
||||
}
|
||||
#else
|
||||
qemu_build_not_reached();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue