aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorStefan Kanthak <stefan.kanthak@nexgo.de>2020-11-25 11:36:51 -0700
committerJeff Law <law@redhat.com>2020-11-25 11:38:46 -0700
commit4919ed711c1d02845f2843f6b0a70c27f9e6d434 (patch)
treeb2c45f2a9b36fc5f99cb73928ae70bcd981aa037 /libgcc
parentdfc537e554afa98b42a4b203ffd08c0eddba746e (diff)
downloadgcc-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.c42
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