|  | /* | 
|  | *	mpvecdigmul(mpdigit *b, int n, mpdigit m, mpdigit *p) | 
|  | * | 
|  | *	p += b*m | 
|  | * | 
|  | *	each step look like: | 
|  | *		hi,lo = m*b[i] | 
|  | *		lo += oldhi + carry | 
|  | *		hi += carry | 
|  | *		p[i] += lo | 
|  | *		oldhi = hi | 
|  | * | 
|  | *	the registers are: | 
|  | *		hi = DX		- constrained by hardware | 
|  | *		lo = AX		- constrained by hardware | 
|  | *		b+n = SI	- can't be BP | 
|  | *		p+n = DI	- can't be BP | 
|  | *		i-n = BP | 
|  | *		m = BX | 
|  | *		oldhi = CX | 
|  | * | 
|  | */ | 
|  | .text | 
|  |  | 
|  | .globl _mpvecdigmuladd | 
|  | _mpvecdigmuladd: | 
|  | /* Prelude */ | 
|  | pushl %ebp		/* save on stack */ | 
|  | pushl %ebx | 
|  | pushl %esi | 
|  | pushl %edi | 
|  |  | 
|  | leal 20(%esp), %ebp		/* %ebp = FP for now */ | 
|  | movl	0(%ebp), %esi		/* b */ | 
|  | movl	4(%ebp), %ecx		/* n */ | 
|  | movl	8(%ebp), %ebx		/* m */ | 
|  | movl	12(%ebp), %edi		/* p */ | 
|  | movl	%ecx, %ebp | 
|  | negl	%ebp			/* BP = -n */ | 
|  | shll	$2, %ecx | 
|  | addl	%ecx, %esi		/* SI = b + n */ | 
|  | addl	%ecx, %edi		/* DI = p + n */ | 
|  | xorl	%ecx, %ecx | 
|  | 1: | 
|  | movl	(%esi, %ebp, 4), %eax	/* lo = b[i] */ | 
|  | mull	%ebx			/* hi, lo = b[i] * m */ | 
|  | addl	%ecx,%eax		/* lo += oldhi */ | 
|  | jae	2f | 
|  | incl	%edx			/* hi += carry */ | 
|  | 2: | 
|  | addl	%eax, (%edi, %ebp, 4)	/* p[i] += lo */ | 
|  | jae	3f | 
|  | incl	%edx			/* hi += carry */ | 
|  | 3: | 
|  | movl	%edx, %ecx		/* oldhi = hi */ | 
|  | incl	%ebp			/* i++ */ | 
|  | jnz	1b | 
|  | xorl	%eax, %eax | 
|  | addl	%ecx, (%edi, %ebp, 4)	/* p[n] + oldhi */ | 
|  | adcl	%eax, %eax		/* return carry out of p[n] */ | 
|  |  | 
|  | /* Postlude */ | 
|  | popl %edi | 
|  | popl %esi | 
|  | popl %ebx | 
|  | popl %ebp | 
|  | ret | 
|  |  |