|
|
1.1 root 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
21: loop: 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
37: alloc: calls $0,_newsdot #otherwise allocate new bigit
38: movl r10,(r0) #store carry
39: movl r0,4(r9) #save new link cell
40: done: movl 4(ap),r0
41: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.