xref: /plan9-contrib/sys/src/libmp/amd64/mpvecadd.s (revision 272efad760864ee41cfe633b56aea9b4f5cf3ae7)
1*272efad7SDavid du Colombier/*
2*272efad7SDavid du Colombier *	mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
3*272efad7SDavid du Colombier *
4*272efad7SDavid du Colombier *		sum[0:alen] = a[0:alen-1] + b[0:blen-1]
5*272efad7SDavid du Colombier *
6*272efad7SDavid du Colombier *	prereq: alen >= blen, sum has room for alen+1 digits
7*272efad7SDavid du Colombier */
8*272efad7SDavid du ColombierTEXT	mpvecadd(SB),$0
9*272efad7SDavid du Colombier
10*272efad7SDavid du Colombier	MOVL	alen+8(FP),DX
11*272efad7SDavid du Colombier	MOVL	blen+24(FP),CX
12*272efad7SDavid du Colombier/*	MOVL	a+0(FP),SI */
13*272efad7SDavid du Colombier	MOVQ	RARG, SI
14*272efad7SDavid du Colombier	MOVQ	b+16(FP),BX
15*272efad7SDavid du Colombier	SUBL	CX,DX
16*272efad7SDavid du Colombier	MOVQ	sum+32(FP),DI
17*272efad7SDavid du Colombier	XORL	BP,BP			/* this also sets carry to 0 */
18*272efad7SDavid du Colombier
19*272efad7SDavid du Colombier	/* skip addition if b is zero */
20*272efad7SDavid du Colombier	TESTL	CX,CX
21*272efad7SDavid du Colombier	JZ	_add1
22*272efad7SDavid du Colombier
23*272efad7SDavid du Colombier	/* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
24*272efad7SDavid du Colombier_addloop1:
25*272efad7SDavid du Colombier	MOVL	(SI)(BP*4), AX
26*272efad7SDavid du Colombier	ADCL	(BX)(BP*4), AX
27*272efad7SDavid du Colombier	MOVL	AX,(DI)(BP*4)
28*272efad7SDavid du Colombier	INCL	BP
29*272efad7SDavid du Colombier	LOOP	_addloop1
30*272efad7SDavid du Colombier
31*272efad7SDavid du Colombier_add1:
32*272efad7SDavid du Colombier	/* jump if alen > blen */
33*272efad7SDavid du Colombier	INCL	DX
34*272efad7SDavid du Colombier	MOVL	DX,CX
35*272efad7SDavid du Colombier	LOOP	_addloop2
36*272efad7SDavid du Colombier
37*272efad7SDavid du Colombier	/* sum[alen] = carry */
38*272efad7SDavid du Colombier_addend:
39*272efad7SDavid du Colombier	JC	_addcarry
40*272efad7SDavid du Colombier	MOVL	$0,(DI)(BP*4)
41*272efad7SDavid du Colombier	RET
42*272efad7SDavid du Colombier_addcarry:
43*272efad7SDavid du Colombier	MOVL	$1,(DI)(BP*4)
44*272efad7SDavid du Colombier	RET
45*272efad7SDavid du Colombier
46*272efad7SDavid du Colombier	/* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
47*272efad7SDavid du Colombier_addloop2:
48*272efad7SDavid du Colombier	MOVL	(SI)(BP*4),AX
49*272efad7SDavid du Colombier	ADCL	$0,AX
50*272efad7SDavid du Colombier	MOVL	AX,(DI)(BP*4)
51*272efad7SDavid du Colombier	INCL	BP
52*272efad7SDavid du Colombier	LOOP	_addloop2
53*272efad7SDavid du Colombier	JMP	_addend
54*272efad7SDavid du Colombier
55