diff options
author | Stefan Kanthak <stefan.kanthak@nexgo.de> | 2020-11-25 11:36:51 -0700 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 2020-11-25 11:38:46 -0700 |
commit | 4919ed711c1d02845f2843f6b0a70c27f9e6d434 (patch) | |
tree | b2c45f2a9b36fc5f99cb73928ae70bcd981aa037 /libgcc | |
parent | dfc537e554afa98b42a4b203ffd08c0eddba746e (diff) | |
download | gcc-4919ed711c1d02845f2843f6b0a70c27f9e6d434.zip gcc-4919ed711c1d02845f2843f6b0a70c27f9e6d434.tar.gz gcc-4919ed711c1d02845f2843f6b0a70c27f9e6d434.tar.bz2 |
Improve abs with overflow implementations
libgcc/
* libgcc2.c (absvSI2): Simplify/improve implementation by using
builtin_add_overflow.
(absvsi2, absvDI2): Likewise.
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/libgcc2.c | 42 |
1 files changed, 12 insertions, 30 deletions
diff --git a/libgcc/libgcc2.c b/libgcc/libgcc2.c index cf0ca29..1921d80 100644 --- a/libgcc/libgcc2.c +++ b/libgcc/libgcc2.c @@ -214,37 +214,25 @@ __negvDI2 (DWtype a) Wtype __absvSI2 (Wtype a) { - Wtype w = a; - - if (a < 0) -#ifdef L_negvsi2 - w = __negvSI2 (a); -#else - w = -(UWtype) a; + const Wtype v = 0 - (a < 0); + Wtype w; - if (w < 0) + if (__builtin_add_overflow (a, v, &w)) abort (); -#endif - return w; + return v ^ w; } #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC SItype __absvsi2 (SItype a) { - SItype w = a; - - if (a < 0) -#ifdef L_negvsi2 - w = __negvsi2 (a); -#else - w = -(USItype) a; + const SItype v = 0 - (a < 0); + SItype w; - if (w < 0) + if (__builtin_add_overflow (a, v, &w)) abort (); -#endif - return w; + return v ^ w; } #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */ #endif @@ -253,19 +241,13 @@ __absvsi2 (SItype a) DWtype __absvDI2 (DWtype a) { - DWtype w = a; - - if (a < 0) -#ifdef L_negvdi2 - w = __negvDI2 (a); -#else - w = -(UDWtype) a; + const DWtype v = 0 - (a < 0); + DWtype w; - if (w < 0) + if (__builtin_add_overflow (a, v, &w)) abort (); -#endif - return w; + return v ^ w; } #endif |