/******************************************************************************
*									      *
*  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;
   }
}