123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- #define BDNZ BC 16,0,
- #define BDNE BC 0,2,
- /*
- * mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
- *
- * diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]
- *
- * prereq: alen >= blen, diff has room for alen digits
- *
- * R3 == a
- * R4 == alen
- * R5 == b
- * R6 == blen
- * R7 == diff
- * R8 == temporary
- * R9 == temporary
- */
- TEXT mpvecsub(SB),$-4
- MOVW alen+4(FP),R4
- MOVW b+8(FP),R5
- MOVW blen+12(FP),R6
- MOVW diff+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 */
- SUBC $4, R7 /* pre decrement for MOVWU's and set carry */
- /* skip subraction if b is zero */
- CMP R0,R6
- BEQ _sub1
- /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
- MOVW R6, CTR
- _subloop1:
- MOVWU 4(R3), R8
- MOVWU 4(R5), R9
- SUBE R9, R8, R8
- MOVWU R8, 4(R7)
- BDNZ _subloop1
- _sub1:
- /* skip subtraction if a is zero */
- CMP R0, R4
- BEQ _subend
- /* diff[blen:alen-1] = a[blen:alen-1] - 0 + carry */
- MOVW R4, CTR
- _subloop2:
- MOVWU 4(R3), R8
- SUBE R0, R8
- MOVWU R8, 4(R7)
- BDNZ _subloop2
- _subend:
- RETURN
|