index 402ff87..2a75248 100644 (file)
@@ -1,4 +1,4 @@
;
; w.j.m. 15-jan-1999
;
;
; w.j.m. 15-jan-1999
;
@@ -59,7 +59,7 @@ w=16 ;(AP)    w       by value (input)
movl    r6,r0                   ; return c
ret
\f
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
;
;
; 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
; 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.
;
; 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 (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'
;
; 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
; 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'

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
+       brb     45\$
+
5\$:
tstl    r6
bneq    6\$
cmpl    r3,r7
blssu   42\$             ; while [r',r] >= d'
6\$:
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\$
sbwc    #0,r6
incl    r2              ;   q = q + 1
brb     5\$