123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #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
- *
- * R1 == a (first arg passed in R1)
- * R3 == carry
- * R4 == alen
- * R5 == b
- * R6 == blen
- * R7 == sum
- * R2 == temporary
- * R8 == temporary
- * R9 == temporary
- */
- TEXT mpvecsub(SB),$-4
- MOVW alen+4(FP), R4
- MOVW b+8(FP), R5
- MOVW blen+12(FP), R6
- MOVW sum+16(FP), R7
- SUBU R6, R4 /* calculate counter for second loop (alen > blen) */
- MOVW R0, R3
- /* if blen == 0, don't need to subtract it */
- BEQ R6,_sub1
- /* sum[0:blen-1],carry = a[0:blen-1] - b[0:blen-1] */
- _subloop1:
- MOVW 0(R1), R8
- ADDU $4, R1
- MOVW 0(R5), R9
- ADDU $4, R5
- SUBU R3, R8, R2
- SGTU R2, R8, R3
- SUBU R9, R2, R8
- SGTU R8, R2, R9
- ADDU R9, R3
- MOVW R8, 0(R7)
- ADDU $4, R7
- SUBU $1, R6
- BNE R6, _subloop1
- _sub1:
- /* if alen == blen, we're done */
- BEQ R4, _subend
- /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */
- _subloop2:
- MOVW 0(R1), R8
- ADDU $4, R1
- SUBU R3, R8, R2
- SGTU R2, R8, R3
- MOVW R2, 0(R7)
- ADDU $4, R7
- SUBU $1, R4
- BNE R4, _subloop2
- /* sum[alen] = carry */
- _subend:
- RET
|