Annotation of 43BSDReno/pgrm/lisp/franz/tahoe/dmlad.s, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.