; 7zCrcOpt.asm -- CRC32 calculation : optimized version ; 2009-12-12 : Igor Pavlov : Public domain include 7zAsm.asm MY_ASM_START rD equ r2 rN equ r7 ifdef x64 num_VAR equ r8 table_VAR equ r9 else data_size equ (REG_SIZE * 5) crc_table equ (REG_SIZE + data_size) num_VAR equ [r4 + data_size] table_VAR equ [r4 + crc_table] endif SRCDAT equ rN + rD + 4 * CRC macro op:req, dest:req, src:req, t:req op dest, DWORD PTR [r5 + src * 4 + 0400h * t] endm CRC_XOR macro dest:req, src:req, t:req CRC xor, dest, src, t endm CRC_MOV macro dest:req, src:req, t:req CRC mov, dest, src, t endm CRC1b macro movzx x6, BYTE PTR [rD] inc rD movzx x3, x0_L xor x6, x3 shr x0, 8 CRC xor, x0, r6, 0 dec rN endm MY_PROLOG macro crc_end:req MY_PUSH_4_REGS mov x0, x1 mov rN, num_VAR mov r5, table_VAR test rN, rN jz crc_end @@: test rD, 7 jz @F CRC1b jnz @B @@: cmp rN, 16 jb crc_end add rN, rD mov num_VAR, rN sub rN, 8 and rN, NOT 7 sub rD, rN xor x0, [SRCDAT 0] endm MY_EPILOG macro crc_end:req xor x0, [SRCDAT 0] mov rD, rN mov rN, num_VAR sub rN, rD crc_end: test rN, rN jz @F CRC1b jmp crc_end @@: MY_POP_4_REGS endm MY_PROC CrcUpdateT8, 4 MY_PROLOG crc_end_8 mov x1, [SRCDAT 1] align 16 main_loop_8: mov x6, [SRCDAT 2] movzx x3, x1_L CRC_XOR x6, r3, 3 movzx x3, x1_H CRC_XOR x6, r3, 2 shr x1, 16 movzx x3, x1_L movzx x1, x1_H CRC_XOR x6, r3, 1 movzx x3, x0_L CRC_XOR x6, r1, 0 mov x1, [SRCDAT 3] CRC_XOR x6, r3, 7 movzx x3, x0_H shr x0, 16 CRC_XOR x6, r3, 6 movzx x3, x0_L CRC_XOR x6, r3, 5 movzx x3, x0_H CRC_MOV x0, r3, 4 xor x0, x6 add rD, 8 jnz main_loop_8 MY_EPILOG crc_end_8 MY_ENDP MY_PROC CrcUpdateT4, 4 MY_PROLOG crc_end_4 align 16 main_loop_4: movzx x1, x0_L movzx x3, x0_H shr x0, 16 movzx x6, x0_H and x0, 0FFh CRC_MOV x1, r1, 3 xor x1, [SRCDAT 1] CRC_XOR x1, r3, 2 CRC_XOR x1, r6, 0 CRC_XOR x1, r0, 1 movzx x0, x1_L movzx x3, x1_H shr x1, 16 movzx x6, x1_H and x1, 0FFh CRC_MOV x0, r0, 3 xor x0, [SRCDAT 2] CRC_XOR x0, r3, 2 CRC_XOR x0, r6, 0 CRC_XOR x0, r1, 1 add rD, 8 jnz main_loop_4 MY_EPILOG crc_end_4 MY_ENDP end