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