xref: /plan9/sys/src/libmp/power/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 *		R3 == a	(first arg passed in R3)
12*7dd7cddfSDavid du Colombier *		R4 == alen
13*7dd7cddfSDavid du Colombier *		R5 == b
14*7dd7cddfSDavid du Colombier *		R6 == blen
15*7dd7cddfSDavid du Colombier *		R7 == sum
16*7dd7cddfSDavid du Colombier *		R8 == temporary
17*7dd7cddfSDavid du Colombier *		R9 == temporary
18*7dd7cddfSDavid du Colombier */
19*7dd7cddfSDavid du ColombierTEXT	mpvecadd(SB),$-4
20*7dd7cddfSDavid du Colombier
21*7dd7cddfSDavid du Colombier	MOVW	alen+4(FP), R4
22*7dd7cddfSDavid du Colombier	MOVW	b+8(FP), R5
23*7dd7cddfSDavid du Colombier	MOVW	blen+12(FP), R6
24*7dd7cddfSDavid du Colombier	MOVW	sum+16(FP), R7
25*7dd7cddfSDavid du Colombier	SUB	R6, R4		/* calculate counter for second loop (alen > blen) */
26*7dd7cddfSDavid du Colombier	SUB	$4, R3		/* pre decrement for MOVWU's */
27*7dd7cddfSDavid du Colombier	SUB	$4, R5		/* pre decrement for MOVWU's */
28*7dd7cddfSDavid du Colombier	SUB	$4, R7		/* pre decrement for MOVWU's */
29*7dd7cddfSDavid du Colombier	MOVW	R0, XER		/* zero carry going in */
30*7dd7cddfSDavid du Colombier
31*7dd7cddfSDavid du Colombier	/* if blen == 0, don't need to add it in */
32*7dd7cddfSDavid du Colombier	CMP	R0, R6
33*7dd7cddfSDavid du Colombier	BEQ	_add1
34*7dd7cddfSDavid du Colombier
35*7dd7cddfSDavid du Colombier	/* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
36*7dd7cddfSDavid du Colombier	MOVW	R6, CTR
37*7dd7cddfSDavid du Colombier_addloop1:
38*7dd7cddfSDavid du Colombier	MOVWU	4(R3), R8
39*7dd7cddfSDavid du Colombier	MOVWU	4(R5), R9
40*7dd7cddfSDavid du Colombier	ADDE	R8, R9
41*7dd7cddfSDavid du Colombier	MOVWU	R9, 4(R7)
42*7dd7cddfSDavid du Colombier	BDNZ	_addloop1
43*7dd7cddfSDavid du Colombier
44*7dd7cddfSDavid du Colombier_add1:
45*7dd7cddfSDavid du Colombier	/* if alen == blen, we're done */
46*7dd7cddfSDavid du Colombier	CMP	R0, R4
47*7dd7cddfSDavid du Colombier	BEQ	_addend
48*7dd7cddfSDavid du Colombier
49*7dd7cddfSDavid du Colombier	/* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */
50*7dd7cddfSDavid du Colombier	MOVW	R4, CTR
51*7dd7cddfSDavid du Colombier_addloop2:
52*7dd7cddfSDavid du Colombier	MOVWU	4(R3), R8
53*7dd7cddfSDavid du Colombier	ADDE	R0, R8
54*7dd7cddfSDavid du Colombier	MOVWU	R8, 4(R7)
55*7dd7cddfSDavid du Colombier	BDNZ	_addloop2
56*7dd7cddfSDavid du Colombier
57*7dd7cddfSDavid du Colombier	/* sum[alen] = carry */
58*7dd7cddfSDavid du Colombier_addend:
59*7dd7cddfSDavid du Colombier	ADDE	R0, R0, R8
60*7dd7cddfSDavid du Colombier	MOVW	R8, 4(R7)
61*7dd7cddfSDavid du Colombier	RETURN
62