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. 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]