Subversion Repositories planix.SVN

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 *      mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
 *
 *              sum[0:alen] = a[0:alen-1] + b[0:blen-1]
 *
 *      prereq: alen >= blen, sum has room for alen+1 digits
 */
TEXT    mpvecadd(SB),$0

        MOVL    alen+4(FP),DX
        MOVL    blen+12(FP),CX
        MOVL    a+0(FP),SI
        MOVL    b+8(FP),BX
        SUBL    CX,DX
        MOVL    sum+16(FP),DI
        XORL    BP,BP                   /* this also sets carry to 0 */

        /* skip addition if b is zero */
        TESTL   CX,CX
        JZ      _add1

        /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
_addloop1:
        MOVL    (SI)(BP*4), AX
        ADCL    (BX)(BP*4), AX
        MOVL    AX,(DI)(BP*4)
        INCL    BP
        LOOP    _addloop1

_add1:
        /* jump if alen > blen */
        INCL    DX
        MOVL    DX,CX
        LOOP    _addloop2

        /* sum[alen] = carry */
_addend:
        JC      _addcarry
        MOVL    $0,(DI)(BP*4)
        RET
_addcarry:
        MOVL    $1,(DI)(BP*4)
        RET

        /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
_addloop2:
        MOVL    (SI)(BP*4),AX
        ADCL    $0,AX
        MOVL    AX,(DI)(BP*4)
        INCL    BP
        LOOP    _addloop2
        JMP     _addend