On Sun, Mar 2, 2008 at 2:00 PM, Joseph S. Myers <[EMAIL PROTECTED]> wrote: > On Sat, 1 Mar 2008, Richard Guenther wrote: > > > I missed once point noticed by Joseph also, that the libgcc implementation > > uses signed types in the implementation of the trapping arithmetics. > > Where we of course optimize away the overflow check, so the libgcc > > routines will never trap. (if it does work in some cases then this > > would be a missed optimization, so sooner or later it is going to > > break more) > > This is of course trivial to fix. OK to commit the following patch? > Bootstrapped with no regressions on i686-pc-linux-gnu.
Ok. Thanks, Richard. > 2008-03-02 Joseph Myers <[EMAIL PROTECTED]> > > * libgcc2.c (__addvSI3, __addvsi3, __addvDI3, __subvSI3, > __subvsi3, __subvDI3, __negvSI2, __negvsi2, __negvDI2, __absvSI2, > __absvsi2, __absvDI2): Use unsigned arithmetic. > > Index: libgcc2.c > =================================================================== > --- libgcc2.c (revision 132803) > +++ libgcc2.c (working copy) > @@ -84,7 +84,7 @@ > Wtype > __addvSI3 (Wtype a, Wtype b) > { > - const Wtype w = a + b; > + const Wtype w = (UWtype) a + (UWtype) b; > > if (b >= 0 ? w < a : w > a) > abort (); > @@ -95,7 +95,7 @@ > SItype > __addvsi3 (SItype a, SItype b) > { > - const SItype w = a + b; > + const SItype w = (USItype) a + (USItype) b; > > if (b >= 0 ? w < a : w > a) > abort (); > @@ -109,7 +109,7 @@ > DWtype > __addvDI3 (DWtype a, DWtype b) > { > - const DWtype w = a + b; > + const DWtype w = (UDWtype) a + (UDWtype) b; > > if (b >= 0 ? w < a : w > a) > abort (); > @@ -122,7 +122,7 @@ > Wtype > __subvSI3 (Wtype a, Wtype b) > { > - const Wtype w = a - b; > + const Wtype w = (UWtype) a - (UWtype) b; > > if (b >= 0 ? w > a : w < a) > abort (); > @@ -133,7 +133,7 @@ > SItype > __subvsi3 (SItype a, SItype b) > { > - const SItype w = a - b; > + const SItype w = (USItype) a - (USItype) b; > > if (b >= 0 ? w > a : w < a) > abort (); > @@ -147,7 +147,7 @@ > DWtype > __subvDI3 (DWtype a, DWtype b) > { > - const DWtype w = a - b; > + const DWtype w = (UDWtype) a - (UDWtype) b; > > if (b >= 0 ? w > a : w < a) > abort (); > @@ -187,7 +187,7 @@ > Wtype > __negvSI2 (Wtype a) > { > - const Wtype w = -a; > + const Wtype w = -(UWtype) a; > > if (a >= 0 ? w > 0 : w < 0) > abort (); > @@ -198,7 +198,7 @@ > SItype > __negvsi2 (SItype a) > { > - const SItype w = -a; > + const SItype w = -(USItype) a; > > if (a >= 0 ? w > 0 : w < 0) > abort (); > @@ -212,7 +212,7 @@ > DWtype > __negvDI2 (DWtype a) > { > - const DWtype w = -a; > + const DWtype w = -(UDWtype) a; > > if (a >= 0 ? w > 0 : w < 0) > abort (); > @@ -231,7 +231,7 @@ > #ifdef L_negvsi2 > w = __negvSI2 (a); > #else > - w = -a; > + w = -(UWtype) a; > > if (w < 0) > abort (); > @@ -249,7 +249,7 @@ > #ifdef L_negvsi2 > w = __negvsi2 (a); > #else > - w = -a; > + w = -(USItype) a; > > if (w < 0) > abort (); > @@ -270,7 +270,7 @@ > #ifdef L_negvdi2 > w = __negvDI2 (a); > #else > - w = -a; > + w = -(UDWtype) a; > > if (w < 0) > abort (); > > > > -- > Joseph S. Myers > [EMAIL PROTECTED] >