+
+ .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