xref: /plan9/sys/src/libmp/mips/mpvecadd.s (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1#define	BDNZ	BC	16,0,
2#define	BDNE	BC	0,2,
3
4/*
5 *	mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
6 *
7 *		sum[0:alen] = a[0:alen-1] + b[0:blen-1]
8 *
9 *	prereq: alen >= blen, sum has room for alen+1 digits
10 *
11 *		R1 == a	(first arg passed in R1)
12 *		R3 == carry
13 *		R4 == alen
14 *		R5 == b
15 *		R6 == blen
16 *		R7 == sum
17 *		R2 == temporary
18 *		R8 == temporary
19 *		R9 == temporary
20 */
21TEXT	mpvecadd(SB),$-4
22
23	MOVW	alen+4(FP), R4
24	MOVW	b+8(FP), R5
25	MOVW	blen+12(FP), R6
26	MOVW	sum+16(FP), R7
27	SUBU	R6, R4		/* calculate counter for second loop (alen > blen) */
28	MOVW	R0, R3
29
30	/* if blen == 0, don't need to add it in */
31	BEQ	R6,_add1
32
33	/* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
34_addloop1:
35	MOVW	0(R1), R8
36	ADDU	$4, R1
37	MOVW	0(R5), R9
38	ADDU	$4, R5
39	ADDU	R3, R8
40	SGTU	R3, R8, R3
41	ADDU	R8, R9
42	SGTU	R8, R9, R2
43	ADDU	R2, R3
44	MOVW	R9, 0(R7)
45	ADDU	$4, R7
46	SUBU	$1, R6
47	BNE	R6, _addloop1
48
49_add1:
50	/* if alen == blen, we're done */
51	BEQ	R4, _addend
52
53	/* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */
54_addloop2:
55	MOVW	0(R1), R8
56	ADDU	$4, R1
57	ADDU	R3, R8
58	SGTU	R3, R8, R3
59	MOVW	R8, 0(R7)
60	ADDU	$4, R7
61	SUBU	$1, R4
62	BNE	R4, _addloop2
63
64	/* sum[alen] = carry */
65_addend:
66	MOVW	R3, 0(R7)
67	RET
68