On 27/07/18 17:45, Nicolas Pitre wrote: > On Fri, 27 Jul 2018, Wilco Dijkstra wrote: > >> Nicolas Pitre wrote: >> >>>> However if r4 is non-zero, the carry will be set, and the tsths will be >>>> executed. This >>>> clears the carry and sets the Z flag based on bit 20. >>> >>> No, not at all. The carry is not affected. And that's the point of the >>> tst instruction here rather than a cmp: it sets the N and Z flags but >>> leaves C alone as there is no shifter involved. >> >> No, the carry is always set by logical operations with a shifted immediate. >> It is only >> unchanged if the immediate uses a zero rotate. So any shifted immediate > 255 >> will set the carry. > > Holy cow !!! > > Who knows all the bugs I must have created in the past 25 years having > missed this particular subtlety. > > Here's the updated patch with your suggestion. >
Thanks. Committed. R. > > fix.patch > > > diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog > index c13bf4cb2f6..c19d05c8a2e 100644 > --- a/libgcc/ChangeLog > +++ b/libgcc/ChangeLog > @@ -1,3 +1,9 @@ > +2018-07-26 Nicolas Pitre <n...@fluxnic.net> > + > + * config/arm/ieee754-df.S: Don't shortcut denormal handling when > + exponent goes negative. Update my email address. > + * config/arm/ieee754-sf.S: Likewise. > + > 2018-07-05 James Clarke <jrt...@jrtc27.com> > > * configure: Regenerated. > diff --git a/libgcc/config/arm/ieee754-df.S b/libgcc/config/arm/ieee754-df.S > index 8741aa99245..9a1b2dd2a4e 100644 > --- a/libgcc/config/arm/ieee754-df.S > +++ b/libgcc/config/arm/ieee754-df.S > @@ -1,7 +1,7 @@ > /* ieee754-df.S double-precision floating point support for ARM > > Copyright (C) 2003-2018 Free Software Foundation, Inc. > - Contributed by Nicolas Pitre (n...@cam.org) > + Contributed by Nicolas Pitre (n...@fluxnic.net) > > This file is free software; you can redistribute it and/or modify it > under the terms of the GNU General Public License as published by the > @@ -238,9 +238,10 @@ LSYM(Lad_a): > movs ip, ip, lsl #1 > adcs xl, xl, xl > adc xh, xh, xh > - tst xh, #0x00100000 > - sub r4, r4, #1 > - bne LSYM(Lad_e) > + subs r4, r4, #1 > + do_it hs > + cmphs xh, #0x00100000 > + bhs LSYM(Lad_e) > > @ No rounding necessary since ip will always be 0 at this point. > LSYM(Lad_l): > diff --git a/libgcc/config/arm/ieee754-sf.S b/libgcc/config/arm/ieee754-sf.S > index d80d5e9080c..b8a81279a3c 100644 > --- a/libgcc/config/arm/ieee754-sf.S > +++ b/libgcc/config/arm/ieee754-sf.S > @@ -1,7 +1,7 @@ > /* ieee754-sf.S single-precision floating point support for ARM > > Copyright (C) 2003-2018 Free Software Foundation, Inc. > - Contributed by Nicolas Pitre (n...@cam.org) > + Contributed by Nicolas Pitre (n...@fluxnic.net) > > This file is free software; you can redistribute it and/or modify it > under the terms of the GNU General Public License as published by the > @@ -168,10 +168,11 @@ LSYM(Lad_e): > LSYM(Lad_a): > movs r1, r1, lsl #1 > adc r0, r0, r0 > - tst r0, #0x00800000 > - sub r2, r2, #1 > - bne LSYM(Lad_e) > - > + subs r2, r2, #1 > + do_it hs > + cmphs r0, #0x00800000 > + bhs LSYM(Lad_e) > + > @ No rounding necessary since r1 will always be 0 at this point. > LSYM(Lad_l): > >