diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-02-02 20:44:16 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-02-02 20:44:16 +0100 |
commit | 321a2b65f83575b59d4a33760b0023e219feeba6 (patch) | |
tree | 44b08157a2a8792e0aacd76b91a954d07d56beb6 /gcc | |
parent | f3baa1d3edb0395a34445aa97f237d5129b68624 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/wide-int.cc | 31 |
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; } |