[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [PATCH] powerpc: use float64 for frsqrte

From: Tom Musta
Subject: Re: [Qemu-ppc] [PATCH] powerpc: use float64 for frsqrte
Date: Tue, 03 Jun 2014 14:14:03 -0500
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0

On 6/3/2014 8:43 AM, Tristan Gingold wrote:
> On 03 Jun 2014, at 12:02, Alexander Graf <address@hidden> wrote:
>> On 06/03/2014 11:14 AM, Tristan Gingold wrote:
>>> Remove the code that reduce the result to float32 as the frsqrte
>>> instruction is defined to return a double-precision estimate of
>>> the reciprocal square root.
>>> Although reducing the fractional part is harmless (as the estimation
>>> must have at least 12 bits of precision according to the old PEM),
>>> reducing the exponent range is not correct.
>>> Signed-off-by: Tristan Gingold <address@hidden>
>> I couldn't find a reference to doubles in ISA 2.07. Is frsqrte supposed to 
>> return doubles on all cores?
> I have just checked ISA V 2.06 (will download 2.07 if necessary).  There are 
> now two
> instructions: frsqrte and frsqrtes.  The second one if for single - so the 
> first one is for double.
> [ If you look at IBM AIX assembly manual:
> http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.aixassem/doc/alangref/frsqrte.htm
> they clearly mention that frsqrte operates on double on 603, 604 but not 
> implemented on 601]
>>  Or is this implementation specific?
> This instruction is optional and the precision of the estimation is 
> implementation dependant.
> I have looked at some implementation manuals (604, 603, e300) and they don't 
> mention single.
>> Also, is frsqrte the only instruction affected?
> Yes.  Operation fres operates on single.
> Tristan.
>> Alex

I concur with the assessement-- frsqrte (reciprocal square root estimate) is an 
optional, double-precision instruction
and has always been double precision.  And, there is, indeed, a single 
precision version (frsqrtes) that came along later
(sometime between 1998 and 2006, and thus later than the 603/604).

The instruction is, as the name implies, an *estimate*.  I suspect the code 
that rounds to single precision and then
back to double was a clever way to truncate the mantissa and thus look more 
like the result produced by some PPC
implementation (hardware).  Unfortunately, it doesn't work if the original 
double-precision result is not representable
in single precision range, as Tristan likely discovered :)

And to be clear helper_frsrte is used for both frsqtre and frsqrtes.  But the 
code in translate.c (gen_frsqrtes) handles
the "singleness" of that instruction.

The patch looks correct to me.

Reviewed-by: Tom Musta <address@hidden>

reply via email to

[Prev in Thread] Current Thread [Next in Thread]