campo-sirio/gfm/mgmn.c
luca 3d88151f4d Patch level :2.1 nopatch
Files correlati     :gfm.dll
Ricompilazione Demo : [ ]
Commento            :riportate sulla 2.1 le correzioni sulla gfm.dll della 2.0


git-svn-id: svn://10.65.10.50/trunk@11815 c028cbd2-c16b-5b4b-a496-9718f37d4682
2004-03-09 09:49:17 +00:00

73 lines
1.6 KiB
C
Executable File

/* void _MulUnsArrByUnsArr(src1,src2,dst,m,n,tmp1)
*
* ARGUMENT
* unsigned src1[m], src2[n], dst[10];
* unsigned n,m; m<=5 n<=5
* int tmp1 where tmp1 is used as a temp multiplier for each loop
*
* DESCRIPTION
* Multiplies multiplier by multiplicand giving dst. Src1 and Src2
* are 80bit x 80bit is computed to 160bit. As each int is multiplied
* to obtain the partial product, it is added to the dst and any
* carries are added to succeeding coloumn location in the dst array.
*
* SIDE EFFECTS
* Neither src1 and src2 can have the MSB of the high-order int set
*
* RETURNS
* None.
*
* AUTHOR
* Brugnoli Giugno 1992
*
* MODIFICATIONS
*
*/
#include <stdio.h>
#include <math.h>
#include "gm.h"
#include "gmsystem.h"
extern double pow(double, double);
void _MulUnsArrByUnsArr(src1, src2, dst, m, n, tmp1)
unsigned SHORT src1[], src2[], dst[];
int n,m,tmp1;
{
int i,j;
unsigned long apdst[10];
unsigned long pdst;
tmp1=0;
for(i=0;i<10;i++)
apdst[i]=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
pdst=(unsigned long)src1[j]*(unsigned long)src2[i];
if (pdst>MAXUNSINT)
{
apdst[i+j+1]+=(unsigned long)(pdst>>BITSPERUI);
apdst[i+j]+=(unsigned long)(pdst&MAXUNSINT);
}
else
apdst[i+j]+=(unsigned long)pdst;
}
}
for(i=0;i<10;i++)
{
if (apdst[i]>MAXUNSINT)
{
apdst[i+1]+=(unsigned long)(apdst[i]>>BITSPERUI);
apdst[i]=(unsigned long)(apdst[i]&MAXUNSINT);
}
}
for(i=0;i<10;i++)
dst[i]=(unsigned SHORT)apdst[i];
}