Rev. 1.50, 10/04, page 254 of 448
temp1 = (unsigned long)tempn;
temp2 = (unsigned long)tempm;
RnL = temp1&0x0000FFFF;
RnH = (temp1>>16) & 0x0000FFFF;
RmL = temp2 & 0x0000FFFF;
RmH = (temp2>>16) & 0x0000FFFF;
temp0 = RmL*RnL;
temp1 = RmH*RnL;
temp2 = RmL*RnH;
temp3 = RmH*RnH;
Res2 = 0;
Res1 = temp1 + temp2;
if (Res1<temp1) Res2 += 0x00010000;
temp1 =(Res1<<16) & 0xFFFF0000;
Res0 = temp0 + temp1;
if (Res0<temp0) Res2++;
Res2 = Res2 + ((Res1>>16) & 0x0000FFFF) + temp3;
if(fnLmL<0){
Res2 =
~
Res2;
if (Res0==0) Res2++;
else Res0 = (
~
Res0)+1;
}
if(S==1){
Res0 = MACL + Res0;
if (MACL>Res0) Res2++;
if (MACH & 0x00008000);
else Res2 += MACH|0xFFFF0000;
Res2 += MACH&0x00007FFF;