Subversion Repositories planix.SVN

Rev

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

Rev Author Line No. Line
26 7u83 1
/*
2
 *	mpvecdigmul(mpdigit *b, int n, mpdigit m, mpdigit *p)
3
 *
4
 *	p += b*m
5
 *
6
 *	each step look like:
7
 *		hi,lo = m*b[i]
8
 *		lo += oldhi + carry
9
 *		hi += carry
10
 *		p[i] += lo
11
 *		oldhi = hi
12
 *
13
 *	the registers are:
14
 *		hi = DX		- constrained by hardware
15
 *		lo = AX		- constrained by hardware
16
 *		b+n = SI	- can't be BP
17
 *		p+n = DI	- can't be BP
18
 *		i-n = BP
19
 *		m = BX
20
 *		oldhi = CX
21
 *		
22
 */
23
TEXT	mpvecdigmuladd(SB),$0
24
 
25
	MOVQ	RARG,SI
26
	MOVL	n+8(FP),CX
27
	MOVL	m+16(FP),BX
28
	MOVQ	p+24(FP),DI
29
	MOVL	CX,BP
30
	NEGQ	BP		/* BP = -n */
31
	SHLL	$2,CX
32
	ADDQ	CX,SI		/* SI = b + n */
33
	ADDQ	CX,DI		/* DI = p + n */
34
	XORL	CX,CX
35
_muladdloop:
36
	MOVL	(SI)(BP*4),AX	/* lo = b[i] */
37
	MULL	BX		/* hi, lo = b[i] * m */
38
	ADDL	CX,AX		/* lo += oldhi */
39
	ADCL	$0, DX		/* hi += carry */
40
	ADDL	AX,(DI)(BP*4)	/* p[i] += lo */
41
	ADCL	$0, DX		/* hi += carry */
42
	MOVL	DX,CX		/* oldhi = hi */
43
	INCQ	BP		/* i++ */
44
	JNZ	_muladdloop
45
	XORL	AX,AX
46
	ADDL	CX,(DI)(BP*4)	/* p[n] + oldhi */
47
	ADCL	AX,AX		/* return carry out of p[n] */
48
	RET