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:
		@@ -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_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(sub)
 | 
			
		||||
 
 | 
			
		||||
@@ -74,14 +74,14 @@ DEF_HELPER_2(set_user_reg, void, i32, i32)
 | 
			
		||||
DEF_HELPER_1(vfp_get_fpscr, i32, env)
 | 
			
		||||
DEF_HELPER_2(vfp_set_fpscr, void, env, i32)
 | 
			
		||||
 | 
			
		||||
DEF_HELPER_3(vfp_adds, f32, f32, f32, env)
 | 
			
		||||
DEF_HELPER_3(vfp_addd, f64, f64, f64, env)
 | 
			
		||||
DEF_HELPER_3(vfp_subs, f32, f32, f32, env)
 | 
			
		||||
DEF_HELPER_3(vfp_subd, f64, f64, f64, env)
 | 
			
		||||
DEF_HELPER_3(vfp_muls, f32, f32, f32, env)
 | 
			
		||||
DEF_HELPER_3(vfp_muld, f64, f64, f64, env)
 | 
			
		||||
DEF_HELPER_3(vfp_divs, f32, f32, f32, env)
 | 
			
		||||
DEF_HELPER_3(vfp_divd, f64, f64, f64, env)
 | 
			
		||||
DEF_HELPER_3(vfp_adds, f32, f32, f32, ptr)
 | 
			
		||||
DEF_HELPER_3(vfp_addd, f64, f64, f64, ptr)
 | 
			
		||||
DEF_HELPER_3(vfp_subs, f32, f32, f32, ptr)
 | 
			
		||||
DEF_HELPER_3(vfp_subd, f64, f64, f64, ptr)
 | 
			
		||||
DEF_HELPER_3(vfp_muls, f32, f32, f32, ptr)
 | 
			
		||||
DEF_HELPER_3(vfp_muld, f64, f64, f64, ptr)
 | 
			
		||||
DEF_HELPER_3(vfp_divs, f32, f32, f32, ptr)
 | 
			
		||||
DEF_HELPER_3(vfp_divd, f64, f64, f64, ptr)
 | 
			
		||||
DEF_HELPER_1(vfp_negs, f32, f32)
 | 
			
		||||
DEF_HELPER_1(vfp_negd, f64, f64)
 | 
			
		||||
DEF_HELPER_1(vfp_abss, f32, f32)
 | 
			
		||||
 
 | 
			
		||||
@@ -909,10 +909,13 @@ static TCGv_ptr get_fpstatus_ptr(int neon)
 | 
			
		||||
#define VFP_OP2(name)                                                 \
 | 
			
		||||
static inline void gen_vfp_##name(int dp)                             \
 | 
			
		||||
{                                                                     \
 | 
			
		||||
    if (dp)                                                           \
 | 
			
		||||
        gen_helper_vfp_##name##d(cpu_F0d, cpu_F0d, cpu_F1d, cpu_env); \
 | 
			
		||||
    else                                                              \
 | 
			
		||||
        gen_helper_vfp_##name##s(cpu_F0s, cpu_F0s, cpu_F1s, cpu_env); \
 | 
			
		||||
    TCGv_ptr fpst = get_fpstatus_ptr(0);                              \
 | 
			
		||||
    if (dp) {                                                         \
 | 
			
		||||
        gen_helper_vfp_##name##d(cpu_F0d, cpu_F0d, cpu_F1d, fpst);    \
 | 
			
		||||
    } else {                                                          \
 | 
			
		||||
        gen_helper_vfp_##name##s(cpu_F0s, cpu_F0s, cpu_F1s, fpst);    \
 | 
			
		||||
    }                                                                 \
 | 
			
		||||
    tcg_temp_free_ptr(fpst);                                          \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VFP_OP2(add)
 | 
			
		||||
@@ -925,11 +928,13 @@ VFP_OP2(div)
 | 
			
		||||
static inline void gen_vfp_F1_mul(int dp)
 | 
			
		||||
{
 | 
			
		||||
    /* Like gen_vfp_mul() but put result in F1 */
 | 
			
		||||
    TCGv_ptr fpst = get_fpstatus_ptr(0);
 | 
			
		||||
    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 {
 | 
			
		||||
        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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user