1#define BDNZ BC 16,0, 2#define BDNE BC 0,2, 3 4/* 5 * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) 6 * 7 * sum[0:alen] = a[0:alen-1] + b[0:blen-1] 8 * 9 * prereq: alen >= blen, sum has room for alen+1 digits 10 * 11 * R1 == a (first arg passed in R1) 12 * R3 == carry 13 * R4 == alen 14 * R5 == b 15 * R6 == blen 16 * R7 == sum 17 * R2 == temporary 18 * R8 == temporary 19 * R9 == temporary 20 */ 21TEXT mpvecadd(SB),$-4 22 23 MOVW alen+4(FP), R4 24 MOVW b+8(FP), R5 25 MOVW blen+12(FP), R6 26 MOVW sum+16(FP), R7 27 SUBU R6, R4 /* calculate counter for second loop (alen > blen) */ 28 MOVW R0, R3 29 30 /* if blen == 0, don't need to add it in */ 31 BEQ R6,_add1 32 33 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */ 34_addloop1: 35 MOVW 0(R1), R8 36 ADDU $4, R1 37 MOVW 0(R5), R9 38 ADDU $4, R5 39 ADDU R3, R8 40 SGTU R3, R8, R3 41 ADDU R8, R9 42 SGTU R8, R9, R2 43 ADDU R2, R3 44 MOVW R9, 0(R7) 45 ADDU $4, R7 46 SUBU $1, R6 47 BNE R6, _addloop1 48 49_add1: 50 /* if alen == blen, we're done */ 51 BEQ R4, _addend 52 53 /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */ 54_addloop2: 55 MOVW 0(R1), R8 56 ADDU $4, R1 57 ADDU R3, R8 58 SGTU R3, R8, R3 59 MOVW R8, 0(R7) 60 ADDU $4, R7 61 SUBU $1, R4 62 BNE R4, _addloop2 63 64 /* sum[alen] = carry */ 65_addend: 66 MOVW R3, 0(R7) 67 RET 68