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