1; 7zCrcOpt.asm -- CRC32 calculation : optimized version 2; 2009-12-12 : Igor Pavlov : Public domain 3 4include 7zAsm.asm 5 6MY_ASM_START 7 8rD equ r2 9rN equ r7 10 11ifdef x64 12 num_VAR equ r8 13 table_VAR equ r9 14else 15 data_size equ (REG_SIZE * 5) 16 crc_table equ (REG_SIZE + data_size) 17 num_VAR equ [r4 + data_size] 18 table_VAR equ [r4 + crc_table] 19endif 20 21SRCDAT equ rN + rD + 4 * 22 23CRC macro op:req, dest:req, src:req, t:req 24 op dest, DWORD PTR [r5 + src * 4 + 0400h * t] 25endm 26 27CRC_XOR macro dest:req, src:req, t:req 28 CRC xor, dest, src, t 29endm 30 31CRC_MOV macro dest:req, src:req, t:req 32 CRC mov, dest, src, t 33endm 34 35CRC1b macro 36 movzx x6, BYTE PTR [rD] 37 inc rD 38 movzx x3, x0_L 39 xor x6, x3 40 shr x0, 8 41 CRC xor, x0, r6, 0 42 dec rN 43endm 44 45MY_PROLOG macro crc_end:req 46 MY_PUSH_4_REGS 47 48 mov x0, x1 49 mov rN, num_VAR 50 mov r5, table_VAR 51 test rN, rN 52 jz crc_end 53 @@: 54 test rD, 7 55 jz @F 56 CRC1b 57 jnz @B 58 @@: 59 cmp rN, 16 60 jb crc_end 61 add rN, rD 62 mov num_VAR, rN 63 sub rN, 8 64 and rN, NOT 7 65 sub rD, rN 66 xor x0, [SRCDAT 0] 67endm 68 69MY_EPILOG macro crc_end:req 70 xor x0, [SRCDAT 0] 71 mov rD, rN 72 mov rN, num_VAR 73 sub rN, rD 74 crc_end: 75 test rN, rN 76 jz @F 77 CRC1b 78 jmp crc_end 79 @@: 80 MY_POP_4_REGS 81endm 82 83MY_PROC CrcUpdateT8, 4 84 MY_PROLOG crc_end_8 85 mov x1, [SRCDAT 1] 86 align 16 87 main_loop_8: 88 mov x6, [SRCDAT 2] 89 movzx x3, x1_L 90 CRC_XOR x6, r3, 3 91 movzx x3, x1_H 92 CRC_XOR x6, r3, 2 93 shr x1, 16 94 movzx x3, x1_L 95 movzx x1, x1_H 96 CRC_XOR x6, r3, 1 97 movzx x3, x0_L 98 CRC_XOR x6, r1, 0 99 100 mov x1, [SRCDAT 3] 101 CRC_XOR x6, r3, 7 102 movzx x3, x0_H 103 shr x0, 16 104 CRC_XOR x6, r3, 6 105 movzx x3, x0_L 106 CRC_XOR x6, r3, 5 107 movzx x3, x0_H 108 CRC_MOV x0, r3, 4 109 xor x0, x6 110 add rD, 8 111 jnz main_loop_8 112 113 MY_EPILOG crc_end_8 114MY_ENDP 115 116MY_PROC CrcUpdateT4, 4 117 MY_PROLOG crc_end_4 118 align 16 119 main_loop_4: 120 movzx x1, x0_L 121 movzx x3, x0_H 122 shr x0, 16 123 movzx x6, x0_H 124 and x0, 0FFh 125 CRC_MOV x1, r1, 3 126 xor x1, [SRCDAT 1] 127 CRC_XOR x1, r3, 2 128 CRC_XOR x1, r6, 0 129 CRC_XOR x1, r0, 1 130 131 movzx x0, x1_L 132 movzx x3, x1_H 133 shr x1, 16 134 movzx x6, x1_H 135 and x1, 0FFh 136 CRC_MOV x0, r0, 3 137 xor x0, [SRCDAT 2] 138 CRC_XOR x0, r3, 2 139 CRC_XOR x0, r6, 0 140 CRC_XOR x0, r1, 1 141 add rD, 8 142 jnz main_loop_4 143 144 MY_EPILOG crc_end_4 145MY_ENDP 146 147end 148