diff options
author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2021-12-27 00:00:00 +0000 |
---|---|---|
committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2022-03-18 15:35:13 +0500 |
commit | f19f813537c7aea1c20749c914e756b54a9c3cf5 (patch) | |
tree | 816ba62ca7c0fa19f2eb46d9e9d6f7dd7c3a744d /Asm/x86/7zCrcOpt.asm | |
parent | 98e06a519b63b81986abe76d28887f6984a7732b (diff) | |
download | 7zip-21.07.tar.gz 7zip-21.07.tar.bz2 7zip-21.07.zip |
'21.07'21.07
Diffstat (limited to 'Asm/x86/7zCrcOpt.asm')
-rw-r--r-- | Asm/x86/7zCrcOpt.asm | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/Asm/x86/7zCrcOpt.asm b/Asm/x86/7zCrcOpt.asm new file mode 100644 index 0000000..0fee206 --- /dev/null +++ b/Asm/x86/7zCrcOpt.asm | |||
@@ -0,0 +1,180 @@ | |||
1 | ; 7zCrcOpt.asm -- CRC32 calculation : optimized version | ||
2 | ; 2021-02-07 : Igor Pavlov : Public domain | ||
3 | |||
4 | include 7zAsm.asm | ||
5 | |||
6 | MY_ASM_START | ||
7 | |||
8 | rD equ r2 | ||
9 | rN equ r7 | ||
10 | rT equ r5 | ||
11 | |||
12 | ifdef x64 | ||
13 | num_VAR equ r8 | ||
14 | table_VAR equ r9 | ||
15 | else | ||
16 | if (IS_CDECL gt 0) | ||
17 | crc_OFFS equ (REG_SIZE * 5) | ||
18 | data_OFFS equ (REG_SIZE + crc_OFFS) | ||
19 | size_OFFS equ (REG_SIZE + data_OFFS) | ||
20 | else | ||
21 | size_OFFS equ (REG_SIZE * 5) | ||
22 | endif | ||
23 | table_OFFS equ (REG_SIZE + size_OFFS) | ||
24 | num_VAR equ [r4 + size_OFFS] | ||
25 | table_VAR equ [r4 + table_OFFS] | ||
26 | endif | ||
27 | |||
28 | SRCDAT equ rD + rN * 1 + 4 * | ||
29 | |||
30 | CRC macro op:req, dest:req, src:req, t:req | ||
31 | op dest, DWORD PTR [rT + src * 4 + 0400h * t] | ||
32 | endm | ||
33 | |||
34 | CRC_XOR macro dest:req, src:req, t:req | ||
35 | CRC xor, dest, src, t | ||
36 | endm | ||
37 | |||
38 | CRC_MOV macro dest:req, src:req, t:req | ||
39 | CRC mov, dest, src, t | ||
40 | endm | ||
41 | |||
42 | CRC1b macro | ||
43 | movzx x6, BYTE PTR [rD] | ||
44 | inc rD | ||
45 | movzx x3, x0_L | ||
46 | xor x6, x3 | ||
47 | shr x0, 8 | ||
48 | CRC xor, x0, r6, 0 | ||
49 | dec rN | ||
50 | endm | ||
51 | |||
52 | MY_PROLOG macro crc_end:req | ||
53 | |||
54 | ifdef x64 | ||
55 | if (IS_LINUX gt 0) | ||
56 | MY_PUSH_2_REGS | ||
57 | mov x0, REG_ABI_PARAM_0_x ; x0 = x7 | ||
58 | mov rT, REG_ABI_PARAM_3 ; r5 = r1 | ||
59 | mov rN, REG_ABI_PARAM_2 ; r7 = r2 | ||
60 | mov rD, REG_ABI_PARAM_1 ; r2 = r6 | ||
61 | else | ||
62 | MY_PUSH_4_REGS | ||
63 | mov x0, REG_ABI_PARAM_0_x ; x0 = x1 | ||
64 | mov rT, REG_ABI_PARAM_3 ; r5 = r9 | ||
65 | mov rN, REG_ABI_PARAM_2 ; r7 = r8 | ||
66 | ; mov rD, REG_ABI_PARAM_1 ; r2 = r2 | ||
67 | endif | ||
68 | else | ||
69 | MY_PUSH_4_REGS | ||
70 | if (IS_CDECL gt 0) | ||
71 | mov x0, [r4 + crc_OFFS] | ||
72 | mov rD, [r4 + data_OFFS] | ||
73 | else | ||
74 | mov x0, REG_ABI_PARAM_0_x | ||
75 | endif | ||
76 | mov rN, num_VAR | ||
77 | mov rT, table_VAR | ||
78 | endif | ||
79 | |||
80 | test rN, rN | ||
81 | jz crc_end | ||
82 | @@: | ||
83 | test rD, 7 | ||
84 | jz @F | ||
85 | CRC1b | ||
86 | jnz @B | ||
87 | @@: | ||
88 | cmp rN, 16 | ||
89 | jb crc_end | ||
90 | add rN, rD | ||
91 | mov num_VAR, rN | ||
92 | sub rN, 8 | ||
93 | and rN, NOT 7 | ||
94 | sub rD, rN | ||
95 | xor x0, [SRCDAT 0] | ||
96 | endm | ||
97 | |||
98 | MY_EPILOG macro crc_end:req | ||
99 | xor x0, [SRCDAT 0] | ||
100 | mov rD, rN | ||
101 | mov rN, num_VAR | ||
102 | sub rN, rD | ||
103 | crc_end: | ||
104 | test rN, rN | ||
105 | jz @F | ||
106 | CRC1b | ||
107 | jmp crc_end | ||
108 | @@: | ||
109 | if (IS_X64 gt 0) and (IS_LINUX gt 0) | ||
110 | MY_POP_2_REGS | ||
111 | else | ||
112 | MY_POP_4_REGS | ||
113 | endif | ||
114 | endm | ||
115 | |||
116 | MY_PROC CrcUpdateT8, 4 | ||
117 | MY_PROLOG crc_end_8 | ||
118 | mov x1, [SRCDAT 1] | ||
119 | align 16 | ||
120 | main_loop_8: | ||
121 | mov x6, [SRCDAT 2] | ||
122 | movzx x3, x1_L | ||
123 | CRC_XOR x6, r3, 3 | ||
124 | movzx x3, x1_H | ||
125 | CRC_XOR x6, r3, 2 | ||
126 | shr x1, 16 | ||
127 | movzx x3, x1_L | ||
128 | movzx x1, x1_H | ||
129 | CRC_XOR x6, r3, 1 | ||
130 | movzx x3, x0_L | ||
131 | CRC_XOR x6, r1, 0 | ||
132 | |||
133 | mov x1, [SRCDAT 3] | ||
134 | CRC_XOR x6, r3, 7 | ||
135 | movzx x3, x0_H | ||
136 | shr x0, 16 | ||
137 | CRC_XOR x6, r3, 6 | ||
138 | movzx x3, x0_L | ||
139 | CRC_XOR x6, r3, 5 | ||
140 | movzx x3, x0_H | ||
141 | CRC_MOV x0, r3, 4 | ||
142 | xor x0, x6 | ||
143 | add rD, 8 | ||
144 | jnz main_loop_8 | ||
145 | |||
146 | MY_EPILOG crc_end_8 | ||
147 | MY_ENDP | ||
148 | |||
149 | MY_PROC CrcUpdateT4, 4 | ||
150 | MY_PROLOG crc_end_4 | ||
151 | align 16 | ||
152 | main_loop_4: | ||
153 | movzx x1, x0_L | ||
154 | movzx x3, x0_H | ||
155 | shr x0, 16 | ||
156 | movzx x6, x0_H | ||
157 | and x0, 0FFh | ||
158 | CRC_MOV x1, r1, 3 | ||
159 | xor x1, [SRCDAT 1] | ||
160 | CRC_XOR x1, r3, 2 | ||
161 | CRC_XOR x1, r6, 0 | ||
162 | CRC_XOR x1, r0, 1 | ||
163 | |||
164 | movzx x0, x1_L | ||
165 | movzx x3, x1_H | ||
166 | shr x1, 16 | ||
167 | movzx x6, x1_H | ||
168 | and x1, 0FFh | ||
169 | CRC_MOV x0, r0, 3 | ||
170 | xor x0, [SRCDAT 2] | ||
171 | CRC_XOR x0, r3, 2 | ||
172 | CRC_XOR x0, r6, 0 | ||
173 | CRC_XOR x0, r1, 1 | ||
174 | add rD, 8 | ||
175 | jnz main_loop_4 | ||
176 | |||
177 | MY_EPILOG crc_end_4 | ||
178 | MY_ENDP | ||
179 | |||
180 | end | ||