BSD 4_4 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Fri, 14 Nov 1986 00:06:23 +0000 (16:06 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Fri, 14 Nov 1986 00:06:23 +0000 (16:06 -0800)
Work on file usr/src/old/lisp/franz/tahoe/dmlad.s

Synthesized-from: CSRG/cd3/4.4

usr/src/old/lisp/franz/tahoe/dmlad.s [new file with mode: 0644]

diff --git a/usr/src/old/lisp/franz/tahoe/dmlad.s b/usr/src/old/lisp/franz/tahoe/dmlad.s
new file mode 100644 (file)
index 0000000..98b9009
--- /dev/null
@@ -0,0 +1,47 @@
+
+       .globl  _dmlad
+/*
+       routine for destructive multiplication and addition to a bignum by
+       two fixnums.
+
+       from C, the invocation is dmlad(sdot,mul,add);
+       where sdot is the address of the first special cell of the bignum
+       mul is the multiplier, add is the fixnum to be added (The latter
+       being passed by value, as is the usual case.
+
+
+       Register assignments:
+
+       r11 = current sdot
+       r10 = carry
+       r9  = previous sdot, for relinking.
+       r8  = temporary kluge variable
+*/
+
+_dmlad:        .word   0x0f00
+       movl    4(fp),r11               #initialize cell pointer
+       movl    12(fp),r10              #initialize carry
+loop:  emul    8(fp),(r11),r10,r0      #r0 gets cell->car times mul + carry
+
+       ediv    $0x40000000,r0,r10,r8   #cell->car gets prod % 2**30
+       movl    r8,(r11)
+                                       #carry gets quotient
+/*     extzv   $0,$30,r0,(r11)
+       extv    $30,$32,r0,r10
+*/
+       movl    r11,r9                  #save last cell for fixup at end.
+       movl    4(r11),r11              #move to next cell
+       bneq    loop                    #done indicated by 0 for next sdot
+       tstl    r10                     #if carry zero no need to allocate
+       beql    done                    #new bigit
+       mcoml   r10,r3                  #test to see if neg 1.
+       bneq    alloc                   #if not must allocate new cell.
+       tstl    (r9)                    #make sure product isn't -2**30
+       beql    alloc
+       movl    r0,(r9)                 #save old lower half of product.
+       brb     done
+alloc: callf   $4,_newdot              #otherwise allocate new bigit
+       movl    r10,(r0)                #store carry
+       movl    r0,4(r9)                #save new link cell
+done:  movl    4(fp),r0
+       ret