xref: /netbsd-src/external/gpl3/binutils.old/dist/zlib/contrib/testzlib/testzlib.c (revision 16dce51364ebe8aeafbae46bc5aa167b8115bc45)
1*16dce513Schristos #include <stdio.h>
2*16dce513Schristos #include <stdlib.h>
3*16dce513Schristos #include <windows.h>
4*16dce513Schristos 
5*16dce513Schristos #include "zlib.h"
6*16dce513Schristos 
7*16dce513Schristos 
MyDoMinus64(LARGE_INTEGER * R,LARGE_INTEGER A,LARGE_INTEGER B)8*16dce513Schristos void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
9*16dce513Schristos {
10*16dce513Schristos     R->HighPart = A.HighPart - B.HighPart;
11*16dce513Schristos     if (A.LowPart >= B.LowPart)
12*16dce513Schristos         R->LowPart = A.LowPart - B.LowPart;
13*16dce513Schristos     else
14*16dce513Schristos     {
15*16dce513Schristos         R->LowPart = A.LowPart - B.LowPart;
16*16dce513Schristos         R->HighPart --;
17*16dce513Schristos     }
18*16dce513Schristos }
19*16dce513Schristos 
20*16dce513Schristos #ifdef _M_X64
21*16dce513Schristos // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
22*16dce513Schristos unsigned __int64 __rdtsc(void);
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)23*16dce513Schristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
24*16dce513Schristos {
25*16dce513Schristos  //   printf("rdtsc = %I64x\n",__rdtsc());
26*16dce513Schristos    pbeginTime64->QuadPart=__rdtsc();
27*16dce513Schristos }
28*16dce513Schristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)29*16dce513Schristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
30*16dce513Schristos {
31*16dce513Schristos     LARGE_INTEGER LIres;
32*16dce513Schristos     unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
33*16dce513Schristos     LIres.QuadPart=res;
34*16dce513Schristos    // printf("rdtsc = %I64x\n",__rdtsc());
35*16dce513Schristos     return LIres;
36*16dce513Schristos }
37*16dce513Schristos #else
38*16dce513Schristos #ifdef _M_IX86
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)39*16dce513Schristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
40*16dce513Schristos {
41*16dce513Schristos     DWORD dwEdx,dwEax;
42*16dce513Schristos     _asm
43*16dce513Schristos     {
44*16dce513Schristos         rdtsc
45*16dce513Schristos         mov dwEax,eax
46*16dce513Schristos         mov dwEdx,edx
47*16dce513Schristos     }
48*16dce513Schristos     pbeginTime64->LowPart=dwEax;
49*16dce513Schristos     pbeginTime64->HighPart=dwEdx;
50*16dce513Schristos }
51*16dce513Schristos 
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)52*16dce513Schristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
53*16dce513Schristos {
54*16dce513Schristos     myGetRDTSC32(pbeginTime64);
55*16dce513Schristos }
56*16dce513Schristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)57*16dce513Schristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
58*16dce513Schristos {
59*16dce513Schristos     LARGE_INTEGER LIres,endTime64;
60*16dce513Schristos     myGetRDTSC32(&endTime64);
61*16dce513Schristos 
62*16dce513Schristos     LIres.LowPart=LIres.HighPart=0;
63*16dce513Schristos     MyDoMinus64(&LIres,endTime64,beginTime64);
64*16dce513Schristos     return LIres;
65*16dce513Schristos }
66*16dce513Schristos #else
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)67*16dce513Schristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
68*16dce513Schristos {
69*16dce513Schristos }
70*16dce513Schristos 
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)71*16dce513Schristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
72*16dce513Schristos {
73*16dce513Schristos }
74*16dce513Schristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)75*16dce513Schristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
76*16dce513Schristos {
77*16dce513Schristos     LARGE_INTEGER lr;
78*16dce513Schristos     lr.QuadPart=0;
79*16dce513Schristos     return lr;
80*16dce513Schristos }
81*16dce513Schristos #endif
82*16dce513Schristos #endif
83*16dce513Schristos 
BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)84*16dce513Schristos void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
85*16dce513Schristos {
86*16dce513Schristos     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
87*16dce513Schristos     {
88*16dce513Schristos         pbeginTime64->LowPart = GetTickCount();
89*16dce513Schristos         pbeginTime64->HighPart = 0;
90*16dce513Schristos     }
91*16dce513Schristos }
92*16dce513Schristos 
GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)93*16dce513Schristos DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
94*16dce513Schristos {
95*16dce513Schristos     LARGE_INTEGER endTime64,ticksPerSecond,ticks;
96*16dce513Schristos     DWORDLONG ticksShifted,tickSecShifted;
97*16dce513Schristos     DWORD dwLog=16+0;
98*16dce513Schristos     DWORD dwRet;
99*16dce513Schristos     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
100*16dce513Schristos         dwRet = (GetTickCount() - beginTime64.LowPart)*1;
101*16dce513Schristos     else
102*16dce513Schristos     {
103*16dce513Schristos         MyDoMinus64(&ticks,endTime64,beginTime64);
104*16dce513Schristos         QueryPerformanceFrequency(&ticksPerSecond);
105*16dce513Schristos 
106*16dce513Schristos 
107*16dce513Schristos         {
108*16dce513Schristos             ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
109*16dce513Schristos             tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
110*16dce513Schristos 
111*16dce513Schristos         }
112*16dce513Schristos 
113*16dce513Schristos         dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
114*16dce513Schristos         dwRet *=1;
115*16dce513Schristos     }
116*16dce513Schristos     return dwRet;
117*16dce513Schristos }
118*16dce513Schristos 
ReadFileMemory(const char * filename,long * plFileSize,unsigned char ** pFilePtr)119*16dce513Schristos int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
120*16dce513Schristos {
121*16dce513Schristos     FILE* stream;
122*16dce513Schristos     unsigned char* ptr;
123*16dce513Schristos     int retVal=1;
124*16dce513Schristos     stream=fopen(filename, "rb");
125*16dce513Schristos     if (stream==NULL)
126*16dce513Schristos         return 0;
127*16dce513Schristos 
128*16dce513Schristos     fseek(stream,0,SEEK_END);
129*16dce513Schristos 
130*16dce513Schristos     *plFileSize=ftell(stream);
131*16dce513Schristos     fseek(stream,0,SEEK_SET);
132*16dce513Schristos     ptr=malloc((*plFileSize)+1);
133*16dce513Schristos     if (ptr==NULL)
134*16dce513Schristos         retVal=0;
135*16dce513Schristos     else
136*16dce513Schristos     {
137*16dce513Schristos         if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
138*16dce513Schristos             retVal=0;
139*16dce513Schristos     }
140*16dce513Schristos     fclose(stream);
141*16dce513Schristos     *pFilePtr=ptr;
142*16dce513Schristos     return retVal;
143*16dce513Schristos }
144*16dce513Schristos 
main(int argc,char * argv[])145*16dce513Schristos int main(int argc, char *argv[])
146*16dce513Schristos {
147*16dce513Schristos     int BlockSizeCompress=0x8000;
148*16dce513Schristos     int BlockSizeUncompress=0x8000;
149*16dce513Schristos     int cprLevel=Z_DEFAULT_COMPRESSION ;
150*16dce513Schristos     long lFileSize;
151*16dce513Schristos     unsigned char* FilePtr;
152*16dce513Schristos     long lBufferSizeCpr;
153*16dce513Schristos     long lBufferSizeUncpr;
154*16dce513Schristos     long lCompressedSize=0;
155*16dce513Schristos     unsigned char* CprPtr;
156*16dce513Schristos     unsigned char* UncprPtr;
157*16dce513Schristos     long lSizeCpr,lSizeUncpr;
158*16dce513Schristos     DWORD dwGetTick,dwMsecQP;
159*16dce513Schristos     LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
160*16dce513Schristos 
161*16dce513Schristos     if (argc<=1)
162*16dce513Schristos     {
163*16dce513Schristos         printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
164*16dce513Schristos         return 0;
165*16dce513Schristos     }
166*16dce513Schristos 
167*16dce513Schristos     if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
168*16dce513Schristos     {
169*16dce513Schristos         printf("error reading %s\n",argv[1]);
170*16dce513Schristos         return 1;
171*16dce513Schristos     }
172*16dce513Schristos     else printf("file %s read, %u bytes\n",argv[1],lFileSize);
173*16dce513Schristos 
174*16dce513Schristos     if (argc>=3)
175*16dce513Schristos         BlockSizeCompress=atol(argv[2]);
176*16dce513Schristos 
177*16dce513Schristos     if (argc>=4)
178*16dce513Schristos         BlockSizeUncompress=atol(argv[3]);
179*16dce513Schristos 
180*16dce513Schristos     if (argc>=5)
181*16dce513Schristos         cprLevel=(int)atol(argv[4]);
182*16dce513Schristos 
183*16dce513Schristos     lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
184*16dce513Schristos     lBufferSizeUncpr = lBufferSizeCpr;
185*16dce513Schristos 
186*16dce513Schristos     CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
187*16dce513Schristos 
188*16dce513Schristos     BeginCountPerfCounter(&li_qp,TRUE);
189*16dce513Schristos     dwGetTick=GetTickCount();
190*16dce513Schristos     BeginCountRdtsc(&li_rdtsc);
191*16dce513Schristos     {
192*16dce513Schristos         z_stream zcpr;
193*16dce513Schristos         int ret=Z_OK;
194*16dce513Schristos         long lOrigToDo = lFileSize;
195*16dce513Schristos         long lOrigDone = 0;
196*16dce513Schristos         int step=0;
197*16dce513Schristos         memset(&zcpr,0,sizeof(z_stream));
198*16dce513Schristos         deflateInit(&zcpr,cprLevel);
199*16dce513Schristos 
200*16dce513Schristos         zcpr.next_in = FilePtr;
201*16dce513Schristos         zcpr.next_out = CprPtr;
202*16dce513Schristos 
203*16dce513Schristos 
204*16dce513Schristos         do
205*16dce513Schristos         {
206*16dce513Schristos             long all_read_before = zcpr.total_in;
207*16dce513Schristos             zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
208*16dce513Schristos             zcpr.avail_out = BlockSizeCompress;
209*16dce513Schristos             ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
210*16dce513Schristos             lOrigDone += (zcpr.total_in-all_read_before);
211*16dce513Schristos             lOrigToDo -= (zcpr.total_in-all_read_before);
212*16dce513Schristos             step++;
213*16dce513Schristos         } while (ret==Z_OK);
214*16dce513Schristos 
215*16dce513Schristos         lSizeCpr=zcpr.total_out;
216*16dce513Schristos         deflateEnd(&zcpr);
217*16dce513Schristos         dwGetTick=GetTickCount()-dwGetTick;
218*16dce513Schristos         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
219*16dce513Schristos         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
220*16dce513Schristos         printf("total compress size = %u, in %u step\n",lSizeCpr,step);
221*16dce513Schristos         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
222*16dce513Schristos         printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
223*16dce513Schristos         printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
224*16dce513Schristos     }
225*16dce513Schristos 
226*16dce513Schristos     CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
227*16dce513Schristos     UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
228*16dce513Schristos 
229*16dce513Schristos     BeginCountPerfCounter(&li_qp,TRUE);
230*16dce513Schristos     dwGetTick=GetTickCount();
231*16dce513Schristos     BeginCountRdtsc(&li_rdtsc);
232*16dce513Schristos     {
233*16dce513Schristos         z_stream zcpr;
234*16dce513Schristos         int ret=Z_OK;
235*16dce513Schristos         long lOrigToDo = lSizeCpr;
236*16dce513Schristos         long lOrigDone = 0;
237*16dce513Schristos         int step=0;
238*16dce513Schristos         memset(&zcpr,0,sizeof(z_stream));
239*16dce513Schristos         inflateInit(&zcpr);
240*16dce513Schristos 
241*16dce513Schristos         zcpr.next_in = CprPtr;
242*16dce513Schristos         zcpr.next_out = UncprPtr;
243*16dce513Schristos 
244*16dce513Schristos 
245*16dce513Schristos         do
246*16dce513Schristos         {
247*16dce513Schristos             long all_read_before = zcpr.total_in;
248*16dce513Schristos             zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
249*16dce513Schristos             zcpr.avail_out = BlockSizeUncompress;
250*16dce513Schristos             ret=inflate(&zcpr,Z_SYNC_FLUSH);
251*16dce513Schristos             lOrigDone += (zcpr.total_in-all_read_before);
252*16dce513Schristos             lOrigToDo -= (zcpr.total_in-all_read_before);
253*16dce513Schristos             step++;
254*16dce513Schristos         } while (ret==Z_OK);
255*16dce513Schristos 
256*16dce513Schristos         lSizeUncpr=zcpr.total_out;
257*16dce513Schristos         inflateEnd(&zcpr);
258*16dce513Schristos         dwGetTick=GetTickCount()-dwGetTick;
259*16dce513Schristos         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
260*16dce513Schristos         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
261*16dce513Schristos         printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
262*16dce513Schristos         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
263*16dce513Schristos         printf("uncpr  time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
264*16dce513Schristos         printf("uncpr  result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
265*16dce513Schristos     }
266*16dce513Schristos 
267*16dce513Schristos     if (lSizeUncpr==lFileSize)
268*16dce513Schristos     {
269*16dce513Schristos         if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
270*16dce513Schristos             printf("compare ok\n");
271*16dce513Schristos 
272*16dce513Schristos     }
273*16dce513Schristos 
274*16dce513Schristos     return 0;
275*16dce513Schristos }
276