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