BSD 3 development
[unix-history] / usr / src / cmd / lisp / dmlad.s
CommitLineData
8cd657f4
JF
1 .globl _dmlad
2#
3# routine for destructive multiplication and additon to a bignum by
4# two fixnums.
5#
6# from C, the invocation is dmlad(sdot,mul,add);
7# where sdot is the address of the first special cell of the bignum
8# mul is the multiplier, add is the fixnum to be added (The latter
9# being passed by value, as is the usual case.
10#
11#
12# Register assignments:
13#
14# r11 = current sdot
15# r10 = carry
16# r9 = previous sdot, for relinking.
17#
18_dmlad: .word 0x0e00
19 movl 4(ap),r11 #initialize cell pointer
20 movl 12(ap),r10 #initialize carry
21loop: emul 8(ap),(r11),r10,r0 #r0 gets cell->car times mul + carry
22# ediv $0x40000000,r0,r10,(r11)#cell->car gets prod % 2**30
23# #carry gets quotient
24 extzv $0,$30,r0,(r11)
25 extv $30,$32,r0,r10
26 movl r11,r9 #save last cell for fixup at end.
27 movl 4(r11),r11 #move to next cell
28 bneq loop #done indicated by 0 for next sdot
29 tstl r10 #if carry zero no need to allocate
30 beql done #new bigit
31 mcoml r10,r3 #test to see if neg 1.
32 bneq alloc #if not must allocate new cell.
33 tstl (r9) #make sure product isn't -2**30
34 beql alloc
35 movl r0,(r9) #save old lower half of product.
36 brb done
37alloc: calls $0,_newsdot #otherwise allocate new bigit
38 movl r10,(r0) #store carry
39 movl r0,4(r9) #save new link cell
40done: movl 4(ap),r0
41 ret