mirror of https://gitee.com/openkylin/qemu.git
target-arm: Move arm_rmode_to_sf to a shared location.
This function will be needed for AArch32 ARMv8 support, so move it to helper.c where it can be used by both targets. Also moves the code out of line, but as it is quite a large function I don't believe this should be a significant performance impact. Signed-off-by: Will Newton <will.newton@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
2cdaca90dd
commit
9972da669f
|
@ -496,6 +496,8 @@ enum arm_fprounding {
|
|||
FPROUNDING_ODD
|
||||
};
|
||||
|
||||
int arm_rmode_to_sf(int rmode);
|
||||
|
||||
enum arm_cpu_mode {
|
||||
ARM_CPU_MODE_USR = 0x10,
|
||||
ARM_CPU_MODE_FIQ = 0x11,
|
||||
|
|
|
@ -4418,3 +4418,31 @@ float64 HELPER(rintd)(float64 x, void *fp_status)
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Convert ARM rounding mode to softfloat */
|
||||
int arm_rmode_to_sf(int rmode)
|
||||
{
|
||||
switch (rmode) {
|
||||
case FPROUNDING_TIEAWAY:
|
||||
rmode = float_round_ties_away;
|
||||
break;
|
||||
case FPROUNDING_ODD:
|
||||
/* FIXME: add support for TIEAWAY and ODD */
|
||||
qemu_log_mask(LOG_UNIMP, "arm: unimplemented rounding mode: %d\n",
|
||||
rmode);
|
||||
case FPROUNDING_TIEEVEN:
|
||||
default:
|
||||
rmode = float_round_nearest_even;
|
||||
break;
|
||||
case FPROUNDING_POSINF:
|
||||
rmode = float_round_up;
|
||||
break;
|
||||
case FPROUNDING_NEGINF:
|
||||
rmode = float_round_down;
|
||||
break;
|
||||
case FPROUNDING_ZERO:
|
||||
rmode = float_round_to_zero;
|
||||
break;
|
||||
}
|
||||
return rmode;
|
||||
}
|
||||
|
|
|
@ -3608,34 +3608,6 @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
|
|||
}
|
||||
}
|
||||
|
||||
/* Convert ARM rounding mode to softfloat */
|
||||
static inline int arm_rmode_to_sf(int rmode)
|
||||
{
|
||||
switch (rmode) {
|
||||
case FPROUNDING_TIEAWAY:
|
||||
rmode = float_round_ties_away;
|
||||
break;
|
||||
case FPROUNDING_ODD:
|
||||
/* FIXME: add support for TIEAWAY and ODD */
|
||||
qemu_log_mask(LOG_UNIMP, "arm: unimplemented rounding mode: %d\n",
|
||||
rmode);
|
||||
case FPROUNDING_TIEEVEN:
|
||||
default:
|
||||
rmode = float_round_nearest_even;
|
||||
break;
|
||||
case FPROUNDING_POSINF:
|
||||
rmode = float_round_up;
|
||||
break;
|
||||
case FPROUNDING_NEGINF:
|
||||
rmode = float_round_down;
|
||||
break;
|
||||
case FPROUNDING_ZERO:
|
||||
rmode = float_round_to_zero;
|
||||
break;
|
||||
}
|
||||
return rmode;
|
||||
}
|
||||
|
||||
static void handle_fp_compare(DisasContext *s, bool is_double,
|
||||
unsigned int rn, unsigned int rm,
|
||||
bool cmp_with_zero, bool signal_all_nans)
|
||||
|
|
Loading…
Reference in New Issue