aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-02-02 20:44:16 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-02-02 20:44:16 +0100
commit321a2b65f83575b59d4a33760b0023e219feeba6 (patch)
tree44b08157a2a8792e0aacd76b91a954d07d56beb6 /gcc
parentf3baa1d3edb0395a34445aa97f237d5129b68624 (diff)
downloadgcc-321a2b65f83575b59d4a33760b0023e219feeba6.zip
gcc-321a2b65f83575b59d4a33760b0023e219feeba6.tar.gz
gcc-321a2b65f83575b59d4a33760b0023e219feeba6.tar.bz2
wide-int.cc (canonize_uhwi): New function.
* wide-int.cc (canonize_uhwi): New function. (wi::divmod_internal): Use it. From-SVN: r233092
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/wide-int.cc31
2 files changed, 21 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2cb8456..8c59956 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2016-02-02 Jakub Jelinek <jakub@redhat.com>
+
+ * wide-int.cc (canonize_uhwi): New function.
+ (wi::divmod_internal): Use it.
+
2016-02-02 James Norris <jnorris@codesourcery.com
* gimplify.c (omp_notice_variable): Add usage check.
diff --git a/gcc/wide-int.cc b/gcc/wide-int.cc
index 5fcec2e..8648e7d 100644
--- a/gcc/wide-int.cc
+++ b/gcc/wide-int.cc
@@ -118,6 +118,20 @@ canonize (HOST_WIDE_INT *val, unsigned int len, unsigned int precision)
return 1;
}
+/* VAL[0] is the unsigned result of an operation. Canonize it by adding
+ another 0 block if needed, and return number of blocks needed. */
+
+static inline unsigned int
+canonize_uhwi (HOST_WIDE_INT *val, unsigned int precision)
+{
+ if (val[0] < 0 && precision > HOST_BITS_PER_WIDE_INT)
+ {
+ val[1] = 0;
+ return 2;
+ }
+ return 1;
+}
+
/*
* Conversion routines in and out of wide_int.
*/
@@ -1793,25 +1807,12 @@ wi::divmod_internal (HOST_WIDE_INT *quotient, unsigned int *remainder_len,
if (quotient)
{
quotient[0] = o0 / o1;
- if (o1 == 1
- && (HOST_WIDE_INT) o0 < 0
- && dividend_prec > HOST_BITS_PER_WIDE_INT)
- {
- quotient[1] = 0;
- quotient_len = 2;
- }
+ quotient_len = canonize_uhwi (quotient, dividend_prec);
}
if (remainder)
{
remainder[0] = o0 % o1;
- if ((HOST_WIDE_INT) remainder[0] < 0
- && dividend_prec > HOST_BITS_PER_WIDE_INT)
- {
- remainder[1] = 0;
- *remainder_len = 2;
- }
- else
- *remainder_len = 1;
+ *remainder_len = canonize_uhwi (remainder, dividend_prec);
}
return quotient_len;
}