BigInteger.java (divide): Handle the special case when dividing by 1 and the high...
authorWarren Levy <warrenl@cygnus.com>
Fri, 24 Mar 2000 09:18:12 +0000 (09:18 +0000)
committerWarren Levy <warrenl@gcc.gnu.org>
Fri, 24 Mar 2000 09:18:12 +0000 (09:18 +0000)
* 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

libjava/ChangeLog
libjava/java/math/BigInteger.java

index a5270f7bc75715d634bd3870341ef8820babf771..8cc21f753bdf4bb16ff2b742875cd2a7bf254a3d 100644 (file)
@@ -1,3 +1,9 @@
+2000-03-24  Warren Levy  <warrenl@cygnus.com>
+
+       * 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.
+
 2000-03-24  Warren Levy  <warrenl@cygnus.com>
 
        * java/awt/Font.java(isBold): Fix syntax error.
index 69e7f68506b64963325bd2b2fcfba70faf6820c9..738680a42c42c0054109dd8e2bbc8c1f3c672f24 100644 (file)
@@ -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);