xref: /netbsd-src/external/gpl3/binutils/dist/zlib/contrib/testzlib/testzlib.c (revision 8cbf5cb7c47586c462bde6a6b4444605bb6ef4e2)
19573673dSchristos #include <stdio.h>
29573673dSchristos #include <stdlib.h>
39573673dSchristos #include <windows.h>
49573673dSchristos 
59573673dSchristos #include "zlib.h"
69573673dSchristos 
79573673dSchristos 
MyDoMinus64(LARGE_INTEGER * R,LARGE_INTEGER A,LARGE_INTEGER B)89573673dSchristos void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
99573673dSchristos {
109573673dSchristos     R->HighPart = A.HighPart - B.HighPart;
119573673dSchristos     if (A.LowPart >= B.LowPart)
129573673dSchristos         R->LowPart = A.LowPart - B.LowPart;
139573673dSchristos     else
149573673dSchristos     {
159573673dSchristos         R->LowPart = A.LowPart - B.LowPart;
169573673dSchristos         R->HighPart --;
179573673dSchristos     }
189573673dSchristos }
199573673dSchristos 
209573673dSchristos #ifdef _M_X64
219573673dSchristos // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
229573673dSchristos unsigned __int64 __rdtsc(void);
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)239573673dSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
249573673dSchristos {
259573673dSchristos  //   printf("rdtsc = %I64x\n",__rdtsc());
269573673dSchristos    pbeginTime64->QuadPart=__rdtsc();
279573673dSchristos }
289573673dSchristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)299573673dSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
309573673dSchristos {
319573673dSchristos     LARGE_INTEGER LIres;
329573673dSchristos     unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
339573673dSchristos     LIres.QuadPart=res;
349573673dSchristos    // printf("rdtsc = %I64x\n",__rdtsc());
359573673dSchristos     return LIres;
369573673dSchristos }
379573673dSchristos #else
389573673dSchristos #ifdef _M_IX86
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)399573673dSchristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
409573673dSchristos {
419573673dSchristos     DWORD dwEdx,dwEax;
429573673dSchristos     _asm
439573673dSchristos     {
449573673dSchristos         rdtsc
459573673dSchristos         mov dwEax,eax
469573673dSchristos         mov dwEdx,edx
479573673dSchristos     }
489573673dSchristos     pbeginTime64->LowPart=dwEax;
499573673dSchristos     pbeginTime64->HighPart=dwEdx;
509573673dSchristos }
519573673dSchristos 
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)529573673dSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
539573673dSchristos {
549573673dSchristos     myGetRDTSC32(pbeginTime64);
559573673dSchristos }
569573673dSchristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)579573673dSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
589573673dSchristos {
599573673dSchristos     LARGE_INTEGER LIres,endTime64;
609573673dSchristos     myGetRDTSC32(&endTime64);
619573673dSchristos 
629573673dSchristos     LIres.LowPart=LIres.HighPart=0;
639573673dSchristos     MyDoMinus64(&LIres,endTime64,beginTime64);
649573673dSchristos     return LIres;
659573673dSchristos }
669573673dSchristos #else
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)679573673dSchristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
689573673dSchristos {
699573673dSchristos }
709573673dSchristos 
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)719573673dSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
729573673dSchristos {
739573673dSchristos }
749573673dSchristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)759573673dSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
769573673dSchristos {
779573673dSchristos     LARGE_INTEGER lr;
789573673dSchristos     lr.QuadPart=0;
799573673dSchristos     return lr;
809573673dSchristos }
819573673dSchristos #endif
829573673dSchristos #endif
839573673dSchristos 
BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)849573673dSchristos void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
859573673dSchristos {
869573673dSchristos     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
879573673dSchristos     {
889573673dSchristos         pbeginTime64->LowPart = GetTickCount();
899573673dSchristos         pbeginTime64->HighPart = 0;
909573673dSchristos     }
919573673dSchristos }
929573673dSchristos 
GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)939573673dSchristos DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
949573673dSchristos {
959573673dSchristos     LARGE_INTEGER endTime64,ticksPerSecond,ticks;
969573673dSchristos     DWORDLONG ticksShifted,tickSecShifted;
979573673dSchristos     DWORD dwLog=16+0;
989573673dSchristos     DWORD dwRet;
999573673dSchristos     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
1009573673dSchristos         dwRet = (GetTickCount() - beginTime64.LowPart)*1;
1019573673dSchristos     else
1029573673dSchristos     {
1039573673dSchristos         MyDoMinus64(&ticks,endTime64,beginTime64);
1049573673dSchristos         QueryPerformanceFrequency(&ticksPerSecond);
1059573673dSchristos 
1069573673dSchristos 
1079573673dSchristos         {
1089573673dSchristos             ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
1099573673dSchristos             tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
1109573673dSchristos 
1119573673dSchristos         }
1129573673dSchristos 
1139573673dSchristos         dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
1149573673dSchristos         dwRet *=1;
1159573673dSchristos     }
1169573673dSchristos     return dwRet;
1179573673dSchristos }
1189573673dSchristos 
ReadFileMemory(const char * filename,long * plFileSize,unsigned char ** pFilePtr)119*8cbf5cb7Schristos int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
1209573673dSchristos {
1219573673dSchristos     FILE* stream;
122*8cbf5cb7Schristos     unsigned char* ptr;
1239573673dSchristos     int retVal=1;
1249573673dSchristos     stream=fopen(filename, "rb");
1259573673dSchristos     if (stream==NULL)
1269573673dSchristos         return 0;
1279573673dSchristos 
1289573673dSchristos     fseek(stream,0,SEEK_END);
1299573673dSchristos 
1309573673dSchristos     *plFileSize=ftell(stream);
1319573673dSchristos     fseek(stream,0,SEEK_SET);
1329573673dSchristos     ptr=malloc((*plFileSize)+1);
1339573673dSchristos     if (ptr==NULL)
1349573673dSchristos         retVal=0;
1359573673dSchristos     else
1369573673dSchristos     {
1379573673dSchristos         if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
1389573673dSchristos             retVal=0;
1399573673dSchristos     }
1409573673dSchristos     fclose(stream);
1419573673dSchristos     *pFilePtr=ptr;
1429573673dSchristos     return retVal;
1439573673dSchristos }
1449573673dSchristos 
main(int argc,char * argv[])1459573673dSchristos int main(int argc, char *argv[])
1469573673dSchristos {
1479573673dSchristos     int BlockSizeCompress=0x8000;
1489573673dSchristos     int BlockSizeUncompress=0x8000;
1499573673dSchristos     int cprLevel=Z_DEFAULT_COMPRESSION ;
1509573673dSchristos     long lFileSize;
1519573673dSchristos     unsigned char* FilePtr;
1529573673dSchristos     long lBufferSizeCpr;
1539573673dSchristos     long lBufferSizeUncpr;
1549573673dSchristos     long lCompressedSize=0;
1559573673dSchristos     unsigned char* CprPtr;
1569573673dSchristos     unsigned char* UncprPtr;
1579573673dSchristos     long lSizeCpr,lSizeUncpr;
1589573673dSchristos     DWORD dwGetTick,dwMsecQP;
1599573673dSchristos     LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
1609573673dSchristos 
1619573673dSchristos     if (argc<=1)
1629573673dSchristos     {
1639573673dSchristos         printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
1649573673dSchristos         return 0;
1659573673dSchristos     }
1669573673dSchristos 
1679573673dSchristos     if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
1689573673dSchristos     {
1699573673dSchristos         printf("error reading %s\n",argv[1]);
1709573673dSchristos         return 1;
1719573673dSchristos     }
1729573673dSchristos     else printf("file %s read, %u bytes\n",argv[1],lFileSize);
1739573673dSchristos 
1749573673dSchristos     if (argc>=3)
1759573673dSchristos         BlockSizeCompress=atol(argv[2]);
1769573673dSchristos 
1779573673dSchristos     if (argc>=4)
1789573673dSchristos         BlockSizeUncompress=atol(argv[3]);
1799573673dSchristos 
1809573673dSchristos     if (argc>=5)
1819573673dSchristos         cprLevel=(int)atol(argv[4]);
1829573673dSchristos 
1839573673dSchristos     lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
1849573673dSchristos     lBufferSizeUncpr = lBufferSizeCpr;
1859573673dSchristos 
1869573673dSchristos     CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
1879573673dSchristos 
1889573673dSchristos     BeginCountPerfCounter(&li_qp,TRUE);
1899573673dSchristos     dwGetTick=GetTickCount();
1909573673dSchristos     BeginCountRdtsc(&li_rdtsc);
1919573673dSchristos     {
1929573673dSchristos         z_stream zcpr;
1939573673dSchristos         int ret=Z_OK;
1949573673dSchristos         long lOrigToDo = lFileSize;
1959573673dSchristos         long lOrigDone = 0;
1969573673dSchristos         int step=0;
1979573673dSchristos         memset(&zcpr,0,sizeof(z_stream));
1989573673dSchristos         deflateInit(&zcpr,cprLevel);
1999573673dSchristos 
2009573673dSchristos         zcpr.next_in = FilePtr;
2019573673dSchristos         zcpr.next_out = CprPtr;
2029573673dSchristos 
2039573673dSchristos 
2049573673dSchristos         do
2059573673dSchristos         {
2069573673dSchristos             long all_read_before = zcpr.total_in;
2079573673dSchristos             zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
2089573673dSchristos             zcpr.avail_out = BlockSizeCompress;
2099573673dSchristos             ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
2109573673dSchristos             lOrigDone += (zcpr.total_in-all_read_before);
2119573673dSchristos             lOrigToDo -= (zcpr.total_in-all_read_before);
2129573673dSchristos             step++;
2139573673dSchristos         } while (ret==Z_OK);
2149573673dSchristos 
2159573673dSchristos         lSizeCpr=zcpr.total_out;
2169573673dSchristos         deflateEnd(&zcpr);
2179573673dSchristos         dwGetTick=GetTickCount()-dwGetTick;
2189573673dSchristos         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
2199573673dSchristos         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
2209573673dSchristos         printf("total compress size = %u, in %u step\n",lSizeCpr,step);
2219573673dSchristos         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
2229573673dSchristos         printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
2239573673dSchristos         printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
2249573673dSchristos     }
2259573673dSchristos 
2269573673dSchristos     CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
2279573673dSchristos     UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
2289573673dSchristos 
2299573673dSchristos     BeginCountPerfCounter(&li_qp,TRUE);
2309573673dSchristos     dwGetTick=GetTickCount();
2319573673dSchristos     BeginCountRdtsc(&li_rdtsc);
2329573673dSchristos     {
2339573673dSchristos         z_stream zcpr;
2349573673dSchristos         int ret=Z_OK;
2359573673dSchristos         long lOrigToDo = lSizeCpr;
2369573673dSchristos         long lOrigDone = 0;
2379573673dSchristos         int step=0;
2389573673dSchristos         memset(&zcpr,0,sizeof(z_stream));
2399573673dSchristos         inflateInit(&zcpr);
2409573673dSchristos 
2419573673dSchristos         zcpr.next_in = CprPtr;
2429573673dSchristos         zcpr.next_out = UncprPtr;
2439573673dSchristos 
2449573673dSchristos 
2459573673dSchristos         do
2469573673dSchristos         {
2479573673dSchristos             long all_read_before = zcpr.total_in;
2489573673dSchristos             zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
2499573673dSchristos             zcpr.avail_out = BlockSizeUncompress;
2509573673dSchristos             ret=inflate(&zcpr,Z_SYNC_FLUSH);
2519573673dSchristos             lOrigDone += (zcpr.total_in-all_read_before);
2529573673dSchristos             lOrigToDo -= (zcpr.total_in-all_read_before);
2539573673dSchristos             step++;
2549573673dSchristos         } while (ret==Z_OK);
2559573673dSchristos 
2569573673dSchristos         lSizeUncpr=zcpr.total_out;
2579573673dSchristos         inflateEnd(&zcpr);
2589573673dSchristos         dwGetTick=GetTickCount()-dwGetTick;
2599573673dSchristos         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
2609573673dSchristos         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
2619573673dSchristos         printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
2629573673dSchristos         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
2639573673dSchristos         printf("uncpr  time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
2649573673dSchristos         printf("uncpr  result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
2659573673dSchristos     }
2669573673dSchristos 
2679573673dSchristos     if (lSizeUncpr==lFileSize)
2689573673dSchristos     {
2699573673dSchristos         if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
2709573673dSchristos             printf("compare ok\n");
2719573673dSchristos 
2729573673dSchristos     }
2739573673dSchristos 
2749573673dSchristos     return 0;
2759573673dSchristos }
276