123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- #include "../zip.h"
- #include "../crc32.h"
- #if defined(ASM_CRC) && !defined(USE_ZLIB) && !defined(CRC_TABLE_ONLY)
- #if !defined(PRE_686) && !defined(__686)
- # define __686
- #endif
- #ifndef ZCONST
- # define ZCONST const
- #endif
- #if (defined(_MSC_VER) && _MSC_VER >= 700)
- #if (defined(_M_IX86) && _M_IX86 >= 300)
- # define MSC_INLINE_ASM_32BIT_SUPPORT
-
- # pragma warning( disable : 4035 )
- #endif
- #endif
- #if (defined(__BORLANDC__) && __BORLANDC__ >= 452)
- # define MSC_INLINE_ASM_32BIT_SUPPORT
- #endif
- #ifdef MSC_INLINE_ASM_32BIT_SUPPORT
- #ifndef __686
- #define Do_CRC { \
- __asm { mov bl, al }; \
- __asm { shr eax, 8 }; \
- __asm { xor eax, [edi+ebx*4] }; }
- #else
- #define Do_CRC { \
- __asm { movzx ebx, al }; \
- __asm { shr eax, 8 }; \
- __asm { xor eax, [edi+ebx*4] }; }
- #endif
- #define Do_CRC_byte { \
- __asm { xor al, byte ptr [esi] }; \
- __asm { inc esi }; \
- Do_CRC; }
- #define Do_CRC_byteof(ofs) { \
- __asm { xor al, byte ptr [esi+(ofs)] }; \
- Do_CRC; }
- #ifndef NO_32_BIT_LOADS
- #ifdef IZ_CRCOPTIM_UNFOLDTBL
- # define SavLen len
- # define UpdCRC_dword { \
- __asm { movzx ebx,al }; \
- __asm { mov edx,[edi+ebx*4+3072] }; \
- __asm { movzx ebx,ah }; \
- __asm { shr eax,16 }; \
- __asm { xor edx,[edi+ebx*4+2048] }; \
- __asm { movzx ebx,al }; \
- __asm { shr eax,8 }; \
- __asm { xor edx,[edi+ebx*4+1024] }; \
- __asm { mov eax,[edi+eax*4] }; \
- __asm { xor eax,edx }; }
- # define UpdCRC_dword_sh(dwPtrIncr) { \
- __asm { movzx ebx,al }; \
- __asm { mov edx,[edi+ebx*4+3072] }; \
- __asm { movzx ebx,ah }; \
- __asm { xor edx,[edi+ebx*4+2048] }; \
- __asm { shr eax,16 }; \
- __asm { movzx ebx,al }; \
- __asm { add esi, 4*dwPtrIncr }; \
- __asm { shr eax,8 }; \
- __asm { xor edx,[edi+ebx*4+1024] }; \
- __asm { mov eax,[edi+eax*4] }; \
- __asm { xor eax,edx }; }
- #else
- # define SavLen edx
- # define UpdCRC_dword { \
- Do_CRC; \
- Do_CRC; \
- Do_CRC; \
- Do_CRC; }
- # define UpdCRC_dword_sh(dwPtrIncr) { \
- Do_CRC; \
- Do_CRC; \
- __asm { add esi, 4*(dwPtrIncr) }; \
- Do_CRC; \
- Do_CRC; }
- #endif
- #define Do_CRC_dword { \
- __asm { xor eax, dword ptr [esi] }; \
- UpdCRC_dword_sh(1); }
- #define Do_CRC_4dword { \
- __asm { xor eax, dword ptr [esi] }; \
- UpdCRC_dword; \
- __asm { xor eax, dword ptr [esi+4] }; \
- UpdCRC_dword; \
- __asm { xor eax, dword ptr [esi+8] }; \
- UpdCRC_dword; \
- __asm { xor eax, dword ptr [esi+12] }; \
- UpdCRC_dword_sh(4); }
- #endif
- ulg crc32(crc, buf, len)
- ulg crc;
- ZCONST uch *buf;
- extent len;
- {
- __asm {
- push edx
- push ecx
- mov esi,buf ;
- sub eax,eax ;
- test esi,esi ;
- jz fine ;
- call get_crc_table
- mov edi,eax
- mov eax,crc ;
- #ifndef __686
- sub ebx,ebx ;
- #endif
- mov ecx,len ;
- not eax ;
- test ecx,ecx
- #ifndef NO_UNROLLED_LOOPS
- jz bail
- # ifndef NO_32_BIT_LOADS
- align_loop:
- test esi,3 ;
- jz aligned_now ;
- }
- Do_CRC_byte ;
- __asm {
- dec ecx
- jnz align_loop
- aligned_now:
- # endif
- mov SavLen,ecx ;
- shr ecx,4 ;
- jz No_Sixteens
- ; align loop head at start of 486 internal cache line !!
- align 16
- Next_Sixteen:
- }
- # ifndef NO_32_BIT_LOADS
- Do_CRC_4dword ;
- # else
- Do_CRC_byteof(0) ;
- Do_CRC_byteof(1) ;
- Do_CRC_byteof(2) ;
- Do_CRC_byteof(3) ;
- Do_CRC_byteof(4) ;
- Do_CRC_byteof(5) ;
- Do_CRC_byteof(6) ;
- Do_CRC_byteof(7) ;
- Do_CRC_byteof(8) ;
- Do_CRC_byteof(9) ;
- Do_CRC_byteof(10) ;
- Do_CRC_byteof(11) ;
- Do_CRC_byteof(12) ;
- Do_CRC_byteof(13) ;
- Do_CRC_byteof(14) ;
- Do_CRC_byteof(15) ;
- __asm { add esi,16 };
- # endif
- __asm {
- dec ecx
- jnz Next_Sixteen
- No_Sixteens:
- mov ecx,SavLen
- and ecx,00000000FH ;
- # ifndef NO_32_BIT_LOADS
- shr ecx,2
- jz No_Fours
- Next_Four:
- }
- Do_CRC_dword ;
- __asm {
- dec ecx
- jnz Next_Four
- No_Fours:
- mov ecx,SavLen
- and ecx,000000003H ;
- # endif
- #endif
- jz bail ;
- ; align loop head at start of 486 internal cache line !!
- align 16
- loupe: ;
- }
- Do_CRC_byte ;
- __asm {
- dec ecx ;
- jnz loupe
- bail: ;
- not eax ;
- fine:
- pop ecx
- pop edx
- }
- #ifdef NEED_RETURN
- return _EAX;
- #endif
- }
- #endif
- #if (defined(_MSC_VER) && _MSC_VER >= 700)
- #if (defined(_M_IX86) && _M_IX86 >= 300)
-
- # pragma warning( default : 4035 )
- #endif
- #endif
- #endif
|