I think I got it now. Apparently, the case of having to shift down
[openssl.git] / crypto / bn / asm / vms.mar
index 402ff87..2a75248 100644 (file)
@@ -1,4 +1,4 @@
-       .title  vax_bn_mul_add_word  unsigned multiply & add, 32*32+32+32=>64
+       .title  vax_bn_mul_add_words  unsigned multiply & add, 32*32+32+32=>64
 ;
 ; w.j.m. 15-jan-1999
 ;
@@ -59,7 +59,7 @@ w=16 ;(AP)    w       by value (input)
        movl    r6,r0                   ; return c
        ret
 \f
-       .title  vax_bn_mul_word  unsigned multiply & add, 32*32+32=>64
+       .title  vax_bn_mul_words  unsigned multiply & add, 32*32+32=>64
 ;
 ; w.j.m. 15-jan-1999
 ;
@@ -187,11 +187,8 @@ n=12 ;(AP) n       by value (input)
 ; view, i.e. when the highest bit is set), dividing the dividend by
 ; 2 isn't enough, it needs to be divided by 4.  Furthermore, the
 ; divisor needs to be divided by 2 (unsigned) as well, to avoid more
-; problems with the sign.  In this case, the divisor is so large,
-; from an unsigned point of view, that the dropped lowest bit is
-; insignificant for the operation, and therefore doesn't need
-; bothering with.  The remainder might end up incorrect, bit that's
-; adjusted at the end of the routine anyway.
+; problems with the sign.  In this case, a little extra fiddling with
+; the remainder is required.
 ;
 ; So, the simplest way to handle this is always to divide the dividend
 ; by 4, and to divide the divisor by 2 if it's highest bit is set.
@@ -213,10 +210,20 @@ n=12 ;(AP)        n       by value (input)
 ; if (q < 0) q = -q            # I doubt this is necessary any more
 ;
 ; r'    = r >> 30
-; if (d' > 0) q = q << 1
+; if (d' >= 0) q = q << 1
 ; q     = q << 1
 ; r     = (r << 2) + l'
 ;
+; if (d' < 0)
+;   {
+;     [r',r] = [r',r] - q
+;     while ([r',r] < 0)
+;       {
+;         [r',r] = [r',r] + d
+;         q = q - 1
+;       }
+;   }
+;
 ; while ([r',r] >= d)
 ;   {
 ;     [r',r] = [r',r] - d
@@ -278,13 +285,26 @@ d=12 ;(AP)        d       by value (input)
        bicl3   #^X00000003,r3,r3
        addl    r5,r3           ; r = r + l'
 
+       tstl    r7
+       bgeq    5$
+       bitl    #1,r7
+       beql    5$              ; if d < 0 && d & 1
+       subl    r2,r3           ;   [r',r] = [r',r] - q
+       sbwc    #0,r6
+45$:
+       bgeq    5$              ;   while r < 0
+       decl    r2              ;     q = q - 1
+       addl    r7,r3           ;     [r',r] = [r',r] + d
+       adwc    #0,r6
+       brb     45$
+
 5$:
        tstl    r6
        bneq    6$
        cmpl    r3,r7
        blssu   42$             ; while [r',r] >= d'
 6$:
-       subl    r7,r3           ;   r = r - d
+       subl    r7,r3           ;   [r',r] = [r',r] - d
        sbwc    #0,r6
        incl    r2              ;   q = q + 1
        brb     5$