123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- IFNDEF USE_ZLIB
- IFNDEF CRC_TABLE_ONLY
- .386p
- name crc_i386
- IFDEF NO_ALIGN
- .model flat
- ENDIF
- IFNDEF PRE_686
- IFNDEF __686
- __686 EQU 1
- ENDIF
- ENDIF
- extrn _get_crc_table:near
- IFNDEF NO_STD_STACKFRAME
-
-
-
- STD_ENTRY MACRO
- push ebp
- mov ebp,esp
- ENDM
- Arg1 EQU 08H[ebp]
- Arg2 EQU 0CH[ebp]
- Arg3 EQU 10H[ebp]
- STD_LEAVE MACRO
- pop ebp
- ENDM
- ELSE
- STD_ENTRY MACRO
- ENDM
- Arg1 EQU 18H[esp]
- Arg2 EQU 1CH[esp]
- Arg3 EQU 20H[esp]
- STD_LEAVE MACRO
- ENDM
- ENDIF
- IFNDEF __686
- Do_CRC MACRO
- mov bl,al
- shr eax,8
- xor eax,[edi+ebx*4]
- ENDM
- ELSE
- Do_CRC MACRO
- movzx ebx,al
- shr eax,8
- xor eax,[edi+ebx*4]
- ENDM
- ENDIF
- Do_CRC_byte MACRO
- xor al, byte ptr [esi]
- inc esi
- Do_CRC
- ENDM
- Do_CRC_byteof MACRO ofs
- xor al, byte ptr [esi+ofs]
- Do_CRC
- ENDM
- IFNDEF NO_32_BIT_LOADS
- IFDEF IZ_CRCOPTIM_UNFOLDTBL
-
- SavLen EQU Arg3
- UpdCRC_dword MACRO
- movzx ebx,al
- mov edx,[edi+ebx*4+3072]
- movzx ebx,ah
- shr eax,16
- xor edx,[edi+ebx*4+2048]
- movzx ebx,al
- shr eax,8
- xor edx,[edi+ebx*4+1024]
- mov eax,[edi+eax*4]
- xor eax,edx
- ENDM
- UpdCRC_dword_sh MACRO dwPtrIncr
- movzx ebx,al
- mov edx,[edi+ebx*4+3072]
- movzx ebx,ah
- xor edx,[edi+ebx*4+2048]
- shr eax,16
- movzx ebx,al
- add esi, 4*dwPtrIncr
- shr eax,8
- xor edx,[edi+ebx*4+1024]
- mov eax,[edi+eax*4]
- xor eax,edx
- ENDM
- ELSE
-
- SavLen EQU edx
- UpdCRC_dword MACRO
- Do_CRC
- Do_CRC
- Do_CRC
- Do_CRC
- ENDM
- UpdCRC_dword_sh MACRO dwPtrIncr
- Do_CRC
- Do_CRC
- add esi, 4*dwPtrIncr
- Do_CRC
- Do_CRC
- ENDM
- ENDIF
- Do_CRC_dword MACRO
- xor eax, dword ptr [esi]
- UpdCRC_dword_sh 1
- ENDM
- Do_CRC_4dword MACRO
- xor eax, dword ptr [esi]
- UpdCRC_dword
- xor eax, dword ptr [esi+4]
- UpdCRC_dword
- xor eax, dword ptr [esi+8]
- UpdCRC_dword
- xor eax, dword ptr [esi+12]
- UpdCRC_dword_sh 4
- ENDM
- ENDIF
- IFNDEF NO_ALIGN
- _TEXT segment use32 para public 'CODE'
- ELSE
- _TEXT segment use32
- ENDIF
- assume CS: _TEXT
- public _crc32
- _crc32 proc near
- STD_ENTRY
- push edi
- push esi
- push ebx
- push edx
- push ecx
- mov esi,Arg2
- sub eax,eax
- test esi,esi
- jz fine
- call _get_crc_table
- mov edi,eax
- mov eax,Arg1
- IFNDEF __686
- sub ebx,ebx
- ENDIF
- mov ecx,Arg3
- not eax
- test ecx,ecx
- IFNDEF NO_UNROLLED_LOOPS
- jz bail
- IFNDEF NO_32_BIT_LOADS
- align_loop:
- test esi,3
- jz SHORT aligned_now
- Do_CRC_byte
- dec ecx
- jnz align_loop
- aligned_now:
- ENDIF
- mov SavLen,ecx
- shr ecx,4
- jz No_Sixteens
- IFNDEF NO_ALIGN
- align 16
- ENDIF
- 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
- add esi, 16
- ENDIF
- dec ecx
- jnz Next_Sixteen
- No_Sixteens:
- mov ecx,SavLen
- and ecx,00000000FH
- IFNDEF NO_32_BIT_LOADS
- shr ecx,2
- jz SHORT No_Fours
- Next_Four:
- Do_CRC_dword
- dec ecx
- jnz Next_Four
- No_Fours:
- mov ecx,SavLen
- and ecx,000000003H
- ENDIF
- ENDIF
- jz SHORT bail
- IFNDEF NO_ALIGN
- align 16
- ENDIF
- loupe:
- Do_CRC_byte
- dec ecx
- jnz loupe
- bail:
- not eax
- fine:
- pop ecx
- pop edx
- pop ebx
- pop esi
- pop edi
- STD_LEAVE
- ret
- _crc32 endp
- _TEXT ends
- ENDIF
- ENDIF
- end
|