target/arm: Handle FPCR.AH in SVE FNEG
Make SVE FNEG honour the FPCR.AH "don't negate the sign of a NaN" semantics. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
538deec623
commit
47d3216240
@ -545,6 +545,10 @@ DEF_HELPER_FLAGS_4(sve_fneg_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
|||||||
DEF_HELPER_FLAGS_4(sve_fneg_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
DEF_HELPER_FLAGS_4(sve_fneg_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
DEF_HELPER_FLAGS_4(sve_fneg_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
DEF_HELPER_FLAGS_4(sve_fneg_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
|
||||||
|
DEF_HELPER_FLAGS_4(sve_ah_fneg_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
DEF_HELPER_FLAGS_4(sve_ah_fneg_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
DEF_HELPER_FLAGS_4(sve_ah_fneg_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
|
||||||
DEF_HELPER_FLAGS_4(sve_not_zpz_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
DEF_HELPER_FLAGS_4(sve_not_zpz_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
DEF_HELPER_FLAGS_4(sve_not_zpz_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
DEF_HELPER_FLAGS_4(sve_not_zpz_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
DEF_HELPER_FLAGS_4(sve_not_zpz_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
DEF_HELPER_FLAGS_4(sve_not_zpz_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
|
||||||
|
@ -885,6 +885,14 @@ DO_ZPZ(sve_fneg_h, uint16_t, H1_2, DO_FNEG)
|
|||||||
DO_ZPZ(sve_fneg_s, uint32_t, H1_4, DO_FNEG)
|
DO_ZPZ(sve_fneg_s, uint32_t, H1_4, DO_FNEG)
|
||||||
DO_ZPZ_D(sve_fneg_d, uint64_t, DO_FNEG)
|
DO_ZPZ_D(sve_fneg_d, uint64_t, DO_FNEG)
|
||||||
|
|
||||||
|
#define DO_AH_FNEG_H(N) (float16_is_any_nan(N) ? (N) : DO_FNEG(N))
|
||||||
|
#define DO_AH_FNEG_S(N) (float32_is_any_nan(N) ? (N) : DO_FNEG(N))
|
||||||
|
#define DO_AH_FNEG_D(N) (float64_is_any_nan(N) ? (N) : DO_FNEG(N))
|
||||||
|
|
||||||
|
DO_ZPZ(sve_ah_fneg_h, uint16_t, H1_2, DO_AH_FNEG_H)
|
||||||
|
DO_ZPZ(sve_ah_fneg_s, uint32_t, H1_4, DO_AH_FNEG_S)
|
||||||
|
DO_ZPZ_D(sve_ah_fneg_d, uint64_t, DO_AH_FNEG_D)
|
||||||
|
|
||||||
#define DO_NOT(N) (~N)
|
#define DO_NOT(N) (~N)
|
||||||
|
|
||||||
DO_ZPZ(sve_not_zpz_b, uint8_t, H1, DO_NOT)
|
DO_ZPZ(sve_not_zpz_b, uint8_t, H1, DO_NOT)
|
||||||
|
@ -789,7 +789,12 @@ static gen_helper_gvec_3 * const fneg_fns[4] = {
|
|||||||
NULL, gen_helper_sve_fneg_h,
|
NULL, gen_helper_sve_fneg_h,
|
||||||
gen_helper_sve_fneg_s, gen_helper_sve_fneg_d,
|
gen_helper_sve_fneg_s, gen_helper_sve_fneg_d,
|
||||||
};
|
};
|
||||||
TRANS_FEAT(FNEG, aa64_sve, gen_gvec_ool_arg_zpz, fneg_fns[a->esz], a, 0)
|
static gen_helper_gvec_3 * const fneg_ah_fns[4] = {
|
||||||
|
NULL, gen_helper_sve_ah_fneg_h,
|
||||||
|
gen_helper_sve_ah_fneg_s, gen_helper_sve_ah_fneg_d,
|
||||||
|
};
|
||||||
|
TRANS_FEAT(FNEG, aa64_sve, gen_gvec_ool_arg_zpz,
|
||||||
|
s->fpcr_ah ? fneg_ah_fns[a->esz] : fneg_fns[a->esz], a, 0)
|
||||||
|
|
||||||
static gen_helper_gvec_3 * const sxtb_fns[4] = {
|
static gen_helper_gvec_3 * const sxtb_fns[4] = {
|
||||||
NULL, gen_helper_sve_sxtb_h,
|
NULL, gen_helper_sve_sxtb_h,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user