mirror of https://gitee.com/openkylin/qemu.git
target-arm: Make VFP binop helpers take pointer to fpstatus, not CPUState
Make the VFP binop helper functions take a pointer to the fp status, not the entire CPUState. This will allow us to use them for Neon operations too. Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
5aaebd13da
commit
ae1857eca2
|
@ -2453,13 +2453,15 @@ void vfp_set_fpscr(CPUState *env, uint32_t val)
|
||||||
#define VFP_HELPER(name, p) HELPER(glue(glue(vfp_,name),p))
|
#define VFP_HELPER(name, p) HELPER(glue(glue(vfp_,name),p))
|
||||||
|
|
||||||
#define VFP_BINOP(name) \
|
#define VFP_BINOP(name) \
|
||||||
float32 VFP_HELPER(name, s)(float32 a, float32 b, CPUState *env) \
|
float32 VFP_HELPER(name, s)(float32 a, float32 b, void *fpstp) \
|
||||||
{ \
|
{ \
|
||||||
return float32_ ## name (a, b, &env->vfp.fp_status); \
|
float_status *fpst = fpstp; \
|
||||||
|
return float32_ ## name(a, b, fpst); \
|
||||||
} \
|
} \
|
||||||
float64 VFP_HELPER(name, d)(float64 a, float64 b, CPUState *env) \
|
float64 VFP_HELPER(name, d)(float64 a, float64 b, void *fpstp) \
|
||||||
{ \
|
{ \
|
||||||
return float64_ ## name (a, b, &env->vfp.fp_status); \
|
float_status *fpst = fpstp; \
|
||||||
|
return float64_ ## name(a, b, fpst); \
|
||||||
}
|
}
|
||||||
VFP_BINOP(add)
|
VFP_BINOP(add)
|
||||||
VFP_BINOP(sub)
|
VFP_BINOP(sub)
|
||||||
|
|
|
@ -74,14 +74,14 @@ DEF_HELPER_2(set_user_reg, void, i32, i32)
|
||||||
DEF_HELPER_1(vfp_get_fpscr, i32, env)
|
DEF_HELPER_1(vfp_get_fpscr, i32, env)
|
||||||
DEF_HELPER_2(vfp_set_fpscr, void, env, i32)
|
DEF_HELPER_2(vfp_set_fpscr, void, env, i32)
|
||||||
|
|
||||||
DEF_HELPER_3(vfp_adds, f32, f32, f32, env)
|
DEF_HELPER_3(vfp_adds, f32, f32, f32, ptr)
|
||||||
DEF_HELPER_3(vfp_addd, f64, f64, f64, env)
|
DEF_HELPER_3(vfp_addd, f64, f64, f64, ptr)
|
||||||
DEF_HELPER_3(vfp_subs, f32, f32, f32, env)
|
DEF_HELPER_3(vfp_subs, f32, f32, f32, ptr)
|
||||||
DEF_HELPER_3(vfp_subd, f64, f64, f64, env)
|
DEF_HELPER_3(vfp_subd, f64, f64, f64, ptr)
|
||||||
DEF_HELPER_3(vfp_muls, f32, f32, f32, env)
|
DEF_HELPER_3(vfp_muls, f32, f32, f32, ptr)
|
||||||
DEF_HELPER_3(vfp_muld, f64, f64, f64, env)
|
DEF_HELPER_3(vfp_muld, f64, f64, f64, ptr)
|
||||||
DEF_HELPER_3(vfp_divs, f32, f32, f32, env)
|
DEF_HELPER_3(vfp_divs, f32, f32, f32, ptr)
|
||||||
DEF_HELPER_3(vfp_divd, f64, f64, f64, env)
|
DEF_HELPER_3(vfp_divd, f64, f64, f64, ptr)
|
||||||
DEF_HELPER_1(vfp_negs, f32, f32)
|
DEF_HELPER_1(vfp_negs, f32, f32)
|
||||||
DEF_HELPER_1(vfp_negd, f64, f64)
|
DEF_HELPER_1(vfp_negd, f64, f64)
|
||||||
DEF_HELPER_1(vfp_abss, f32, f32)
|
DEF_HELPER_1(vfp_abss, f32, f32)
|
||||||
|
|
|
@ -909,10 +909,13 @@ static TCGv_ptr get_fpstatus_ptr(int neon)
|
||||||
#define VFP_OP2(name) \
|
#define VFP_OP2(name) \
|
||||||
static inline void gen_vfp_##name(int dp) \
|
static inline void gen_vfp_##name(int dp) \
|
||||||
{ \
|
{ \
|
||||||
if (dp) \
|
TCGv_ptr fpst = get_fpstatus_ptr(0); \
|
||||||
gen_helper_vfp_##name##d(cpu_F0d, cpu_F0d, cpu_F1d, cpu_env); \
|
if (dp) { \
|
||||||
else \
|
gen_helper_vfp_##name##d(cpu_F0d, cpu_F0d, cpu_F1d, fpst); \
|
||||||
gen_helper_vfp_##name##s(cpu_F0s, cpu_F0s, cpu_F1s, cpu_env); \
|
} else { \
|
||||||
|
gen_helper_vfp_##name##s(cpu_F0s, cpu_F0s, cpu_F1s, fpst); \
|
||||||
|
} \
|
||||||
|
tcg_temp_free_ptr(fpst); \
|
||||||
}
|
}
|
||||||
|
|
||||||
VFP_OP2(add)
|
VFP_OP2(add)
|
||||||
|
@ -925,11 +928,13 @@ VFP_OP2(div)
|
||||||
static inline void gen_vfp_F1_mul(int dp)
|
static inline void gen_vfp_F1_mul(int dp)
|
||||||
{
|
{
|
||||||
/* Like gen_vfp_mul() but put result in F1 */
|
/* Like gen_vfp_mul() but put result in F1 */
|
||||||
|
TCGv_ptr fpst = get_fpstatus_ptr(0);
|
||||||
if (dp) {
|
if (dp) {
|
||||||
gen_helper_vfp_muld(cpu_F1d, cpu_F0d, cpu_F1d, cpu_env);
|
gen_helper_vfp_muld(cpu_F1d, cpu_F0d, cpu_F1d, fpst);
|
||||||
} else {
|
} else {
|
||||||
gen_helper_vfp_muls(cpu_F1s, cpu_F0s, cpu_F1s, cpu_env);
|
gen_helper_vfp_muls(cpu_F1s, cpu_F0s, cpu_F1s, fpst);
|
||||||
}
|
}
|
||||||
|
tcg_temp_free_ptr(fpst);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gen_vfp_F1_neg(int dp)
|
static inline void gen_vfp_F1_neg(int dp)
|
||||||
|
|
Loading…
Reference in New Issue