I think I got it now. Apparently, the case of having to shift down
authorRichard Levitte <levitte@openssl.org>
Mon, 2 Dec 2002 21:31:45 +0000 (21:31 +0000)
committerRichard Levitte <levitte@openssl.org>
Mon, 2 Dec 2002 21:31:45 +0000 (21:31 +0000)
commit6ab285bf4c9e0f48f3e8af1ad952cd5224c7d461
tree25216a96a96ce24fe750dbba893fc9abe69bc2ea
parent1d3159bccaa400d6966005b9bc49cca1f6719962
I think I got it now.  Apparently, the case of having to shift down
the divisor was a bit more complex than I first saw.  The lost bit
can't just be discarded, as there are cases where it is important.
For example, look at dividing 320000 with 80000 vs. 80001 (all
decimals), the difference is crucial.  The trick here is to check if
that lost bit was 1, and in that case, do the following:

1. subtract the quotient from the remainder
2. as long as the remainder is negative, add the divisor (the whole
   divisor, not the shofted down copy) to it, and decrease the
   quotient by one.

There's probably a nice mathematical proof for this already, but I
won't bother with that, unless someone requests it from me.
crypto/bn/asm/vms.mar