1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky; XzCrc64Opt.asm -- CRC64 calculation : optimized version
2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky; 2011-06-28 : Igor Pavlov : Public domain
3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinclude 7zAsm.asm
5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_ASM_START
7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyifdef x64
9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    rD   equ  r9
11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    rN   equ  r10
12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    num_VAR     equ  r8
14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    table_VAR   equ  r9
15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    SRCDAT  equ  rN + rD
17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC_XOR macro dest:req, src:req, t:req
19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    xor     dest, QWORD PTR [r5 + src * 8 + 0800h * t]
20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm
21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC1b macro
23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x6, BYTE PTR [rD]
24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    inc     rD
25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x3, x0_L
26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    xor     x6, x3
27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    shr     r0, 8
28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC_XOR r0, r6, 0
29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    dec     rN
30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm
31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_PROLOG macro crc_end:req
33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    MY_PUSH_4_REGS
34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    
35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     r0, r1
36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     rN, num_VAR
37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     r5, table_VAR
38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     rD, r2
39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    test    rN, rN
40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jz      crc_end
41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  @@:
42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    test    rD, 3
43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jz      @F
44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC1b
45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jnz     @B
46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  @@:
47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    cmp     rN, 8
48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jb      crc_end
49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    add     rN, rD
50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     num_VAR, rN
51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    sub     rN, 4
52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    and     rN, NOT 3
53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    sub     rD, rN
54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     x1, [SRCDAT]
55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    xor     r0, r1
56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    add     rN, 4
57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm
58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_EPILOG macro crc_end:req
60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    sub     rN, 4
61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     x1, [SRCDAT]
62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    xor     r0, r1
63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     rD, rN
64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     rN, num_VAR
65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    sub     rN, rD
66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  crc_end:
67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    test    rN, rN
68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jz      @F
69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC1b
70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jmp     crc_end
71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  @@:
72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    MY_POP_4_REGS
73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm
74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_PROC XzCrc64UpdateT4, 4
76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    MY_PROLOG crc_end_4
77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    align 16
78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  main_loop_4:
79cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     x1, [SRCDAT]
80cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x2, x0_L
81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x3, x0_H
82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    shr     r0, 16
83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x6, x0_L
84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x7, x0_H
85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    shr     r0, 16
86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC_XOR r1, r2, 3
87cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC_XOR r0, r3, 2
88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC_XOR r1, r6, 1
89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC_XOR r0, r7, 0
90cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    xor     r0, r1
91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    add     rD, 4
93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jnz     main_loop_4
94cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    MY_EPILOG crc_end_4
96cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_ENDP
97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyelse
99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    rD   equ  r1
101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    rN   equ  r7
102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    crc_val     equ (REG_SIZE * 5)
104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    crc_table   equ (8 + crc_val)
105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    table_VAR   equ [r4 + crc_table]
106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    num_VAR     equ table_VAR
107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    SRCDAT  equ  rN + rD
110cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
111cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC macro op0:req, op1:req, dest0:req, dest1:req, src:req, t:req
112cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    op0     dest0, DWORD PTR [r5 + src * 8 + 0800h * t]
113cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    op1     dest1, DWORD PTR [r5 + src * 8 + 0800h * t + 4]
114cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm
115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC_XOR macro dest0:req, dest1:req, src:req, t:req
117cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC xor, xor, dest0, dest1, src, t
118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm
119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCRC1b macro
122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x6, BYTE PTR [rD]
123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    inc     rD
124cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x3, x0_L
125cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    xor     x6, x3
126cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    shrd    r0, r2, 8
127cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    shr     r2, 8
128cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC_XOR r0, r2, r6, 0
129cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    dec     rN
130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm
131cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_PROLOG macro crc_end:req
133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    MY_PUSH_4_REGS
134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    
135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     rN, r2
136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     x0, [r4 + crc_val]
138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     x2, [r4 + crc_val + 4]
139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     r5, table_VAR
140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    test    rN, rN
141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jz      crc_end
142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  @@:
143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    test    rD, 3
144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jz      @F
145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC1b
146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jnz     @B
147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  @@:
148cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    cmp     rN, 8
149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jb      crc_end
150cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    add     rN, rD
151cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
152cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     num_VAR, rN
153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    sub     rN, 4
155cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    and     rN, NOT 3
156cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    sub     rD, rN
157cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    xor     r0, [SRCDAT]
158cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    add     rN, 4
159cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm
160cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
161cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_EPILOG macro crc_end:req
162cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    sub     rN, 4
163cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    xor     r0, [SRCDAT]
164cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
165cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     rD, rN
166cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     rN, num_VAR
167cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    sub     rN, rD
168cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  crc_end:
169cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    test    rN, rN
170cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jz      @F
171cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC1b
172cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jmp     crc_end
173cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  @@:
174cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    MY_POP_4_REGS
175cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendm
176cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
177cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_PROC XzCrc64UpdateT4, 5
178cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    MY_PROLOG crc_end_4
179cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x6, x0_L
180cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    align 16
181cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  main_loop_4:
182cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     r3, [SRCDAT]
183cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    xor     r3, r2
184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC xor, mov, r3, r2, r6, 3
186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x6, x0_H
187cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    shr     r0, 16
188cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC_XOR r3, r2, r6, 2
189cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x6, x0_L
191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x0, x0_H
192cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC_XOR r3, r2, r6, 1
193cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    CRC_XOR r3, r2, r0, 0
194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    movzx   x6, x3_L
195cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    mov     r0, r3
196cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
197cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    add     rD, 4
198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    jnz     main_loop_4
199cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
200cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    MY_EPILOG crc_end_4
201cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyMY_ENDP
202cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
203cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyendif
204cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
205cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyend
206