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:
Peter Maydell 2011-05-25 14:51:48 +00:00
parent 5aaebd13da
commit ae1857eca2
3 changed files with 25 additions and 18 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)