On 03 Jun 2014, at 12:02, Alexander Graf <ag...@suse.de> 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 <ging...@adacore.com>
> 
> 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
> 
>> ---
>>  target-ppc/fpu_helper.c |    3 ---
>>  1 file changed, 3 deletions(-)
>> 
>> diff --git a/target-ppc/fpu_helper.c b/target-ppc/fpu_helper.c
>> index cd8f015..da93d12 100644
>> --- a/target-ppc/fpu_helper.c
>> +++ b/target-ppc/fpu_helper.c
>> @@ -977,7 +977,6 @@ uint64_t helper_fres(CPUPPCState *env, uint64_t arg)
>>  uint64_t helper_frsqrte(CPUPPCState *env, uint64_t arg)
>>  {
>>      CPU_DoubleU farg;
>> -    float32 f32;
>>        farg.ll = arg;
>>  @@ -991,8 +990,6 @@ uint64_t helper_frsqrte(CPUPPCState *env, uint64_t arg)
>>          }
>>          farg.d = float64_sqrt(farg.d, &env->fp_status);
>>          farg.d = float64_div(float64_one, farg.d, &env->fp_status);
>> -        f32 = float64_to_float32(farg.d, &env->fp_status);
>> -        farg.d = float32_to_float64(f32, &env->fp_status);
>>      }
>>      return farg.ll;
>>  }
> 


Reply via email to