|
|
1.1 ! root 1: ! 2: .globl _dmlad ! 3: /* ! 4: routine for destructive multiplication and addition to a bignum by ! 5: two fixnums. ! 6: ! 7: from C, the invocation is dmlad(sdot,mul,add); ! 8: where sdot is the address of the first special cell of the bignum ! 9: mul is the multiplier, add is the fixnum to be added (The latter ! 10: being passed by value, as is the usual case. ! 11: ! 12: ! 13: Register assignments: ! 14: ! 15: r11 = current sdot ! 16: r10 = carry ! 17: r9 = previous sdot, for relinking. ! 18: r8 = temporary kluge variable ! 19: */ ! 20: ! 21: _dmlad: .word 0x0f00 ! 22: movl 4(fp),r11 #initialize cell pointer ! 23: movl 12(fp),r10 #initialize carry ! 24: loop: emul 8(fp),(r11),r10,r0 #r0 gets cell->car times mul + carry ! 25: ! 26: ediv $0x40000000,r0,r10,r8 #cell->car gets prod % 2**30 ! 27: movl r8,(r11) ! 28: #carry gets quotient ! 29: /* extzv $0,$30,r0,(r11) ! 30: extv $30,$32,r0,r10 ! 31: */ ! 32: movl r11,r9 #save last cell for fixup at end. ! 33: movl 4(r11),r11 #move to next cell ! 34: bneq loop #done indicated by 0 for next sdot ! 35: tstl r10 #if carry zero no need to allocate ! 36: beql done #new bigit ! 37: mcoml r10,r3 #test to see if neg 1. ! 38: bneq alloc #if not must allocate new cell. ! 39: tstl (r9) #make sure product isn't -2**30 ! 40: beql alloc ! 41: movl r0,(r9) #save old lower half of product. ! 42: brb done ! 43: alloc: callf $4,_newdot #otherwise allocate new bigit ! 44: movl r10,(r0) #store carry ! 45: movl r0,4(r9) #save new link cell ! 46: done: movl 4(fp),r0 ! 47: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.