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