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 * R3 == a (first arg passed in R3) 12*7dd7cddfSDavid du Colombier * R4 == alen 13*7dd7cddfSDavid du Colombier * R5 == b 14*7dd7cddfSDavid du Colombier * R6 == blen 15*7dd7cddfSDavid du Colombier * R7 == sum 16*7dd7cddfSDavid du Colombier * R8 == temporary 17*7dd7cddfSDavid du Colombier * R9 == temporary 18*7dd7cddfSDavid du Colombier */ 19*7dd7cddfSDavid du ColombierTEXT mpvecadd(SB),$-4 20*7dd7cddfSDavid du Colombier 21*7dd7cddfSDavid du Colombier MOVW alen+4(FP), R4 22*7dd7cddfSDavid du Colombier MOVW b+8(FP), R5 23*7dd7cddfSDavid du Colombier MOVW blen+12(FP), R6 24*7dd7cddfSDavid du Colombier MOVW sum+16(FP), R7 25*7dd7cddfSDavid du Colombier SUB R6, R4 /* calculate counter for second loop (alen > blen) */ 26*7dd7cddfSDavid du Colombier SUB $4, R3 /* pre decrement for MOVWU's */ 27*7dd7cddfSDavid du Colombier SUB $4, R5 /* pre decrement for MOVWU's */ 28*7dd7cddfSDavid du Colombier SUB $4, R7 /* pre decrement for MOVWU's */ 29*7dd7cddfSDavid du Colombier MOVW R0, XER /* zero carry going in */ 30*7dd7cddfSDavid du Colombier 31*7dd7cddfSDavid du Colombier /* if blen == 0, don't need to add it in */ 32*7dd7cddfSDavid du Colombier CMP R0, R6 33*7dd7cddfSDavid du Colombier BEQ _add1 34*7dd7cddfSDavid du Colombier 35*7dd7cddfSDavid du Colombier /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */ 36*7dd7cddfSDavid du Colombier MOVW R6, CTR 37*7dd7cddfSDavid du Colombier_addloop1: 38*7dd7cddfSDavid du Colombier MOVWU 4(R3), R8 39*7dd7cddfSDavid du Colombier MOVWU 4(R5), R9 40*7dd7cddfSDavid du Colombier ADDE R8, R9 41*7dd7cddfSDavid du Colombier MOVWU R9, 4(R7) 42*7dd7cddfSDavid du Colombier BDNZ _addloop1 43*7dd7cddfSDavid du Colombier 44*7dd7cddfSDavid du Colombier_add1: 45*7dd7cddfSDavid du Colombier /* if alen == blen, we're done */ 46*7dd7cddfSDavid du Colombier CMP R0, R4 47*7dd7cddfSDavid du Colombier BEQ _addend 48*7dd7cddfSDavid du Colombier 49*7dd7cddfSDavid du Colombier /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */ 50*7dd7cddfSDavid du Colombier MOVW R4, CTR 51*7dd7cddfSDavid du Colombier_addloop2: 52*7dd7cddfSDavid du Colombier MOVWU 4(R3), R8 53*7dd7cddfSDavid du Colombier ADDE R0, R8 54*7dd7cddfSDavid du Colombier MOVWU R8, 4(R7) 55*7dd7cddfSDavid du Colombier BDNZ _addloop2 56*7dd7cddfSDavid du Colombier 57*7dd7cddfSDavid du Colombier /* sum[alen] = carry */ 58*7dd7cddfSDavid du Colombier_addend: 59*7dd7cddfSDavid du Colombier ADDE R0, R0, R8 60*7dd7cddfSDavid du Colombier MOVW R8, 4(R7) 61*7dd7cddfSDavid du Colombier RETURN 62