62 lines
1.2 KiB
ArmAsm
62 lines
1.2 KiB
ArmAsm
#define BDNZ BC 16,0,
|
|
#define BDNE BC 0,2,
|
|
|
|
/*
|
|
* mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
|
|
*
|
|
* sum[0:alen] = a[0:alen-1] + b[0:blen-1]
|
|
*
|
|
* prereq: alen >= blen, sum has room for alen+1 digits
|
|
*
|
|
* R3 == a (first arg passed in R3)
|
|
* R4 == alen
|
|
* R5 == b
|
|
* R6 == blen
|
|
* R7 == sum
|
|
* R8 == temporary
|
|
* R9 == temporary
|
|
*/
|
|
TEXT mpvecadd(SB),$-4
|
|
|
|
MOVW alen+4(FP), R4
|
|
MOVW b+8(FP), R5
|
|
MOVW blen+12(FP), R6
|
|
MOVW sum+16(FP), R7
|
|
SUB R6, R4 /* calculate counter for second loop (alen > blen) */
|
|
SUB $4, R3 /* pre decrement for MOVWU's */
|
|
SUB $4, R5 /* pre decrement for MOVWU's */
|
|
SUB $4, R7 /* pre decrement for MOVWU's */
|
|
MOVW R0, XER /* zero carry going in */
|
|
|
|
/* if blen == 0, don't need to add it in */
|
|
CMP R0, R6
|
|
BEQ _add1
|
|
|
|
/* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
|
|
MOVW R6, CTR
|
|
_addloop1:
|
|
MOVWU 4(R3), R8
|
|
MOVWU 4(R5), R9
|
|
ADDE R8, R9
|
|
MOVWU R9, 4(R7)
|
|
BDNZ _addloop1
|
|
|
|
_add1:
|
|
/* if alen == blen, we're done */
|
|
CMP R0, R4
|
|
BEQ _addend
|
|
|
|
/* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */
|
|
MOVW R4, CTR
|
|
_addloop2:
|
|
MOVWU 4(R3), R8
|
|
ADDE R0, R8
|
|
MOVWU R8, 4(R7)
|
|
BDNZ _addloop2
|
|
|
|
/* sum[alen] = carry */
|
|
_addend:
|
|
ADDE R0, R0, R8
|
|
MOVW R8, 4(R7)
|
|
RETURN
|