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