target/arm: Implement FPCR.AH semantics for vector FMIN/FMAX
Implement the FPCR.AH == 1 semantics for vector FMIN/FMAX, by creating new _ah_ versions of the gvec helpers which invoke the scalar fmin_ah and fmax_ah helpers on each element. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
2a734f3fe3
commit
d613e44010
@ -972,6 +972,20 @@ DEF_HELPER_FLAGS_5(gvec_rsqrts_s, TCG_CALL_NO_RWG,
|
||||
DEF_HELPER_FLAGS_5(gvec_rsqrts_d, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, fpst, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_5(gvec_ah_fmax_h, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, fpst, i32)
|
||||
DEF_HELPER_FLAGS_5(gvec_ah_fmax_s, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, fpst, i32)
|
||||
DEF_HELPER_FLAGS_5(gvec_ah_fmax_d, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, fpst, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_5(gvec_ah_fmin_h, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, fpst, i32)
|
||||
DEF_HELPER_FLAGS_5(gvec_ah_fmin_s, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, fpst, i32)
|
||||
DEF_HELPER_FLAGS_5(gvec_ah_fmin_d, TCG_CALL_NO_RWG,
|
||||
void, ptr, ptr, ptr, fpst, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_4(sve_faddv_h, TCG_CALL_NO_RWG,
|
||||
i64, ptr, ptr, fpst, i32)
|
||||
DEF_HELPER_FLAGS_4(sve_faddv_s, TCG_CALL_NO_RWG,
|
||||
|
@ -5596,6 +5596,13 @@ static bool do_fp3_vector(DisasContext *s, arg_qrrr_e *a, int data,
|
||||
FPST_A64_F16 : FPST_A64);
|
||||
}
|
||||
|
||||
static bool do_fp3_vector_2fn(DisasContext *s, arg_qrrr_e *a, int data,
|
||||
gen_helper_gvec_3_ptr * const fnormal[3],
|
||||
gen_helper_gvec_3_ptr * const fah[3])
|
||||
{
|
||||
return do_fp3_vector(s, a, data, s->fpcr_ah ? fah : fnormal);
|
||||
}
|
||||
|
||||
static bool do_fp3_vector_ah(DisasContext *s, arg_qrrr_e *a, int data,
|
||||
gen_helper_gvec_3_ptr * const f[3])
|
||||
{
|
||||
@ -5636,14 +5643,24 @@ static gen_helper_gvec_3_ptr * const f_vector_fmax[3] = {
|
||||
gen_helper_gvec_fmax_s,
|
||||
gen_helper_gvec_fmax_d,
|
||||
};
|
||||
TRANS(FMAX_v, do_fp3_vector, a, 0, f_vector_fmax)
|
||||
static gen_helper_gvec_3_ptr * const f_vector_fmax_ah[3] = {
|
||||
gen_helper_gvec_ah_fmax_h,
|
||||
gen_helper_gvec_ah_fmax_s,
|
||||
gen_helper_gvec_ah_fmax_d,
|
||||
};
|
||||
TRANS(FMAX_v, do_fp3_vector_2fn, a, 0, f_vector_fmax, f_vector_fmax_ah)
|
||||
|
||||
static gen_helper_gvec_3_ptr * const f_vector_fmin[3] = {
|
||||
gen_helper_gvec_fmin_h,
|
||||
gen_helper_gvec_fmin_s,
|
||||
gen_helper_gvec_fmin_d,
|
||||
};
|
||||
TRANS(FMIN_v, do_fp3_vector, a, 0, f_vector_fmin)
|
||||
static gen_helper_gvec_3_ptr * const f_vector_fmin_ah[3] = {
|
||||
gen_helper_gvec_ah_fmin_h,
|
||||
gen_helper_gvec_ah_fmin_s,
|
||||
gen_helper_gvec_ah_fmin_d,
|
||||
};
|
||||
TRANS(FMIN_v, do_fp3_vector_2fn, a, 0, f_vector_fmin, f_vector_fmin_ah)
|
||||
|
||||
static gen_helper_gvec_3_ptr * const f_vector_fmaxnm[3] = {
|
||||
gen_helper_gvec_fmaxnum_h,
|
||||
|
@ -1448,6 +1448,14 @@ DO_3OP(gvec_rsqrts_h, helper_rsqrtsf_f16, float16)
|
||||
DO_3OP(gvec_rsqrts_s, helper_rsqrtsf_f32, float32)
|
||||
DO_3OP(gvec_rsqrts_d, helper_rsqrtsf_f64, float64)
|
||||
|
||||
DO_3OP(gvec_ah_fmax_h, helper_vfp_ah_maxh, float16)
|
||||
DO_3OP(gvec_ah_fmax_s, helper_vfp_ah_maxs, float32)
|
||||
DO_3OP(gvec_ah_fmax_d, helper_vfp_ah_maxd, float64)
|
||||
|
||||
DO_3OP(gvec_ah_fmin_h, helper_vfp_ah_minh, float16)
|
||||
DO_3OP(gvec_ah_fmin_s, helper_vfp_ah_mins, float32)
|
||||
DO_3OP(gvec_ah_fmin_d, helper_vfp_ah_mind, float64)
|
||||
|
||||
#endif
|
||||
#undef DO_3OP
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user