@ -123,7 +123,7 @@ uint32_t vfp_get_fpsr_from_host(CPUARMState *env)
a64_flags | = ( get_float_exception_flags ( & env - > vfp . fp_status [ FPST_A64_F16 ] )
& ~ ( float_flag_input_denormal_flushed | float_flag_input_denormal_used ) ) ;
/*
* We do not merge in flags from FPST_AH or FPST_AH_F16 , because
* We do not merge in flags from FPST_ { AH , ZA } or FPST_ { AH , ZA } _F16 , because
* they are used for insns that must not set the cumulative exception bits .
*/
@ -196,6 +196,8 @@ void vfp_set_fpcr_to_host(CPUARMState *env, uint32_t val, uint32_t mask)
set_float_rounding_mode ( i , & env - > vfp . fp_status [ FPST_A64 ] ) ;
set_float_rounding_mode ( i , & env - > vfp . fp_status [ FPST_A32_F16 ] ) ;
set_float_rounding_mode ( i , & env - > vfp . fp_status [ FPST_A64_F16 ] ) ;
set_float_rounding_mode ( i , & env - > vfp . fp_status [ FPST_ZA ] ) ;
set_float_rounding_mode ( i , & env - > vfp . fp_status [ FPST_ZA_F16 ] ) ;
}
if ( changed & FPCR_FZ16 ) {
bool ftz_enabled = val & FPCR_FZ16 ;
@ -203,15 +205,18 @@ void vfp_set_fpcr_to_host(CPUARMState *env, uint32_t val, uint32_t mask)
set_flush_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_A64_F16 ] ) ;
set_flush_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_STD_F16 ] ) ;
set_flush_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_AH_F16 ] ) ;
set_flush_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_ZA_F16 ] ) ;
set_flush_inputs_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_A32_F16 ] ) ;
set_flush_inputs_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_A64_F16 ] ) ;
set_flush_inputs_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_STD_F16 ] ) ;
set_flush_inputs_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_AH_F16 ] ) ;
set_flush_inputs_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_ZA_F16 ] ) ;
}
if ( changed & FPCR_FZ ) {
bool ftz_enabled = val & FPCR_FZ ;
set_flush_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_A32 ] ) ;
set_flush_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_A64 ] ) ;
set_flush_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_ZA ] ) ;
/* FIZ is A64 only so FZ always makes A32 code flush inputs to zero */
set_flush_inputs_to_zero ( ftz_enabled , & env - > vfp . fp_status [ FPST_A32 ] ) ;
}
@ -223,6 +228,7 @@ void vfp_set_fpcr_to_host(CPUARMState *env, uint32_t val, uint32_t mask)
bool fitz_enabled = ( val & FPCR_FIZ ) | |
( val & ( FPCR_FZ | FPCR_AH ) ) = = FPCR_FZ ;
set_flush_inputs_to_zero ( fitz_enabled , & env - > vfp . fp_status [ FPST_A64 ] ) ;
set_flush_inputs_to_zero ( fitz_enabled , & env - > vfp . fp_status [ FPST_ZA ] ) ;
}
if ( changed & FPCR_DN ) {
bool dnan_enabled = val & FPCR_DN ;
@ -240,9 +246,13 @@ void vfp_set_fpcr_to_host(CPUARMState *env, uint32_t val, uint32_t mask)
/* Change behaviours for A64 FP operations */
arm_set_ah_fp_behaviours ( & env - > vfp . fp_status [ FPST_A64 ] ) ;
arm_set_ah_fp_behaviours ( & env - > vfp . fp_status [ FPST_A64_F16 ] ) ;
arm_set_ah_fp_behaviours ( & env - > vfp . fp_status [ FPST_ZA ] ) ;
arm_set_ah_fp_behaviours ( & env - > vfp . fp_status [ FPST_ZA_F16 ] ) ;
} else {
arm_set_default_fp_behaviours ( & env - > vfp . fp_status [ FPST_A64 ] ) ;
arm_set_default_fp_behaviours ( & env - > vfp . fp_status [ FPST_A64_F16 ] ) ;
arm_set_default_fp_behaviours ( & env - > vfp . fp_status [ FPST_ZA ] ) ;
arm_set_default_fp_behaviours ( & env - > vfp . fp_status [ FPST_ZA_F16 ] ) ;
}
}
/*