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