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