58 lines
1.1 KiB
ArmAsm
58 lines
1.1 KiB
ArmAsm
#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
|
|
|