summaryrefslogtreecommitdiffstats
path: root/target/arm/translate-vfp.c.inc
diff options
context:
space:
mode:
authorPeter Maydell2020-10-13 12:35:32 +0200
committerPeter Maydell2020-10-20 17:12:00 +0200
commit61db12d9f9eb36761edba4d9a414cd8dd34c512b (patch)
tree942f5a69b6dbba7847b679ea36c40798d5fb6abc /target/arm/translate-vfp.c.inc
parenttarget/arm: Fix SMLAD incorrect setting of Q bit (diff)
downloadqemu-61db12d9f9eb36761edba4d9a414cd8dd34c512b.tar.gz
qemu-61db12d9f9eb36761edba4d9a414cd8dd34c512b.tar.xz
qemu-61db12d9f9eb36761edba4d9a414cd8dd34c512b.zip
target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest
For AArch32, unlike the VCVT of integer to float, which honours the rounding mode specified by the FPSCR, VCVT of fixed-point to float is always round-to-nearest. (AArch64 fixed-point-to-float conversions always honour the FPCR rounding mode.) Implement this by providing _round_to_nearest versions of the relevant helpers which set the rounding mode temporarily when making the call to the underlying softfloat function. We only need to change the VFP VCVT instructions, because the standard- FPSCR value used by the Neon VCVT is always set to round-to-nearest, so we don't need to do the extra work of saving and restoring the rounding mode. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20201013103532.13391-1-peter.maydell@linaro.org
Diffstat (limited to 'target/arm/translate-vfp.c.inc')
-rw-r--r--target/arm/translate-vfp.c.inc24
1 files changed, 12 insertions, 12 deletions
diff --git a/target/arm/translate-vfp.c.inc b/target/arm/translate-vfp.c.inc
index 28e0dba5f1..9b11b81f80 100644
--- a/target/arm/translate-vfp.c.inc
+++ b/target/arm/translate-vfp.c.inc
@@ -3141,16 +3141,16 @@ static bool trans_VCVT_fix_hp(DisasContext *s, arg_VCVT_fix_sp *a)
/* Switch on op:U:sx bits */
switch (a->opc) {
case 0:
- gen_helper_vfp_shtoh(vd, vd, shift, fpst);
+ gen_helper_vfp_shtoh_round_to_nearest(vd, vd, shift, fpst);
break;
case 1:
- gen_helper_vfp_sltoh(vd, vd, shift, fpst);
+ gen_helper_vfp_sltoh_round_to_nearest(vd, vd, shift, fpst);
break;
case 2:
- gen_helper_vfp_uhtoh(vd, vd, shift, fpst);
+ gen_helper_vfp_uhtoh_round_to_nearest(vd, vd, shift, fpst);
break;
case 3:
- gen_helper_vfp_ultoh(vd, vd, shift, fpst);
+ gen_helper_vfp_ultoh_round_to_nearest(vd, vd, shift, fpst);
break;
case 4:
gen_helper_vfp_toshh_round_to_zero(vd, vd, shift, fpst);
@@ -3200,16 +3200,16 @@ static bool trans_VCVT_fix_sp(DisasContext *s, arg_VCVT_fix_sp *a)
/* Switch on op:U:sx bits */
switch (a->opc) {
case 0:
- gen_helper_vfp_shtos(vd, vd, shift, fpst);
+ gen_helper_vfp_shtos_round_to_nearest(vd, vd, shift, fpst);
break;
case 1:
- gen_helper_vfp_sltos(vd, vd, shift, fpst);
+ gen_helper_vfp_sltos_round_to_nearest(vd, vd, shift, fpst);
break;
case 2:
- gen_helper_vfp_uhtos(vd, vd, shift, fpst);
+ gen_helper_vfp_uhtos_round_to_nearest(vd, vd, shift, fpst);
break;
case 3:
- gen_helper_vfp_ultos(vd, vd, shift, fpst);
+ gen_helper_vfp_ultos_round_to_nearest(vd, vd, shift, fpst);
break;
case 4:
gen_helper_vfp_toshs_round_to_zero(vd, vd, shift, fpst);
@@ -3265,16 +3265,16 @@ static bool trans_VCVT_fix_dp(DisasContext *s, arg_VCVT_fix_dp *a)
/* Switch on op:U:sx bits */
switch (a->opc) {
case 0:
- gen_helper_vfp_shtod(vd, vd, shift, fpst);
+ gen_helper_vfp_shtod_round_to_nearest(vd, vd, shift, fpst);
break;
case 1:
- gen_helper_vfp_sltod(vd, vd, shift, fpst);
+ gen_helper_vfp_sltod_round_to_nearest(vd, vd, shift, fpst);
break;
case 2:
- gen_helper_vfp_uhtod(vd, vd, shift, fpst);
+ gen_helper_vfp_uhtod_round_to_nearest(vd, vd, shift, fpst);
break;
case 3:
- gen_helper_vfp_ultod(vd, vd, shift, fpst);
+ gen_helper_vfp_ultod_round_to_nearest(vd, vd, shift, fpst);
break;
case 4:
gen_helper_vfp_toshd_round_to_zero(vd, vd, shift, fpst);