|
From: | Greg Bellows |
Subject: | Re: [Qemu-devel] [PATCH] target-arm: Squash input denormals in FRECPS and FRSQRTS |
Date: | Fri, 30 Jan 2015 08:21:23 -0600 |
On Thu, Jan 29, 2015 at 8:31 PM, Peter Maydell <address@hidden> wrote:
> The helper functions for FRECPS and FRSQRTS have special case
> handling that includes checks for zero inputs, so squash input
> denormals if necessary before those checks. This fixes incorrect
> output when the FPCR DZ bit is set to enable squashing of input
> denormals.
>
> Signed-off-by: Peter Maydell <address@hidden>
Tested-by: Laurent Desnogues <address@hidden>
Thanks,
Laurent
> ---
> A quick eyeball of helper-a64.c suggests that these are the only
> other insns we needed to fix, and a risu test of these insns
> confirms that (a) they're buggy and (b) this patch fixes them.
> I haven't done an exhaustive coverage test of the whole instruction
> set with the DZ bit set, though...
>
> target-arm/helper-a64.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/target-arm/helper-a64.c b/target-arm/helper-a64.c
> index ebd9247..8aa40e9 100644
> --- a/target-arm/helper-a64.c
> +++ b/target-arm/helper-a64.c
> @@ -229,6 +229,9 @@ float32 HELPER(recpsf_f32)(float32 a, float32 b, void *fpstp)
> {
> float_status *fpst = fpstp;
>
> + a = float32_squash_input_denormal(a, fpst);
> + b = float32_squash_input_denormal(b, fpst);
> +
> a = float32_chs(a);
> if ((float32_is_infinity(a) && float32_is_zero(b)) ||
> (float32_is_infinity(b) && float32_is_zero(a))) {
> @@ -241,6 +244,9 @@ float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp)
> {
> float_status *fpst = fpstp;
>
> + a = float64_squash_input_denormal(a, fpst);
> + b = float64_squash_input_denormal(b, fpst);
> +
> a = float64_chs(a);
> if ((float64_is_infinity(a) && float64_is_zero(b)) ||
> (float64_is_infinity(b) && float64_is_zero(a))) {
> @@ -253,6 +259,9 @@ float32 HELPER(rsqrtsf_f32)(float32 a, float32 b, void *fpstp)
> {
> float_status *fpst = fpstp;
>
> + a = float32_squash_input_denormal(a, fpst);
> + b = float32_squash_input_denormal(b, fpst);
> +
> a = float32_chs(a);
> if ((float32_is_infinity(a) && float32_is_zero(b)) ||
> (float32_is_infinity(b) && float32_is_zero(a))) {
> @@ -265,6 +274,9 @@ float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, void *fpstp)
> {
> float_status *fpst = fpstp;
>
> + a = float64_squash_input_denormal(a, fpst);
> + b = float64_squash_input_denormal(b, fpst);
> +
> a = float64_chs(a);
> if ((float64_is_infinity(a) && float64_is_zero(b)) ||
> (float64_is_infinity(b) && float64_is_zero(a))) {
> --
> 1.9.1
>
>
[Prev in Thread] | Current Thread | [Next in Thread] |