aboutsummaryrefslogtreecommitdiff
path: root/libjava/java
diff options
context:
space:
mode:
authorWarren Levy <warrenl@cygnus.com>2000-03-24 09:18:12 +0000
committerWarren Levy <warrenl@gcc.gnu.org>2000-03-24 09:18:12 +0000
commit552cc5b57e4f67cf88c4a90a2191a04b9901339f (patch)
tree81ac4785b8794f96ebc0913df70f460cf45208ec /libjava/java
parent111393dfd683a1ac8d048f1dcd00922ea7ea596f (diff)
downloadgcc-552cc5b57e4f67cf88c4a90a2191a04b9901339f.zip
gcc-552cc5b57e4f67cf88c4a90a2191a04b9901339f.tar.gz
gcc-552cc5b57e4f67cf88c4a90a2191a04b9901339f.tar.bz2
BigInteger.java (divide): Handle the special case when dividing by 1 and the high bit of the dividend is set.
* java/math/BigInteger.java(divide): Handle the special case when dividing by 1 and the high bit of the dividend is set. (setShiftRight): Handle case when count == 0. From-SVN: r32724
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/math/BigInteger.java13
1 files changed, 11 insertions, 2 deletions
diff --git a/libjava/java/math/BigInteger.java b/libjava/java/math/BigInteger.java
index 69e7f68..738680a 100644
--- a/libjava/java/math/BigInteger.java
+++ b/libjava/java/math/BigInteger.java
@@ -750,6 +750,12 @@ public class BigInteger extends Number implements Comparable
else if (ylen == 1)
{
qlen = xlen;
+ // Need to leave room for a word of leading zeros if dividing by 1
+ // and the dividend has the high bit set. It might be safe to
+ // increment qlen in all cases, but it certainly is only necessary
+ // in the following case.
+ if (ywords[0] == 1 && xwords[xlen-1] < 0)
+ qlen++;
rlen = 1;
ywords[0] = MPN.divmod_1(xwords, xwords, xlen, ywords[0]);
}
@@ -770,7 +776,7 @@ public class BigInteger extends Number implements Comparable
// significant word.
int x_high = MPN.lshift(xwords, 0, xwords, xlen, nshift);
xwords[xlen++] = x_high;
- }
+ }
if (xlen == ylen)
xwords[xlen++] = 0;
@@ -1381,7 +1387,10 @@ public class BigInteger extends Number implements Comparable
{
if (words == null || words.length < d_len)
realloc(d_len);
- MPN.rshift(words, x.words, word_count, d_len, count);
+ if (count == 0)
+ System.arraycopy(x.words, word_count, words, 0, d_len);
+ else
+ MPN.rshift(words, x.words, word_count, d_len, count);
ival = d_len;
if (neg)
words[ival-1] |= -1 << (32 - count);