target/sparc: Merge LDFSR, LDXFSR implementations
Combine the helper to a single set_fsr(). Perform the mask and merge inline. Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
3d3c06737b
commit
da68140604
@ -382,20 +382,7 @@ static void set_fsr(CPUSPARCState *env, target_ulong fsr)
|
|||||||
set_float_rounding_mode(rnd_mode, &env->fp_status);
|
set_float_rounding_mode(rnd_mode, &env->fp_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
target_ulong helper_ldfsr(CPUSPARCState *env, target_ulong old_fsr,
|
void helper_set_fsr(CPUSPARCState *env, target_ulong fsr)
|
||||||
uint32_t new_fsr)
|
|
||||||
{
|
{
|
||||||
old_fsr = (new_fsr & FSR_LDFSR_MASK) | (old_fsr & FSR_LDFSR_OLDMASK);
|
set_fsr(env, fsr);
|
||||||
set_fsr(env, old_fsr);
|
|
||||||
return old_fsr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TARGET_SPARC64
|
|
||||||
target_ulong helper_ldxfsr(CPUSPARCState *env, target_ulong old_fsr,
|
|
||||||
uint64_t new_fsr)
|
|
||||||
{
|
|
||||||
old_fsr = (new_fsr & FSR_LDXFSR_MASK) | (old_fsr & FSR_LDXFSR_OLDMASK);
|
|
||||||
set_fsr(env, old_fsr);
|
|
||||||
return old_fsr;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
@ -42,7 +42,7 @@ DEF_HELPER_FLAGS_4(ld_asi, TCG_CALL_NO_WG, i64, env, tl, int, i32)
|
|||||||
DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
|
DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
|
||||||
#endif
|
#endif
|
||||||
DEF_HELPER_FLAGS_1(check_ieee_exceptions, TCG_CALL_NO_WG, tl, env)
|
DEF_HELPER_FLAGS_1(check_ieee_exceptions, TCG_CALL_NO_WG, tl, env)
|
||||||
DEF_HELPER_FLAGS_3(ldfsr, TCG_CALL_NO_RWG, tl, env, tl, i32)
|
DEF_HELPER_FLAGS_2(set_fsr, TCG_CALL_NO_RWG, void, env, tl)
|
||||||
DEF_HELPER_FLAGS_1(fabss, TCG_CALL_NO_RWG_SE, f32, f32)
|
DEF_HELPER_FLAGS_1(fabss, TCG_CALL_NO_RWG_SE, f32, f32)
|
||||||
DEF_HELPER_FLAGS_2(fsqrts, TCG_CALL_NO_RWG, f32, env, f32)
|
DEF_HELPER_FLAGS_2(fsqrts, TCG_CALL_NO_RWG, f32, env, f32)
|
||||||
DEF_HELPER_FLAGS_2(fsqrtd, TCG_CALL_NO_RWG, f64, env, f64)
|
DEF_HELPER_FLAGS_2(fsqrtd, TCG_CALL_NO_RWG, f64, env, f64)
|
||||||
@ -54,7 +54,6 @@ DEF_HELPER_FLAGS_1(fsqrtq, TCG_CALL_NO_RWG, void, env)
|
|||||||
DEF_HELPER_FLAGS_1(fcmpq, TCG_CALL_NO_WG, tl, env)
|
DEF_HELPER_FLAGS_1(fcmpq, TCG_CALL_NO_WG, tl, env)
|
||||||
DEF_HELPER_FLAGS_1(fcmpeq, TCG_CALL_NO_WG, tl, env)
|
DEF_HELPER_FLAGS_1(fcmpeq, TCG_CALL_NO_WG, tl, env)
|
||||||
#ifdef TARGET_SPARC64
|
#ifdef TARGET_SPARC64
|
||||||
DEF_HELPER_FLAGS_3(ldxfsr, TCG_CALL_NO_RWG, tl, env, tl, i64)
|
|
||||||
DEF_HELPER_FLAGS_1(fabsd, TCG_CALL_NO_RWG_SE, f64, f64)
|
DEF_HELPER_FLAGS_1(fabsd, TCG_CALL_NO_RWG_SE, f64, f64)
|
||||||
DEF_HELPER_FLAGS_3(fcmps_fcc1, TCG_CALL_NO_WG, tl, env, f32, f32)
|
DEF_HELPER_FLAGS_3(fcmps_fcc1, TCG_CALL_NO_WG, tl, env, f32, f32)
|
||||||
DEF_HELPER_FLAGS_3(fcmps_fcc2, TCG_CALL_NO_WG, tl, env, f32, f32)
|
DEF_HELPER_FLAGS_3(fcmps_fcc2, TCG_CALL_NO_WG, tl, env, f32, f32)
|
||||||
|
@ -45,7 +45,6 @@
|
|||||||
# define gen_helper_clear_softint(E, S) qemu_build_not_reached()
|
# define gen_helper_clear_softint(E, S) qemu_build_not_reached()
|
||||||
# define gen_helper_done(E) qemu_build_not_reached()
|
# define gen_helper_done(E) qemu_build_not_reached()
|
||||||
# define gen_helper_flushw(E) qemu_build_not_reached()
|
# define gen_helper_flushw(E) qemu_build_not_reached()
|
||||||
# define gen_helper_ldxfsr(D, E, A, B) qemu_build_not_reached()
|
|
||||||
# define gen_helper_rdccr(D, E) qemu_build_not_reached()
|
# define gen_helper_rdccr(D, E) qemu_build_not_reached()
|
||||||
# define gen_helper_rdcwp(D, E) qemu_build_not_reached()
|
# define gen_helper_rdcwp(D, E) qemu_build_not_reached()
|
||||||
# define gen_helper_restored(E) qemu_build_not_reached()
|
# define gen_helper_restored(E) qemu_build_not_reached()
|
||||||
@ -63,6 +62,8 @@
|
|||||||
# define gen_helper_write_softint(E, S) qemu_build_not_reached()
|
# define gen_helper_write_softint(E, S) qemu_build_not_reached()
|
||||||
# define gen_helper_wrpil(E, S) qemu_build_not_reached()
|
# define gen_helper_wrpil(E, S) qemu_build_not_reached()
|
||||||
# define gen_helper_wrpstate(E, S) qemu_build_not_reached()
|
# define gen_helper_wrpstate(E, S) qemu_build_not_reached()
|
||||||
|
# define FSR_LDXFSR_MASK 0
|
||||||
|
# define FSR_LDXFSR_OLDMASK 0
|
||||||
# define MAXTL_MASK 0
|
# define MAXTL_MASK 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -4675,44 +4676,27 @@ static bool trans_STDFQ(DisasContext *dc, arg_STDFQ *a)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool trans_LDFSR(DisasContext *dc, arg_r_r_ri *a)
|
static bool do_ldfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop,
|
||||||
|
target_ulong new_mask, target_ulong old_mask)
|
||||||
{
|
{
|
||||||
TCGv addr;
|
TCGv tmp, addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm);
|
||||||
TCGv_i32 tmp;
|
|
||||||
|
|
||||||
addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm);
|
|
||||||
if (addr == NULL) {
|
if (addr == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (gen_trap_ifnofpu(dc)) {
|
if (gen_trap_ifnofpu(dc)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
tmp = tcg_temp_new_i32();
|
tmp = tcg_temp_new();
|
||||||
tcg_gen_qemu_ld_i32(tmp, addr, dc->mem_idx, MO_TEUL | MO_ALIGN);
|
tcg_gen_qemu_ld_tl(tmp, addr, dc->mem_idx, mop | MO_ALIGN);
|
||||||
gen_helper_ldfsr(cpu_fsr, tcg_env, cpu_fsr, tmp);
|
tcg_gen_andi_tl(tmp, tmp, new_mask);
|
||||||
|
tcg_gen_andi_tl(cpu_fsr, cpu_fsr, old_mask);
|
||||||
|
tcg_gen_or_tl(cpu_fsr, cpu_fsr, tmp);
|
||||||
|
gen_helper_set_fsr(tcg_env, cpu_fsr);
|
||||||
return advance_pc(dc);
|
return advance_pc(dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool trans_LDXFSR(DisasContext *dc, arg_r_r_ri *a)
|
TRANS(LDFSR, ALL, do_ldfsr, a, MO_TEUL, FSR_LDFSR_MASK, FSR_LDFSR_OLDMASK)
|
||||||
{
|
TRANS(LDXFSR, 64, do_ldfsr, a, MO_TEUQ, FSR_LDXFSR_MASK, FSR_LDXFSR_OLDMASK)
|
||||||
TCGv addr;
|
|
||||||
TCGv_i64 tmp;
|
|
||||||
|
|
||||||
if (!avail_64(dc)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm);
|
|
||||||
if (addr == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (gen_trap_ifnofpu(dc)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
tmp = tcg_temp_new_i64();
|
|
||||||
tcg_gen_qemu_ld_i64(tmp, addr, dc->mem_idx, MO_TEUQ | MO_ALIGN);
|
|
||||||
gen_helper_ldxfsr(cpu_fsr, tcg_env, cpu_fsr, tmp);
|
|
||||||
return advance_pc(dc);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool do_stfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop)
|
static bool do_stfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user