1*7dd7cddfSDavid du Colombier/* 2*7dd7cddfSDavid du Colombier * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) 3*7dd7cddfSDavid du Colombier * 4*7dd7cddfSDavid du Colombier * sum[0:alen] = a[0:alen-1] + b[0:blen-1] 5*7dd7cddfSDavid du Colombier * 6*7dd7cddfSDavid du Colombier * prereq: alen >= blen, sum has room for alen+1 digits 7*7dd7cddfSDavid du Colombier */ 8*7dd7cddfSDavid du ColombierTEXT mpvecadd(SB),$0 9*7dd7cddfSDavid du Colombier 10*7dd7cddfSDavid du Colombier MOVL alen+4(FP),DX 11*7dd7cddfSDavid du Colombier MOVL blen+12(FP),CX 12*7dd7cddfSDavid du Colombier MOVL a+0(FP),SI 13*7dd7cddfSDavid du Colombier MOVL b+8(FP),BX 14*7dd7cddfSDavid du Colombier SUBL CX,DX 15*7dd7cddfSDavid du Colombier MOVL sum+16(FP),DI 16*7dd7cddfSDavid du Colombier XORL BP,BP /* this also sets carry to 0 */ 17*7dd7cddfSDavid du Colombier 18*7dd7cddfSDavid du Colombier /* skip addition if b is zero */ 19*7dd7cddfSDavid du Colombier TESTL CX,CX 20*7dd7cddfSDavid du Colombier JZ _add1 21*7dd7cddfSDavid du Colombier 22*7dd7cddfSDavid du Colombier /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */ 23*7dd7cddfSDavid du Colombier_addloop1: 24*7dd7cddfSDavid du Colombier MOVL (SI)(BP*4), AX 25*7dd7cddfSDavid du Colombier ADCL (BX)(BP*4), AX 26*7dd7cddfSDavid du Colombier MOVL AX,(DI)(BP*4) 27*7dd7cddfSDavid du Colombier INCL BP 28*7dd7cddfSDavid du Colombier LOOP _addloop1 29*7dd7cddfSDavid du Colombier 30*7dd7cddfSDavid du Colombier_add1: 31*7dd7cddfSDavid du Colombier /* jump if alen > blen */ 32*7dd7cddfSDavid du Colombier INCL DX 33*7dd7cddfSDavid du Colombier MOVL DX,CX 34*7dd7cddfSDavid du Colombier LOOP _addloop2 35*7dd7cddfSDavid du Colombier 36*7dd7cddfSDavid du Colombier /* sum[alen] = carry */ 37*7dd7cddfSDavid du Colombier_addend: 38*7dd7cddfSDavid du Colombier JC _addcarry 39*7dd7cddfSDavid du Colombier MOVL $0,(DI)(BP*4) 40*7dd7cddfSDavid du Colombier RET 41*7dd7cddfSDavid du Colombier_addcarry: 42*7dd7cddfSDavid du Colombier MOVL $1,(DI)(BP*4) 43*7dd7cddfSDavid du Colombier RET 44*7dd7cddfSDavid du Colombier 45*7dd7cddfSDavid du Colombier /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */ 46*7dd7cddfSDavid du Colombier_addloop2: 47*7dd7cddfSDavid du Colombier MOVL (SI)(BP*4),AX 48*7dd7cddfSDavid du Colombier ADCL $0,AX 49*7dd7cddfSDavid du Colombier MOVL AX,(DI)(BP*4) 50*7dd7cddfSDavid du Colombier INCL BP 51*7dd7cddfSDavid du Colombier LOOP _addloop2 52*7dd7cddfSDavid du Colombier JMP _addend 53*7dd7cddfSDavid du Colombier 54