xref: /netbsd-src/external/gpl3/gdb.old/dist/zlib/contrib/testzlib/testzlib.c (revision ed8eb4c2d4cb3dac3dc6123dae57e5931483a099)
14e00368fSchristos #include <stdio.h>
24e00368fSchristos #include <stdlib.h>
34e00368fSchristos #include <windows.h>
44e00368fSchristos 
54e00368fSchristos #include "zlib.h"
64e00368fSchristos 
74e00368fSchristos 
MyDoMinus64(LARGE_INTEGER * R,LARGE_INTEGER A,LARGE_INTEGER B)84e00368fSchristos void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
94e00368fSchristos {
104e00368fSchristos     R->HighPart = A.HighPart - B.HighPart;
114e00368fSchristos     if (A.LowPart >= B.LowPart)
124e00368fSchristos         R->LowPart = A.LowPart - B.LowPart;
134e00368fSchristos     else
144e00368fSchristos     {
154e00368fSchristos         R->LowPart = A.LowPart - B.LowPart;
164e00368fSchristos         R->HighPart --;
174e00368fSchristos     }
184e00368fSchristos }
194e00368fSchristos 
204e00368fSchristos #ifdef _M_X64
214e00368fSchristos // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
224e00368fSchristos unsigned __int64 __rdtsc(void);
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)234e00368fSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
244e00368fSchristos {
254e00368fSchristos  //   printf("rdtsc = %I64x\n",__rdtsc());
264e00368fSchristos    pbeginTime64->QuadPart=__rdtsc();
274e00368fSchristos }
284e00368fSchristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)294e00368fSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
304e00368fSchristos {
314e00368fSchristos     LARGE_INTEGER LIres;
324e00368fSchristos     unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
334e00368fSchristos     LIres.QuadPart=res;
344e00368fSchristos    // printf("rdtsc = %I64x\n",__rdtsc());
354e00368fSchristos     return LIres;
364e00368fSchristos }
374e00368fSchristos #else
384e00368fSchristos #ifdef _M_IX86
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)394e00368fSchristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
404e00368fSchristos {
414e00368fSchristos     DWORD dwEdx,dwEax;
424e00368fSchristos     _asm
434e00368fSchristos     {
444e00368fSchristos         rdtsc
454e00368fSchristos         mov dwEax,eax
464e00368fSchristos         mov dwEdx,edx
474e00368fSchristos     }
484e00368fSchristos     pbeginTime64->LowPart=dwEax;
494e00368fSchristos     pbeginTime64->HighPart=dwEdx;
504e00368fSchristos }
514e00368fSchristos 
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)524e00368fSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
534e00368fSchristos {
544e00368fSchristos     myGetRDTSC32(pbeginTime64);
554e00368fSchristos }
564e00368fSchristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)574e00368fSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
584e00368fSchristos {
594e00368fSchristos     LARGE_INTEGER LIres,endTime64;
604e00368fSchristos     myGetRDTSC32(&endTime64);
614e00368fSchristos 
624e00368fSchristos     LIres.LowPart=LIres.HighPart=0;
634e00368fSchristos     MyDoMinus64(&LIres,endTime64,beginTime64);
644e00368fSchristos     return LIres;
654e00368fSchristos }
664e00368fSchristos #else
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)674e00368fSchristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
684e00368fSchristos {
694e00368fSchristos }
704e00368fSchristos 
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)714e00368fSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
724e00368fSchristos {
734e00368fSchristos }
744e00368fSchristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)754e00368fSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
764e00368fSchristos {
774e00368fSchristos     LARGE_INTEGER lr;
784e00368fSchristos     lr.QuadPart=0;
794e00368fSchristos     return lr;
804e00368fSchristos }
814e00368fSchristos #endif
824e00368fSchristos #endif
834e00368fSchristos 
BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)844e00368fSchristos void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
854e00368fSchristos {
864e00368fSchristos     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
874e00368fSchristos     {
884e00368fSchristos         pbeginTime64->LowPart = GetTickCount();
894e00368fSchristos         pbeginTime64->HighPart = 0;
904e00368fSchristos     }
914e00368fSchristos }
924e00368fSchristos 
GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)934e00368fSchristos DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
944e00368fSchristos {
954e00368fSchristos     LARGE_INTEGER endTime64,ticksPerSecond,ticks;
964e00368fSchristos     DWORDLONG ticksShifted,tickSecShifted;
974e00368fSchristos     DWORD dwLog=16+0;
984e00368fSchristos     DWORD dwRet;
994e00368fSchristos     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
1004e00368fSchristos         dwRet = (GetTickCount() - beginTime64.LowPart)*1;
1014e00368fSchristos     else
1024e00368fSchristos     {
1034e00368fSchristos         MyDoMinus64(&ticks,endTime64,beginTime64);
1044e00368fSchristos         QueryPerformanceFrequency(&ticksPerSecond);
1054e00368fSchristos 
1064e00368fSchristos 
1074e00368fSchristos         {
1084e00368fSchristos             ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
1094e00368fSchristos             tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
1104e00368fSchristos 
1114e00368fSchristos         }
1124e00368fSchristos 
1134e00368fSchristos         dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
1144e00368fSchristos         dwRet *=1;
1154e00368fSchristos     }
1164e00368fSchristos     return dwRet;
1174e00368fSchristos }
1184e00368fSchristos 
ReadFileMemory(const char * filename,long * plFileSize,unsigned char ** pFilePtr)119*ed8eb4c2Schristos int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
1204e00368fSchristos {
1214e00368fSchristos     FILE* stream;
122*ed8eb4c2Schristos     unsigned char* ptr;
1234e00368fSchristos     int retVal=1;
1244e00368fSchristos     stream=fopen(filename, "rb");
1254e00368fSchristos     if (stream==NULL)
1264e00368fSchristos         return 0;
1274e00368fSchristos 
1284e00368fSchristos     fseek(stream,0,SEEK_END);
1294e00368fSchristos 
1304e00368fSchristos     *plFileSize=ftell(stream);
1314e00368fSchristos     fseek(stream,0,SEEK_SET);
1324e00368fSchristos     ptr=malloc((*plFileSize)+1);
1334e00368fSchristos     if (ptr==NULL)
1344e00368fSchristos         retVal=0;
1354e00368fSchristos     else
1364e00368fSchristos     {
1374e00368fSchristos         if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
1384e00368fSchristos             retVal=0;
1394e00368fSchristos     }
1404e00368fSchristos     fclose(stream);
1414e00368fSchristos     *pFilePtr=ptr;
1424e00368fSchristos     return retVal;
1434e00368fSchristos }
1444e00368fSchristos 
main(int argc,char * argv[])1454e00368fSchristos int main(int argc, char *argv[])
1464e00368fSchristos {
1474e00368fSchristos     int BlockSizeCompress=0x8000;
1484e00368fSchristos     int BlockSizeUncompress=0x8000;
1494e00368fSchristos     int cprLevel=Z_DEFAULT_COMPRESSION ;
1504e00368fSchristos     long lFileSize;
1514e00368fSchristos     unsigned char* FilePtr;
1524e00368fSchristos     long lBufferSizeCpr;
1534e00368fSchristos     long lBufferSizeUncpr;
1544e00368fSchristos     long lCompressedSize=0;
1554e00368fSchristos     unsigned char* CprPtr;
1564e00368fSchristos     unsigned char* UncprPtr;
1574e00368fSchristos     long lSizeCpr,lSizeUncpr;
1584e00368fSchristos     DWORD dwGetTick,dwMsecQP;
1594e00368fSchristos     LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
1604e00368fSchristos 
1614e00368fSchristos     if (argc<=1)
1624e00368fSchristos     {
1634e00368fSchristos         printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
1644e00368fSchristos         return 0;
1654e00368fSchristos     }
1664e00368fSchristos 
1674e00368fSchristos     if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
1684e00368fSchristos     {
1694e00368fSchristos         printf("error reading %s\n",argv[1]);
1704e00368fSchristos         return 1;
1714e00368fSchristos     }
1724e00368fSchristos     else printf("file %s read, %u bytes\n",argv[1],lFileSize);
1734e00368fSchristos 
1744e00368fSchristos     if (argc>=3)
1754e00368fSchristos         BlockSizeCompress=atol(argv[2]);
1764e00368fSchristos 
1774e00368fSchristos     if (argc>=4)
1784e00368fSchristos         BlockSizeUncompress=atol(argv[3]);
1794e00368fSchristos 
1804e00368fSchristos     if (argc>=5)
1814e00368fSchristos         cprLevel=(int)atol(argv[4]);
1824e00368fSchristos 
1834e00368fSchristos     lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
1844e00368fSchristos     lBufferSizeUncpr = lBufferSizeCpr;
1854e00368fSchristos 
1864e00368fSchristos     CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
1874e00368fSchristos 
1884e00368fSchristos     BeginCountPerfCounter(&li_qp,TRUE);
1894e00368fSchristos     dwGetTick=GetTickCount();
1904e00368fSchristos     BeginCountRdtsc(&li_rdtsc);
1914e00368fSchristos     {
1924e00368fSchristos         z_stream zcpr;
1934e00368fSchristos         int ret=Z_OK;
1944e00368fSchristos         long lOrigToDo = lFileSize;
1954e00368fSchristos         long lOrigDone = 0;
1964e00368fSchristos         int step=0;
1974e00368fSchristos         memset(&zcpr,0,sizeof(z_stream));
1984e00368fSchristos         deflateInit(&zcpr,cprLevel);
1994e00368fSchristos 
2004e00368fSchristos         zcpr.next_in = FilePtr;
2014e00368fSchristos         zcpr.next_out = CprPtr;
2024e00368fSchristos 
2034e00368fSchristos 
2044e00368fSchristos         do
2054e00368fSchristos         {
2064e00368fSchristos             long all_read_before = zcpr.total_in;
2074e00368fSchristos             zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
2084e00368fSchristos             zcpr.avail_out = BlockSizeCompress;
2094e00368fSchristos             ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
2104e00368fSchristos             lOrigDone += (zcpr.total_in-all_read_before);
2114e00368fSchristos             lOrigToDo -= (zcpr.total_in-all_read_before);
2124e00368fSchristos             step++;
2134e00368fSchristos         } while (ret==Z_OK);
2144e00368fSchristos 
2154e00368fSchristos         lSizeCpr=zcpr.total_out;
2164e00368fSchristos         deflateEnd(&zcpr);
2174e00368fSchristos         dwGetTick=GetTickCount()-dwGetTick;
2184e00368fSchristos         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
2194e00368fSchristos         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
2204e00368fSchristos         printf("total compress size = %u, in %u step\n",lSizeCpr,step);
2214e00368fSchristos         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
2224e00368fSchristos         printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
2234e00368fSchristos         printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
2244e00368fSchristos     }
2254e00368fSchristos 
2264e00368fSchristos     CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
2274e00368fSchristos     UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
2284e00368fSchristos 
2294e00368fSchristos     BeginCountPerfCounter(&li_qp,TRUE);
2304e00368fSchristos     dwGetTick=GetTickCount();
2314e00368fSchristos     BeginCountRdtsc(&li_rdtsc);
2324e00368fSchristos     {
2334e00368fSchristos         z_stream zcpr;
2344e00368fSchristos         int ret=Z_OK;
2354e00368fSchristos         long lOrigToDo = lSizeCpr;
2364e00368fSchristos         long lOrigDone = 0;
2374e00368fSchristos         int step=0;
2384e00368fSchristos         memset(&zcpr,0,sizeof(z_stream));
2394e00368fSchristos         inflateInit(&zcpr);
2404e00368fSchristos 
2414e00368fSchristos         zcpr.next_in = CprPtr;
2424e00368fSchristos         zcpr.next_out = UncprPtr;
2434e00368fSchristos 
2444e00368fSchristos 
2454e00368fSchristos         do
2464e00368fSchristos         {
2474e00368fSchristos             long all_read_before = zcpr.total_in;
2484e00368fSchristos             zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
2494e00368fSchristos             zcpr.avail_out = BlockSizeUncompress;
2504e00368fSchristos             ret=inflate(&zcpr,Z_SYNC_FLUSH);
2514e00368fSchristos             lOrigDone += (zcpr.total_in-all_read_before);
2524e00368fSchristos             lOrigToDo -= (zcpr.total_in-all_read_before);
2534e00368fSchristos             step++;
2544e00368fSchristos         } while (ret==Z_OK);
2554e00368fSchristos 
2564e00368fSchristos         lSizeUncpr=zcpr.total_out;
2574e00368fSchristos         inflateEnd(&zcpr);
2584e00368fSchristos         dwGetTick=GetTickCount()-dwGetTick;
2594e00368fSchristos         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
2604e00368fSchristos         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
2614e00368fSchristos         printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
2624e00368fSchristos         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
2634e00368fSchristos         printf("uncpr  time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
2644e00368fSchristos         printf("uncpr  result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
2654e00368fSchristos     }
2664e00368fSchristos 
2674e00368fSchristos     if (lSizeUncpr==lFileSize)
2684e00368fSchristos     {
2694e00368fSchristos         if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
2704e00368fSchristos             printf("compare ok\n");
2714e00368fSchristos 
2724e00368fSchristos     }
2734e00368fSchristos 
2744e00368fSchristos     return 0;
2754e00368fSchristos }
276