target/arm: Copy entire float_status in is_ebf
Now that float_status has a bunch of fp parameters, it is easier to copy an existing structure than create one from scratch. Begin by copying the structure that corresponds to the FPSR and make only the adjustments required for BFloat16 semantics. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20241203203949.483774-2-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
46eb7b92db
commit
47aa9001d8
@ -2813,25 +2813,19 @@ bool is_ebf(CPUARMState *env, float_status *statusp, float_status *oddstatusp)
|
||||
* no effect on AArch32 instructions.
|
||||
*/
|
||||
bool ebf = is_a64(env) && env->vfp.fpcr & FPCR_EBF;
|
||||
*statusp = (float_status){
|
||||
.tininess_before_rounding = float_tininess_before_rounding,
|
||||
.float_rounding_mode = float_round_to_odd_inf,
|
||||
.flush_to_zero = true,
|
||||
.flush_inputs_to_zero = true,
|
||||
.default_nan_mode = true,
|
||||
};
|
||||
|
||||
*statusp = env->vfp.fp_status;
|
||||
set_default_nan_mode(true, statusp);
|
||||
|
||||
if (ebf) {
|
||||
float_status *fpst = &env->vfp.fp_status;
|
||||
set_flush_to_zero(get_flush_to_zero(fpst), statusp);
|
||||
set_flush_inputs_to_zero(get_flush_inputs_to_zero(fpst), statusp);
|
||||
set_float_rounding_mode(get_float_rounding_mode(fpst), statusp);
|
||||
|
||||
/* EBF=1 needs to do a step with round-to-odd semantics */
|
||||
*oddstatusp = *statusp;
|
||||
set_float_rounding_mode(float_round_to_odd, oddstatusp);
|
||||
} else {
|
||||
set_flush_to_zero(true, statusp);
|
||||
set_flush_inputs_to_zero(true, statusp);
|
||||
set_float_rounding_mode(float_round_to_odd_inf, statusp);
|
||||
}
|
||||
|
||||
return ebf;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user