Patchwork [1/2] softfloat: Fix uint64_to_float64

login
register
mail settings
Submitter Richard Henderson
Date Dec. 7, 2012, 9:52 p.m.
Message ID <1354917127-29718-2-git-send-email-rth@twiddle.net>
Download mbox | patch
Permalink /patch/204613/
State New
Headers show

Comments

Richard Henderson - Dec. 7, 2012, 9:52 p.m.
The interface to normalizeRoundAndPackFloat64 requires that the
high bit be clear.  Perform one shift-right-and-jam if needed.

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 fpu/softfloat.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
Peter Maydell - Dec. 8, 2012, 10:42 a.m.
On 7 December 2012 21:52, Richard Henderson <rth@twiddle.net> wrote:
> The interface to normalizeRoundAndPackFloat64 requires that the
> high bit be clear.  Perform one shift-right-and-jam if needed.
>
> Signed-off-by: Richard Henderson <rth@twiddle.net>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Andreas Färber - Dec. 8, 2012, 2:48 p.m.
Am 07.12.2012 22:52, schrieb Richard Henderson:
> The interface to normalizeRoundAndPackFloat64 requires that the
> high bit be clear.  Perform one shift-right-and-jam if needed.
> 
> Signed-off-by: Richard Henderson <rth@twiddle.net>
> ---
>  fpu/softfloat.c | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/fpu/softfloat.c b/fpu/softfloat.c
> index 8413146..62830d7 100644
> --- a/fpu/softfloat.c
> +++ b/fpu/softfloat.c
> @@ -1273,9 +1273,14 @@ float64 int64_to_float64( int64 a STATUS_PARAM )
>  
>  float64 uint64_to_float64( uint64 a STATUS_PARAM )
>  {
> -    if ( a == 0 ) return float64_zero;
> -    return normalizeRoundAndPackFloat64( 0, 0x43C, a STATUS_VAR );
> +    int exp =  0x43C;

Extra space before number.

>  
> +    if ( a == 0 ) return float64_zero;
> +    if ( (int64_t)a < 0 ) {
> +        shift64RightJamming(a, 1, &a);
> +        exp += 1;
> +    }
> +    return normalizeRoundAndPackFloat64( 0, exp, a STATUS_VAR );
>  }
>  
>  /*----------------------------------------------------------------------------

Shouldn't we be updating the Coding Style on all lines we touch? The
shift line matches it but the normalize and ifs don't.

Andreas
Peter Maydell - Dec. 8, 2012, 4:08 p.m.
On 8 December 2012 14:48, Andreas Färber <afaerber@suse.de> wrote:
> Shouldn't we be updating the Coding Style on all lines we touch? The
> shift line matches it but the normalize and ifs don't.

fpu/ is a special case because the softfloat library has such
a bonkers coding style. I tend to update to qemu standard when
I touch bits of it, but following the existing practice is
also OK in my opinion.

-- PMM
Andreas Färber - Dec. 8, 2012, 5:05 p.m.
Am 08.12.2012 17:08, schrieb Peter Maydell:
> On 8 December 2012 14:48, Andreas Färber <afaerber@suse.de> wrote:
>> Shouldn't we be updating the Coding Style on all lines we touch? The
>> shift line matches it but the normalize and ifs don't.
> 
> fpu/ is a special case because the softfloat library has such
> a bonkers coding style. I tend to update to qemu standard when
> I touch bits of it, but following the existing practice is
> also OK in my opinion.

The same applies to linux-user and much of ppc code (spaces before
parenthesis, no braces). The only agreed-on way to address this is by
fixing the parts we touch - no veto here, but seems trivial enough to
fix. Otherwise the situation won't ever improve.

Andreas

Patch

diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 8413146..62830d7 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -1273,9 +1273,14 @@  float64 int64_to_float64( int64 a STATUS_PARAM )
 
 float64 uint64_to_float64( uint64 a STATUS_PARAM )
 {
-    if ( a == 0 ) return float64_zero;
-    return normalizeRoundAndPackFloat64( 0, 0x43C, a STATUS_VAR );
+    int exp =  0x43C;
 
+    if ( a == 0 ) return float64_zero;
+    if ( (int64_t)a < 0 ) {
+        shift64RightJamming(a, 1, &a);
+        exp += 1;
+    }
+    return normalizeRoundAndPackFloat64( 0, exp, a STATUS_VAR );
 }
 
 /*----------------------------------------------------------------------------