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