Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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