OLD | NEW |
(Empty) | |
| 1 ; 7zCrcOpt.asm -- CRC32 calculation : optimized version |
| 2 ; 2009-12-12 : Igor Pavlov : Public domain |
| 3 |
| 4 include 7zAsm.asm |
| 5 |
| 6 MY_ASM_START |
| 7 |
| 8 rD equ r2 |
| 9 rN equ r7 |
| 10 |
| 11 ifdef x64 |
| 12 num_VAR equ r8 |
| 13 table_VAR equ r9 |
| 14 else |
| 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] |
| 19 endif |
| 20 |
| 21 SRCDAT equ rN + rD + 4 * |
| 22 |
| 23 CRC macro op:req, dest:req, src:req, t:req |
| 24 op dest, DWORD PTR [r5 + src * 4 + 0400h * t] |
| 25 endm |
| 26 |
| 27 CRC_XOR macro dest:req, src:req, t:req |
| 28 CRC xor, dest, src, t |
| 29 endm |
| 30 |
| 31 CRC_MOV macro dest:req, src:req, t:req |
| 32 CRC mov, dest, src, t |
| 33 endm |
| 34 |
| 35 CRC1b 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 |
| 43 endm |
| 44 |
| 45 MY_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] |
| 67 endm |
| 68 |
| 69 MY_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 |
| 81 endm |
| 82 |
| 83 MY_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 |
| 114 MY_ENDP |
| 115 |
| 116 MY_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 |
| 145 MY_ENDP |
| 146 |
| 147 end |
OLD | NEW |