]> Cypherpunks repositories - gostls13.git/commitdiff
big: fix large division.
authorAdam Langley <agl@golang.org>
Thu, 19 Nov 2009 03:26:12 +0000 (19:26 -0800)
committerAdam Langley <agl@golang.org>
Thu, 19 Nov 2009 03:26:12 +0000 (19:26 -0800)
I missed a case.

R=rsc, agl
CC=golang-dev
https://golang.org/cl/156092

src/pkg/big/nat.go

index 8fabd7c8d02d3a04279bbc08eea576c668ef11e3..7fad9f8298da163b310abad24eb2674dd2d27cb6 100644 (file)
@@ -310,20 +310,26 @@ func divLargeNN(z, z2, uIn, v []Word) (q, r []Word) {
        // D2.
        for j := m; j >= 0; j-- {
                // D3.
-               qhat, rhat := divWW_g(u[j+n], u[j+n-1], v[n-1]);
-
-               // x1 | x2 = q̂v_{n-2}
-               x1, x2 := mulWW_g(qhat, v[n-2]);
-               // test if q̂v_{n-2} > br̂ + u_{j+n-2}
-               for greaterThan(x1, x2, rhat, u[j+n-2]) {
-                       qhat--;
-                       prevRhat := rhat;
-                       rhat += v[n-1];
-                       // v[n-1] >= 0, so this tests for overflow.
-                       if rhat < prevRhat {
-                               break
+               var qhat Word;
+               if u[j+n] == v[n-1] {
+                       qhat = _B - 1
+               } else {
+                       var rhat Word;
+                       qhat, rhat = divWW_g(u[j+n], u[j+n-1], v[n-1]);
+
+                       // x1 | x2 = q̂v_{n-2}
+                       x1, x2 := mulWW_g(qhat, v[n-2]);
+                       // test if q̂v_{n-2} > br̂ + u_{j+n-2}
+                       for greaterThan(x1, x2, rhat, u[j+n-2]) {
+                               qhat--;
+                               prevRhat := rhat;
+                               rhat += v[n-1];
+                               // v[n-1] >= 0, so this tests for overflow.
+                               if rhat < prevRhat {
+                                       break
+                               }
+                               x1, x2 = mulWW_g(qhat, v[n-2]);
                        }
-                       x1, x2 = mulWW_g(qhat, v[n-2]);
                }
 
                // D4.