target/arm: Implement FPCR.AH semantics for FMINP and FMAXP
Implement the FPCR.AH semantics for the pairwise floating point minimum/maximum insns FMINP and FMAXP. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
bb9330b662
commit
384433e709
@ -986,6 +986,20 @@ DEF_HELPER_FLAGS_5(gvec_ah_fmin_s, TCG_CALL_NO_RWG,
|
|||||||
DEF_HELPER_FLAGS_5(gvec_ah_fmin_d, TCG_CALL_NO_RWG,
|
DEF_HELPER_FLAGS_5(gvec_ah_fmin_d, TCG_CALL_NO_RWG,
|
||||||
void, ptr, ptr, ptr, fpst, i32)
|
void, ptr, ptr, ptr, fpst, i32)
|
||||||
|
|
||||||
|
DEF_HELPER_FLAGS_5(gvec_ah_fmaxp_h, TCG_CALL_NO_RWG,
|
||||||
|
void, ptr, ptr, ptr, fpst, i32)
|
||||||
|
DEF_HELPER_FLAGS_5(gvec_ah_fmaxp_s, TCG_CALL_NO_RWG,
|
||||||
|
void, ptr, ptr, ptr, fpst, i32)
|
||||||
|
DEF_HELPER_FLAGS_5(gvec_ah_fmaxp_d, TCG_CALL_NO_RWG,
|
||||||
|
void, ptr, ptr, ptr, fpst, i32)
|
||||||
|
|
||||||
|
DEF_HELPER_FLAGS_5(gvec_ah_fminp_h, TCG_CALL_NO_RWG,
|
||||||
|
void, ptr, ptr, ptr, fpst, i32)
|
||||||
|
DEF_HELPER_FLAGS_5(gvec_ah_fminp_s, TCG_CALL_NO_RWG,
|
||||||
|
void, ptr, ptr, ptr, fpst, i32)
|
||||||
|
DEF_HELPER_FLAGS_5(gvec_ah_fminp_d, TCG_CALL_NO_RWG,
|
||||||
|
void, ptr, ptr, ptr, fpst, i32)
|
||||||
|
|
||||||
DEF_HELPER_FLAGS_4(sve_faddv_h, TCG_CALL_NO_RWG,
|
DEF_HELPER_FLAGS_4(sve_faddv_h, TCG_CALL_NO_RWG,
|
||||||
i64, ptr, ptr, fpst, i32)
|
i64, ptr, ptr, fpst, i32)
|
||||||
DEF_HELPER_FLAGS_4(sve_faddv_s, TCG_CALL_NO_RWG,
|
DEF_HELPER_FLAGS_4(sve_faddv_s, TCG_CALL_NO_RWG,
|
||||||
|
@ -5765,14 +5765,24 @@ static gen_helper_gvec_3_ptr * const f_vector_fmaxp[3] = {
|
|||||||
gen_helper_gvec_fmaxp_s,
|
gen_helper_gvec_fmaxp_s,
|
||||||
gen_helper_gvec_fmaxp_d,
|
gen_helper_gvec_fmaxp_d,
|
||||||
};
|
};
|
||||||
TRANS(FMAXP_v, do_fp3_vector, a, 0, f_vector_fmaxp)
|
static gen_helper_gvec_3_ptr * const f_vector_ah_fmaxp[3] = {
|
||||||
|
gen_helper_gvec_ah_fmaxp_h,
|
||||||
|
gen_helper_gvec_ah_fmaxp_s,
|
||||||
|
gen_helper_gvec_ah_fmaxp_d,
|
||||||
|
};
|
||||||
|
TRANS(FMAXP_v, do_fp3_vector_2fn, a, 0, f_vector_fmaxp, f_vector_ah_fmaxp)
|
||||||
|
|
||||||
static gen_helper_gvec_3_ptr * const f_vector_fminp[3] = {
|
static gen_helper_gvec_3_ptr * const f_vector_fminp[3] = {
|
||||||
gen_helper_gvec_fminp_h,
|
gen_helper_gvec_fminp_h,
|
||||||
gen_helper_gvec_fminp_s,
|
gen_helper_gvec_fminp_s,
|
||||||
gen_helper_gvec_fminp_d,
|
gen_helper_gvec_fminp_d,
|
||||||
};
|
};
|
||||||
TRANS(FMINP_v, do_fp3_vector, a, 0, f_vector_fminp)
|
static gen_helper_gvec_3_ptr * const f_vector_ah_fminp[3] = {
|
||||||
|
gen_helper_gvec_ah_fminp_h,
|
||||||
|
gen_helper_gvec_ah_fminp_s,
|
||||||
|
gen_helper_gvec_ah_fminp_d,
|
||||||
|
};
|
||||||
|
TRANS(FMINP_v, do_fp3_vector_2fn, a, 0, f_vector_fminp, f_vector_ah_fminp)
|
||||||
|
|
||||||
static gen_helper_gvec_3_ptr * const f_vector_fmaxnmp[3] = {
|
static gen_helper_gvec_3_ptr * const f_vector_fmaxnmp[3] = {
|
||||||
gen_helper_gvec_fmaxnump_h,
|
gen_helper_gvec_fmaxnump_h,
|
||||||
@ -6764,9 +6774,16 @@ static bool do_fp3_scalar_pair(DisasContext *s, arg_rr_e *a, const FPScalar *f)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool do_fp3_scalar_pair_2fn(DisasContext *s, arg_rr_e *a,
|
||||||
|
const FPScalar *fnormal,
|
||||||
|
const FPScalar *fah)
|
||||||
|
{
|
||||||
|
return do_fp3_scalar_pair(s, a, s->fpcr_ah ? fah : fnormal);
|
||||||
|
}
|
||||||
|
|
||||||
TRANS(FADDP_s, do_fp3_scalar_pair, a, &f_scalar_fadd)
|
TRANS(FADDP_s, do_fp3_scalar_pair, a, &f_scalar_fadd)
|
||||||
TRANS(FMAXP_s, do_fp3_scalar_pair, a, &f_scalar_fmax)
|
TRANS(FMAXP_s, do_fp3_scalar_pair_2fn, a, &f_scalar_fmax, &f_scalar_fmax_ah)
|
||||||
TRANS(FMINP_s, do_fp3_scalar_pair, a, &f_scalar_fmin)
|
TRANS(FMINP_s, do_fp3_scalar_pair_2fn, a, &f_scalar_fmin, &f_scalar_fmin_ah)
|
||||||
TRANS(FMAXNMP_s, do_fp3_scalar_pair, a, &f_scalar_fmaxnm)
|
TRANS(FMAXNMP_s, do_fp3_scalar_pair, a, &f_scalar_fmaxnm)
|
||||||
TRANS(FMINNMP_s, do_fp3_scalar_pair, a, &f_scalar_fminnm)
|
TRANS(FMINNMP_s, do_fp3_scalar_pair, a, &f_scalar_fminnm)
|
||||||
|
|
||||||
|
@ -2444,6 +2444,16 @@ DO_3OP_PAIR(gvec_fminnump_h, float16_minnum, float16, H2)
|
|||||||
DO_3OP_PAIR(gvec_fminnump_s, float32_minnum, float32, H4)
|
DO_3OP_PAIR(gvec_fminnump_s, float32_minnum, float32, H4)
|
||||||
DO_3OP_PAIR(gvec_fminnump_d, float64_minnum, float64, )
|
DO_3OP_PAIR(gvec_fminnump_d, float64_minnum, float64, )
|
||||||
|
|
||||||
|
#ifdef TARGET_AARCH64
|
||||||
|
DO_3OP_PAIR(gvec_ah_fmaxp_h, helper_vfp_ah_maxh, float16, H2)
|
||||||
|
DO_3OP_PAIR(gvec_ah_fmaxp_s, helper_vfp_ah_maxs, float32, H4)
|
||||||
|
DO_3OP_PAIR(gvec_ah_fmaxp_d, helper_vfp_ah_maxd, float64, )
|
||||||
|
|
||||||
|
DO_3OP_PAIR(gvec_ah_fminp_h, helper_vfp_ah_minh, float16, H2)
|
||||||
|
DO_3OP_PAIR(gvec_ah_fminp_s, helper_vfp_ah_mins, float32, H4)
|
||||||
|
DO_3OP_PAIR(gvec_ah_fminp_d, helper_vfp_ah_mind, float64, )
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef DO_3OP_PAIR
|
#undef DO_3OP_PAIR
|
||||||
|
|
||||||
#define DO_3OP_PAIR(NAME, FUNC, TYPE, H) \
|
#define DO_3OP_PAIR(NAME, FUNC, TYPE, H) \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user