On Mon, Jul 23, 2018 at 12:09 PM, Umesh Kalappa <umesh.kalap...@gmail.com> wrote: > Hi Richard, > > We tested on the SP and yes the problem persist on the SP too and > attached patch will fix the both SP and DP issues for the denormal > resultant. > We bootstrapped the compiler ,look ok to us with minimal testing ,
Have you run the full gcc testsuite as you should do if you want to submit a patch and checked for no regressions ? Ramana > > Any floating point test-suite to test for the attached patch ? any > recommendations or inputs ? > > Thank you again > ~Umesh > > > On Mon, Jul 23, 2018 at 3:28 PM, Richard Earnshaw (lists) > <richard.earns...@arm.com> wrote: >> So why is this only changing the double-precision implementation? >> Surely, a problem like this will normally be common to both SP and DP >> floating-point computations. >> >> R. >> >> On 23/07/18 08:46, Umesh Kalappa wrote: >>> Thank you Wilco for the inputs and we agree that the fix break down >>> for the case. >>> >>> Meanwhile ,attached patch will take care the inputs and we are testing >>> the patch vigorously ,would you recommended any test-suite out there >>> for the same ? >>> >>> Thank you >>> ~Umesh >>> >>> >>> On Fri, Jul 20, 2018 at 10:04 PM, Wilco Dijkstra <wilco.dijks...@arm.com> >>> wrote: >>>> Umesh Kalappa wrote: >>>> >>>>> We tried some of the normalisation numbers and the fix works and please >>>>> could you help us with the input ,where if you see that fix breaks down. >>>> >>>> Well try any set of inputs which require normalisation. You'll find these >>>> no >>>> longer get normalised and so will get incorrect results. Try basic cases >>>> like >>>> 1.0 - 0.75 which I think will return 0.625... >>>> >>>> A basic test would be to run old vs new on a large set of inputs to verify >>>> there aren't any obvious differences. >>>> >>>> Wilco >>>> >>>> >>>> pr86512.patch >>>> >>>> >>>> Index: libgcc/config/arm/ieee754-df.S >>>> =================================================================== >>>> --- libgcc/config/arm/ieee754-df.S (revision 262850) >>>> +++ libgcc/config/arm/ieee754-df.S (working copy) >>>> @@ -203,6 +203,7 @@ >>>> #endif >>>> >>>> @ Determine how to normalize the result. >>>> + @ if result is denormal i.e (exp)=0,then don't normalise the result, >>>> LSYM(Lad_p): >>>> cmp xh, #0x00100000 >>>> bcc LSYM(Lad_a) >>>> @@ -235,6 +236,8 @@ >>>> >>>> @ Result must be shifted left and exponent adjusted. >>>> LSYM(Lad_a): >>>> + cmp r4,#0x0 >>>> + beq LSYM(Lad_e) >>>> movs ip, ip, lsl #1 >>>> adcs xl, xl, xl >>>> adc xh, xh, xh >>>> Index: gcc/testsuite/gcc.target/arm/pr86512.c >>>> =================================================================== >>>> --- gcc/testsuite/gcc.target/arm/pr86512.c (nonexistent) >>>> +++ gcc/testsuite/gcc.target/arm/pr86512.c (working copy) >>>> @@ -0,0 +1,28 @@ >>>> +/* { dg-do run } */ >>>> +/* { dg-options "-O0 -msoft-float" } */ >>>> + >>>> +#include<stdlib.h> >>>> +#include<stdint.h> >>>> + >>>> +typedef union >>>> +{ >>>> + double d; >>>> + uint64_t i; >>>> +} u; >>>> + >>>> +int main() >>>> +{ >>>> + u smallestPositiveNormal, smallesPositiveSubnormal, expectedResult, >>>> result; >>>> + >>>> + smallesPositiveSubnormal.i = 1; >>>> + >>>> + smallestPositiveNormal.i = 0x0010000000000000; >>>> + expectedResult.i = 0x000fffffffffffff; >>>> + result.d = smallestPositiveNormal.d - smallesPositiveSubnormal.d; >>>> + >>>> + if (result.i != expectedResult.i) >>>> + abort(); >>>> + >>>> + return 0; >>>> +} >>>> + >>