/******************************************************************************
* *
* COMPUTE d**p (64x16 UNSIGNED MULTIPLY) *
* 11/14/06 (dkc) *
* *
******************************************************************************/
unsigned int carry(unsigned int a, unsigned int b, unsigned int sum);
void product(unsigned int *a, unsigned int m, unsigned int count) {
unsigned int i;
unsigned int m0,m1,m2,m3;
unsigned int p0,p1,p2,p3;
unsigned int t0,t1;
unsigned int c0;
for (i=0; i<count; i++) {
m0=*(a+1);
m1=m0>>16;
m0=m0&0xffff;
m2=*a;
m3=m2>>16;
m2=m2&0xffff;
p0=m0*m;
p1=m1*m;
p2=m2*m;
p3=m3*m;
t0=p0+(p1<<16);
c0=carry(p0,(p1<<16),t0);
t1=p2+(p1>>16);
t1=t1+c0;
t1=t1+(p3<<16);
*a=t1;
*(a+1)=t0;
}
}