Subversion Repositories planix.SVN

Rev

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

/*
 *      mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p)
 *
 *      p -= b*m
 *
 *      each step look like:
 *              hi,lo = m*b[i]
 *              lo += oldhi + carry
 *              hi += carry
 *              p[i] += lo
 *              oldhi = hi
 *
 *      the registers are:
 *              hi = DX         - constrained by hardware
 *              lo = AX         - constrained by hardware
 *              b = SI          - can't be BP
 *              p = DI          - can't be BP
 *              i = BP
 *              n = CX          - constrained by LOOP instr
 *              m = BX
 *              oldhi = EX
 *              
 */
TEXT    mpvecdigmulsub(SB),$4

        MOVL    b+0(FP),SI
        MOVL    n+4(FP),CX
        MOVL    m+8(FP),BX
        MOVL    p+12(FP),DI
        XORL    BP,BP
        MOVL    BP,0(SP)
_mulsubloop:
        MOVL    (SI)(BP*4),AX           /* lo = b[i] */
        MULL    BX                      /* hi, lo = b[i] * m */
        ADDL    0(SP),AX                /* lo += oldhi */
        JCC     _mulsubnocarry1
        INCL    DX                      /* hi += carry */
_mulsubnocarry1:
        SUBL    AX,(DI)(BP*4)
        JCC     _mulsubnocarry2
        INCL    DX                      /* hi += carry */
_mulsubnocarry2:
        MOVL    DX,0(SP)
        INCL    BP
        LOOP    _mulsubloop
        MOVL    0(SP),AX
        SUBL    AX,(DI)(BP*4)
        JCC     _mulsubnocarry3
        MOVL    $-1,AX
        RET
_mulsubnocarry3:
        MOVL    $1,AX
        RET

Generated by GNU Enscript 1.6.6.