Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#define BDNZ    BC      16,0,
#define BDNE    BC      0,2,

/*
 *      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
 *
 *              R1 == a (first arg passed in R1)
 *              R3 == carry
 *              R4 == alen
 *              R5 == b
 *              R6 == blen
 *              R7 == sum
 *              R2 == temporary
 *              R8 == temporary
 *              R9 == temporary
 */
TEXT    mpvecsub(SB),$-4

        MOVW    alen+4(FP), R4
        MOVW    b+8(FP), R5
        MOVW    blen+12(FP), R6
        MOVW    sum+16(FP), R7
        SUBU    R6, R4          /* calculate counter for second loop (alen > blen) */
        MOVW    R0, R3

        /* if blen == 0, don't need to subtract it */
        BEQ     R6,_sub1

        /* sum[0:blen-1],carry = a[0:blen-1] - b[0:blen-1] */
_subloop1:
        MOVW    0(R1), R8
        ADDU    $4, R1
        MOVW    0(R5), R9
        ADDU    $4, R5
        SUBU    R3, R8, R2
        SGTU    R2, R8, R3
        SUBU    R9, R2, R8
        SGTU    R8, R2, R9
        ADDU    R9, R3
        MOVW    R8, 0(R7)
        ADDU    $4, R7
        SUBU    $1, R6
        BNE     R6, _subloop1

_sub1:
        /* if alen == blen, we're done */
        BEQ     R4, _subend

        /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */
_subloop2:
        MOVW    0(R1), R8
        ADDU    $4, R1
        SUBU    R3, R8, R2
        SGTU    R2, R8, R3
        MOVW    R2, 0(R7)
        ADDU    $4, R7
        SUBU    $1, R4
        BNE     R4, _subloop2

        /* sum[alen] = carry */
_subend:
        RET

Generated by GNU Enscript 1.6.6.