1public _llvm_blake3_hash_many_avx512
2public llvm_blake3_hash_many_avx512
3public llvm_blake3_compress_in_place_avx512
4public _llvm_blake3_compress_in_place_avx512
5public llvm_blake3_compress_xof_avx512
6public _llvm_blake3_compress_xof_avx512
7
8_TEXT   SEGMENT ALIGN(16) 'CODE'
9
10ALIGN   16
11llvm_blake3_hash_many_avx512 PROC
12_llvm_blake3_hash_many_avx512 PROC
13        push    r15
14        push    r14
15        push    r13
16        push    r12
17        push    rdi
18        push    rsi
19        push    rbx
20        push    rbp
21        mov     rbp, rsp
22        sub     rsp, 304
23        and     rsp, 0FFFFFFFFFFFFFFC0H
24        vmovdqa xmmword ptr [rsp+90H], xmm6
25        vmovdqa xmmword ptr [rsp+0A0H], xmm7
26        vmovdqa xmmword ptr [rsp+0B0H], xmm8
27        vmovdqa xmmword ptr [rsp+0C0H], xmm9
28        vmovdqa xmmword ptr [rsp+0D0H], xmm10
29        vmovdqa xmmword ptr [rsp+0E0H], xmm11
30        vmovdqa xmmword ptr [rsp+0F0H], xmm12
31        vmovdqa xmmword ptr [rsp+100H], xmm13
32        vmovdqa xmmword ptr [rsp+110H], xmm14
33        vmovdqa xmmword ptr [rsp+120H], xmm15
34        mov     rdi, rcx
35        mov     rsi, rdx
36        mov     rdx, r8
37        mov     rcx, r9
38        mov     r8, qword ptr [rbp+68H]
39        movzx   r9, byte ptr [rbp+70H]
40        neg     r9
41        kmovw   k1, r9d
42        vmovd   xmm0, r8d
43        vpbroadcastd ymm0, xmm0
44        shr     r8, 32
45        vmovd   xmm1, r8d
46        vpbroadcastd ymm1, xmm1
47        vmovdqa ymm4, ymm1
48        vmovdqa ymm5, ymm1
49        vpaddd  ymm2, ymm0, ymmword ptr [ADD0]
50        vpaddd  ymm3, ymm0, ymmword ptr [ADD0+32]
51        vpcmpud k2, ymm2, ymm0, 1
52        vpcmpud k3, ymm3, ymm0, 1
53        ; XXX: ml64.exe does not currently understand the syntax. We use a workaround.
54        vpbroadcastd ymm6, dword ptr [ADD1]
55        vpaddd  ymm4 {k2}, ymm4, ymm6
56        vpaddd  ymm5 {k3}, ymm5, ymm6
57        ; vpaddd  ymm4 {k2}, ymm4, dword ptr [ADD1] {1to8}
58        ; vpaddd  ymm5 {k3}, ymm5, dword ptr [ADD1] {1to8}
59        knotw   k2, k1
60        vmovdqa32 ymm2 {k2}, ymm0
61        vmovdqa32 ymm3 {k2}, ymm0
62        vmovdqa32 ymm4 {k2}, ymm1
63        vmovdqa32 ymm5 {k2}, ymm1
64        vmovdqa ymmword ptr [rsp], ymm2
65        vmovdqa ymmword ptr [rsp+20H], ymm3
66        vmovdqa ymmword ptr [rsp+40H], ymm4
67        vmovdqa ymmword ptr [rsp+60H], ymm5
68        shl     rdx, 6
69        mov     qword ptr [rsp+80H], rdx
70        cmp     rsi, 16
71        jc      final15blocks
72outerloop16:
73        vpbroadcastd zmm0, dword ptr [rcx]
74        vpbroadcastd zmm1, dword ptr [rcx+1H*4H]
75        vpbroadcastd zmm2, dword ptr [rcx+2H*4H]
76        vpbroadcastd zmm3, dword ptr [rcx+3H*4H]
77        vpbroadcastd zmm4, dword ptr [rcx+4H*4H]
78        vpbroadcastd zmm5, dword ptr [rcx+5H*4H]
79        vpbroadcastd zmm6, dword ptr [rcx+6H*4H]
80        vpbroadcastd zmm7, dword ptr [rcx+7H*4H]
81        movzx   eax, byte ptr [rbp+78H]
82        movzx   ebx, byte ptr [rbp+80H]
83        or      eax, ebx
84        xor     edx, edx
85ALIGN   16
86innerloop16:
87        movzx   ebx, byte ptr [rbp+88H]
88        or      ebx, eax
89        add     rdx, 64
90        cmp     rdx, qword ptr [rsp+80H]
91        cmove   eax, ebx
92        mov     dword ptr [rsp+88H], eax
93        mov     r8, qword ptr [rdi]
94        mov     r9, qword ptr [rdi+8H]
95        mov     r10, qword ptr [rdi+10H]
96        mov     r11, qword ptr [rdi+18H]
97        mov     r12, qword ptr [rdi+40H]
98        mov     r13, qword ptr [rdi+48H]
99        mov     r14, qword ptr [rdi+50H]
100        mov     r15, qword ptr [rdi+58H]
101        vmovdqu32 ymm16, ymmword ptr [rdx+r8-2H*20H]
102        vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-2H*20H], 01H
103        vmovdqu32 ymm17, ymmword ptr [rdx+r9-2H*20H]
104        vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-2H*20H], 01H
105        vpunpcklqdq zmm8, zmm16, zmm17
106        vpunpckhqdq zmm9, zmm16, zmm17
107        vmovdqu32 ymm18, ymmword ptr [rdx+r10-2H*20H]
108        vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-2H*20H], 01H
109        vmovdqu32 ymm19, ymmword ptr [rdx+r11-2H*20H]
110        vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-2H*20H], 01H
111        vpunpcklqdq zmm10, zmm18, zmm19
112        vpunpckhqdq zmm11, zmm18, zmm19
113        mov     r8, qword ptr [rdi+20H]
114        mov     r9, qword ptr [rdi+28H]
115        mov     r10, qword ptr [rdi+30H]
116        mov     r11, qword ptr [rdi+38H]
117        mov     r12, qword ptr [rdi+60H]
118        mov     r13, qword ptr [rdi+68H]
119        mov     r14, qword ptr [rdi+70H]
120        mov     r15, qword ptr [rdi+78H]
121        vmovdqu32 ymm16, ymmword ptr [rdx+r8-2H*20H]
122        vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-2H*20H], 01H
123        vmovdqu32 ymm17, ymmword ptr [rdx+r9-2H*20H]
124        vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-2H*20H], 01H
125        vpunpcklqdq zmm12, zmm16, zmm17
126        vpunpckhqdq zmm13, zmm16, zmm17
127        vmovdqu32 ymm18, ymmword ptr [rdx+r10-2H*20H]
128        vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-2H*20H], 01H
129        vmovdqu32 ymm19, ymmword ptr [rdx+r11-2H*20H]
130        vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-2H*20H], 01H
131        vpunpcklqdq zmm14, zmm18, zmm19
132        vpunpckhqdq zmm15, zmm18, zmm19
133        vmovdqa32 zmm27, zmmword ptr [INDEX0]
134        vmovdqa32 zmm31, zmmword ptr [INDEX1]
135        vshufps zmm16, zmm8, zmm10, 136
136        vshufps zmm17, zmm12, zmm14, 136
137        vmovdqa32 zmm20, zmm16
138        vpermt2d zmm16, zmm27, zmm17
139        vpermt2d zmm20, zmm31, zmm17
140        vshufps zmm17, zmm8, zmm10, 221
141        vshufps zmm30, zmm12, zmm14, 221
142        vmovdqa32 zmm21, zmm17
143        vpermt2d zmm17, zmm27, zmm30
144        vpermt2d zmm21, zmm31, zmm30
145        vshufps zmm18, zmm9, zmm11, 136
146        vshufps zmm8, zmm13, zmm15, 136
147        vmovdqa32 zmm22, zmm18
148        vpermt2d zmm18, zmm27, zmm8
149        vpermt2d zmm22, zmm31, zmm8
150        vshufps zmm19, zmm9, zmm11, 221
151        vshufps zmm8, zmm13, zmm15, 221
152        vmovdqa32 zmm23, zmm19
153        vpermt2d zmm19, zmm27, zmm8
154        vpermt2d zmm23, zmm31, zmm8
155        mov     r8, qword ptr [rdi]
156        mov     r9, qword ptr [rdi+8H]
157        mov     r10, qword ptr [rdi+10H]
158        mov     r11, qword ptr [rdi+18H]
159        mov     r12, qword ptr [rdi+40H]
160        mov     r13, qword ptr [rdi+48H]
161        mov     r14, qword ptr [rdi+50H]
162        mov     r15, qword ptr [rdi+58H]
163        vmovdqu32 ymm24, ymmword ptr [r8+rdx-1H*20H]
164        vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-1H*20H], 01H
165        vmovdqu32 ymm25, ymmword ptr [r9+rdx-1H*20H]
166        vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-1H*20H], 01H
167        vpunpcklqdq zmm8, zmm24, zmm25
168        vpunpckhqdq zmm9, zmm24, zmm25
169        vmovdqu32 ymm24, ymmword ptr [r10+rdx-1H*20H]
170        vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-1H*20H], 01H
171        vmovdqu32 ymm25, ymmword ptr [r11+rdx-1H*20H]
172        vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-1H*20H], 01H
173        vpunpcklqdq zmm10, zmm24, zmm25
174        vpunpckhqdq zmm11, zmm24, zmm25
175        prefetcht0 byte ptr [r8+rdx+80H]
176        prefetcht0 byte ptr [r12+rdx+80H]
177        prefetcht0 byte ptr [r9+rdx+80H]
178        prefetcht0 byte ptr [r13+rdx+80H]
179        prefetcht0 byte ptr [r10+rdx+80H]
180        prefetcht0 byte ptr [r14+rdx+80H]
181        prefetcht0 byte ptr [r11+rdx+80H]
182        prefetcht0 byte ptr [r15+rdx+80H]
183        mov     r8, qword ptr [rdi+20H]
184        mov     r9, qword ptr [rdi+28H]
185        mov     r10, qword ptr [rdi+30H]
186        mov     r11, qword ptr [rdi+38H]
187        mov     r12, qword ptr [rdi+60H]
188        mov     r13, qword ptr [rdi+68H]
189        mov     r14, qword ptr [rdi+70H]
190        mov     r15, qword ptr [rdi+78H]
191        vmovdqu32 ymm24, ymmword ptr [r8+rdx-1H*20H]
192        vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-1H*20H], 01H
193        vmovdqu32 ymm25, ymmword ptr [r9+rdx-1H*20H]
194        vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-1H*20H], 01H
195        vpunpcklqdq zmm12, zmm24, zmm25
196        vpunpckhqdq zmm13, zmm24, zmm25
197        vmovdqu32 ymm24, ymmword ptr [r10+rdx-1H*20H]
198        vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-1H*20H], 01H
199        vmovdqu32 ymm25, ymmword ptr [r11+rdx-1H*20H]
200        vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-1H*20H], 01H
201        vpunpcklqdq zmm14, zmm24, zmm25
202        vpunpckhqdq zmm15, zmm24, zmm25
203        prefetcht0 byte  ptr [r8+rdx+80H]
204        prefetcht0 byte ptr [r12+rdx+80H]
205        prefetcht0 byte ptr [r9+rdx+80H]
206        prefetcht0 byte ptr [r13+rdx+80H]
207        prefetcht0 byte ptr [r10+rdx+80H]
208        prefetcht0 byte ptr [r14+rdx+80H]
209        prefetcht0 byte ptr [r11+rdx+80H]
210        prefetcht0 byte ptr [r15+rdx+80H]
211        vshufps zmm24, zmm8, zmm10, 136
212        vshufps zmm30, zmm12, zmm14, 136
213        vmovdqa32 zmm28, zmm24
214        vpermt2d zmm24, zmm27, zmm30
215        vpermt2d zmm28, zmm31, zmm30
216        vshufps zmm25, zmm8, zmm10, 221
217        vshufps zmm30, zmm12, zmm14, 221
218        vmovdqa32 zmm29, zmm25
219        vpermt2d zmm25, zmm27, zmm30
220        vpermt2d zmm29, zmm31, zmm30
221        vshufps zmm26, zmm9, zmm11, 136
222        vshufps zmm8, zmm13, zmm15, 136
223        vmovdqa32 zmm30, zmm26
224        vpermt2d zmm26, zmm27, zmm8
225        vpermt2d zmm30, zmm31, zmm8
226        vshufps zmm8, zmm9, zmm11, 221
227        vshufps zmm10, zmm13, zmm15, 221
228        vpermi2d zmm27, zmm8, zmm10
229        vpermi2d zmm31, zmm8, zmm10
230        vpbroadcastd zmm8, dword ptr [BLAKE3_IV_0]
231        vpbroadcastd zmm9, dword ptr [BLAKE3_IV_1]
232        vpbroadcastd zmm10, dword ptr [BLAKE3_IV_2]
233        vpbroadcastd zmm11, dword ptr [BLAKE3_IV_3]
234        vmovdqa32 zmm12, zmmword ptr [rsp]
235        vmovdqa32 zmm13, zmmword ptr [rsp+1H*40H]
236        vpbroadcastd zmm14, dword ptr [BLAKE3_BLOCK_LEN]
237        vpbroadcastd zmm15, dword ptr [rsp+22H*4H]
238        vpaddd  zmm0, zmm0, zmm16
239        vpaddd  zmm1, zmm1, zmm18
240        vpaddd  zmm2, zmm2, zmm20
241        vpaddd  zmm3, zmm3, zmm22
242        vpaddd  zmm0, zmm0, zmm4
243        vpaddd  zmm1, zmm1, zmm5
244        vpaddd  zmm2, zmm2, zmm6
245        vpaddd  zmm3, zmm3, zmm7
246        vpxord  zmm12, zmm12, zmm0
247        vpxord  zmm13, zmm13, zmm1
248        vpxord  zmm14, zmm14, zmm2
249        vpxord  zmm15, zmm15, zmm3
250        vprord  zmm12, zmm12, 16
251        vprord  zmm13, zmm13, 16
252        vprord  zmm14, zmm14, 16
253        vprord  zmm15, zmm15, 16
254        vpaddd  zmm8, zmm8, zmm12
255        vpaddd  zmm9, zmm9, zmm13
256        vpaddd  zmm10, zmm10, zmm14
257        vpaddd  zmm11, zmm11, zmm15
258        vpxord  zmm4, zmm4, zmm8
259        vpxord  zmm5, zmm5, zmm9
260        vpxord  zmm6, zmm6, zmm10
261        vpxord  zmm7, zmm7, zmm11
262        vprord  zmm4, zmm4, 12
263        vprord  zmm5, zmm5, 12
264        vprord  zmm6, zmm6, 12
265        vprord  zmm7, zmm7, 12
266        vpaddd  zmm0, zmm0, zmm17
267        vpaddd  zmm1, zmm1, zmm19
268        vpaddd  zmm2, zmm2, zmm21
269        vpaddd  zmm3, zmm3, zmm23
270        vpaddd  zmm0, zmm0, zmm4
271        vpaddd  zmm1, zmm1, zmm5
272        vpaddd  zmm2, zmm2, zmm6
273        vpaddd  zmm3, zmm3, zmm7
274        vpxord  zmm12, zmm12, zmm0
275        vpxord  zmm13, zmm13, zmm1
276        vpxord  zmm14, zmm14, zmm2
277        vpxord  zmm15, zmm15, zmm3
278        vprord  zmm12, zmm12, 8
279        vprord  zmm13, zmm13, 8
280        vprord  zmm14, zmm14, 8
281        vprord  zmm15, zmm15, 8
282        vpaddd  zmm8, zmm8, zmm12
283        vpaddd  zmm9, zmm9, zmm13
284        vpaddd  zmm10, zmm10, zmm14
285        vpaddd  zmm11, zmm11, zmm15
286        vpxord  zmm4, zmm4, zmm8
287        vpxord  zmm5, zmm5, zmm9
288        vpxord  zmm6, zmm6, zmm10
289        vpxord  zmm7, zmm7, zmm11
290        vprord  zmm4, zmm4, 7
291        vprord  zmm5, zmm5, 7
292        vprord  zmm6, zmm6, 7
293        vprord  zmm7, zmm7, 7
294        vpaddd  zmm0, zmm0, zmm24
295        vpaddd  zmm1, zmm1, zmm26
296        vpaddd  zmm2, zmm2, zmm28
297        vpaddd  zmm3, zmm3, zmm30
298        vpaddd  zmm0, zmm0, zmm5
299        vpaddd  zmm1, zmm1, zmm6
300        vpaddd  zmm2, zmm2, zmm7
301        vpaddd  zmm3, zmm3, zmm4
302        vpxord  zmm15, zmm15, zmm0
303        vpxord  zmm12, zmm12, zmm1
304        vpxord  zmm13, zmm13, zmm2
305        vpxord  zmm14, zmm14, zmm3
306        vprord  zmm15, zmm15, 16
307        vprord  zmm12, zmm12, 16
308        vprord  zmm13, zmm13, 16
309        vprord  zmm14, zmm14, 16
310        vpaddd  zmm10, zmm10, zmm15
311        vpaddd  zmm11, zmm11, zmm12
312        vpaddd  zmm8, zmm8, zmm13
313        vpaddd  zmm9, zmm9, zmm14
314        vpxord  zmm5, zmm5, zmm10
315        vpxord  zmm6, zmm6, zmm11
316        vpxord  zmm7, zmm7, zmm8
317        vpxord  zmm4, zmm4, zmm9
318        vprord  zmm5, zmm5, 12
319        vprord  zmm6, zmm6, 12
320        vprord  zmm7, zmm7, 12
321        vprord  zmm4, zmm4, 12
322        vpaddd  zmm0, zmm0, zmm25
323        vpaddd  zmm1, zmm1, zmm27
324        vpaddd  zmm2, zmm2, zmm29
325        vpaddd  zmm3, zmm3, zmm31
326        vpaddd  zmm0, zmm0, zmm5
327        vpaddd  zmm1, zmm1, zmm6
328        vpaddd  zmm2, zmm2, zmm7
329        vpaddd  zmm3, zmm3, zmm4
330        vpxord  zmm15, zmm15, zmm0
331        vpxord  zmm12, zmm12, zmm1
332        vpxord  zmm13, zmm13, zmm2
333        vpxord  zmm14, zmm14, zmm3
334        vprord  zmm15, zmm15, 8
335        vprord  zmm12, zmm12, 8
336        vprord  zmm13, zmm13, 8
337        vprord  zmm14, zmm14, 8
338        vpaddd  zmm10, zmm10, zmm15
339        vpaddd  zmm11, zmm11, zmm12
340        vpaddd  zmm8, zmm8, zmm13
341        vpaddd  zmm9, zmm9, zmm14
342        vpxord  zmm5, zmm5, zmm10
343        vpxord  zmm6, zmm6, zmm11
344        vpxord  zmm7, zmm7, zmm8
345        vpxord  zmm4, zmm4, zmm9
346        vprord  zmm5, zmm5, 7
347        vprord  zmm6, zmm6, 7
348        vprord  zmm7, zmm7, 7
349        vprord  zmm4, zmm4, 7
350        vpaddd  zmm0, zmm0, zmm18
351        vpaddd  zmm1, zmm1, zmm19
352        vpaddd  zmm2, zmm2, zmm23
353        vpaddd  zmm3, zmm3, zmm20
354        vpaddd  zmm0, zmm0, zmm4
355        vpaddd  zmm1, zmm1, zmm5
356        vpaddd  zmm2, zmm2, zmm6
357        vpaddd  zmm3, zmm3, zmm7
358        vpxord  zmm12, zmm12, zmm0
359        vpxord  zmm13, zmm13, zmm1
360        vpxord  zmm14, zmm14, zmm2
361        vpxord  zmm15, zmm15, zmm3
362        vprord  zmm12, zmm12, 16
363        vprord  zmm13, zmm13, 16
364        vprord  zmm14, zmm14, 16
365        vprord  zmm15, zmm15, 16
366        vpaddd  zmm8, zmm8, zmm12
367        vpaddd  zmm9, zmm9, zmm13
368        vpaddd  zmm10, zmm10, zmm14
369        vpaddd  zmm11, zmm11, zmm15
370        vpxord  zmm4, zmm4, zmm8
371        vpxord  zmm5, zmm5, zmm9
372        vpxord  zmm6, zmm6, zmm10
373        vpxord  zmm7, zmm7, zmm11
374        vprord  zmm4, zmm4, 12
375        vprord  zmm5, zmm5, 12
376        vprord  zmm6, zmm6, 12
377        vprord  zmm7, zmm7, 12
378        vpaddd  zmm0, zmm0, zmm22
379        vpaddd  zmm1, zmm1, zmm26
380        vpaddd  zmm2, zmm2, zmm16
381        vpaddd  zmm3, zmm3, zmm29
382        vpaddd  zmm0, zmm0, zmm4
383        vpaddd  zmm1, zmm1, zmm5
384        vpaddd  zmm2, zmm2, zmm6
385        vpaddd  zmm3, zmm3, zmm7
386        vpxord  zmm12, zmm12, zmm0
387        vpxord  zmm13, zmm13, zmm1
388        vpxord  zmm14, zmm14, zmm2
389        vpxord  zmm15, zmm15, zmm3
390        vprord  zmm12, zmm12, 8
391        vprord  zmm13, zmm13, 8
392        vprord  zmm14, zmm14, 8
393        vprord  zmm15, zmm15, 8
394        vpaddd  zmm8, zmm8, zmm12
395        vpaddd  zmm9, zmm9, zmm13
396        vpaddd  zmm10, zmm10, zmm14
397        vpaddd  zmm11, zmm11, zmm15
398        vpxord  zmm4, zmm4, zmm8
399        vpxord  zmm5, zmm5, zmm9
400        vpxord  zmm6, zmm6, zmm10
401        vpxord  zmm7, zmm7, zmm11
402        vprord  zmm4, zmm4, 7
403        vprord  zmm5, zmm5, 7
404        vprord  zmm6, zmm6, 7
405        vprord  zmm7, zmm7, 7
406        vpaddd  zmm0, zmm0, zmm17
407        vpaddd  zmm1, zmm1, zmm28
408        vpaddd  zmm2, zmm2, zmm25
409        vpaddd  zmm3, zmm3, zmm31
410        vpaddd  zmm0, zmm0, zmm5
411        vpaddd  zmm1, zmm1, zmm6
412        vpaddd  zmm2, zmm2, zmm7
413        vpaddd  zmm3, zmm3, zmm4
414        vpxord  zmm15, zmm15, zmm0
415        vpxord  zmm12, zmm12, zmm1
416        vpxord  zmm13, zmm13, zmm2
417        vpxord  zmm14, zmm14, zmm3
418        vprord  zmm15, zmm15, 16
419        vprord  zmm12, zmm12, 16
420        vprord  zmm13, zmm13, 16
421        vprord  zmm14, zmm14, 16
422        vpaddd  zmm10, zmm10, zmm15
423        vpaddd  zmm11, zmm11, zmm12
424        vpaddd  zmm8, zmm8, zmm13
425        vpaddd  zmm9, zmm9, zmm14
426        vpxord  zmm5, zmm5, zmm10
427        vpxord  zmm6, zmm6, zmm11
428        vpxord  zmm7, zmm7, zmm8
429        vpxord  zmm4, zmm4, zmm9
430        vprord  zmm5, zmm5, 12
431        vprord  zmm6, zmm6, 12
432        vprord  zmm7, zmm7, 12
433        vprord  zmm4, zmm4, 12
434        vpaddd  zmm0, zmm0, zmm27
435        vpaddd  zmm1, zmm1, zmm21
436        vpaddd  zmm2, zmm2, zmm30
437        vpaddd  zmm3, zmm3, zmm24
438        vpaddd  zmm0, zmm0, zmm5
439        vpaddd  zmm1, zmm1, zmm6
440        vpaddd  zmm2, zmm2, zmm7
441        vpaddd  zmm3, zmm3, zmm4
442        vpxord  zmm15, zmm15, zmm0
443        vpxord  zmm12, zmm12, zmm1
444        vpxord  zmm13, zmm13, zmm2
445        vpxord  zmm14, zmm14, zmm3
446        vprord  zmm15, zmm15, 8
447        vprord  zmm12, zmm12, 8
448        vprord  zmm13, zmm13, 8
449        vprord  zmm14, zmm14, 8
450        vpaddd  zmm10, zmm10, zmm15
451        vpaddd  zmm11, zmm11, zmm12
452        vpaddd  zmm8, zmm8, zmm13
453        vpaddd  zmm9, zmm9, zmm14
454        vpxord  zmm5, zmm5, zmm10
455        vpxord  zmm6, zmm6, zmm11
456        vpxord  zmm7, zmm7, zmm8
457        vpxord  zmm4, zmm4, zmm9
458        vprord  zmm5, zmm5, 7
459        vprord  zmm6, zmm6, 7
460        vprord  zmm7, zmm7, 7
461        vprord  zmm4, zmm4, 7
462        vpaddd  zmm0, zmm0, zmm19
463        vpaddd  zmm1, zmm1, zmm26
464        vpaddd  zmm2, zmm2, zmm29
465        vpaddd  zmm3, zmm3, zmm23
466        vpaddd  zmm0, zmm0, zmm4
467        vpaddd  zmm1, zmm1, zmm5
468        vpaddd  zmm2, zmm2, zmm6
469        vpaddd  zmm3, zmm3, zmm7
470        vpxord  zmm12, zmm12, zmm0
471        vpxord  zmm13, zmm13, zmm1
472        vpxord  zmm14, zmm14, zmm2
473        vpxord  zmm15, zmm15, zmm3
474        vprord  zmm12, zmm12, 16
475        vprord  zmm13, zmm13, 16
476        vprord  zmm14, zmm14, 16
477        vprord  zmm15, zmm15, 16
478        vpaddd  zmm8, zmm8, zmm12
479        vpaddd  zmm9, zmm9, zmm13
480        vpaddd  zmm10, zmm10, zmm14
481        vpaddd  zmm11, zmm11, zmm15
482        vpxord  zmm4, zmm4, zmm8
483        vpxord  zmm5, zmm5, zmm9
484        vpxord  zmm6, zmm6, zmm10
485        vpxord  zmm7, zmm7, zmm11
486        vprord  zmm4, zmm4, 12
487        vprord  zmm5, zmm5, 12
488        vprord  zmm6, zmm6, 12
489        vprord  zmm7, zmm7, 12
490        vpaddd  zmm0, zmm0, zmm20
491        vpaddd  zmm1, zmm1, zmm28
492        vpaddd  zmm2, zmm2, zmm18
493        vpaddd  zmm3, zmm3, zmm30
494        vpaddd  zmm0, zmm0, zmm4
495        vpaddd  zmm1, zmm1, zmm5
496        vpaddd  zmm2, zmm2, zmm6
497        vpaddd  zmm3, zmm3, zmm7
498        vpxord  zmm12, zmm12, zmm0
499        vpxord  zmm13, zmm13, zmm1
500        vpxord  zmm14, zmm14, zmm2
501        vpxord  zmm15, zmm15, zmm3
502        vprord  zmm12, zmm12, 8
503        vprord  zmm13, zmm13, 8
504        vprord  zmm14, zmm14, 8
505        vprord  zmm15, zmm15, 8
506        vpaddd  zmm8, zmm8, zmm12
507        vpaddd  zmm9, zmm9, zmm13
508        vpaddd  zmm10, zmm10, zmm14
509        vpaddd  zmm11, zmm11, zmm15
510        vpxord  zmm4, zmm4, zmm8
511        vpxord  zmm5, zmm5, zmm9
512        vpxord  zmm6, zmm6, zmm10
513        vpxord  zmm7, zmm7, zmm11
514        vprord  zmm4, zmm4, 7
515        vprord  zmm5, zmm5, 7
516        vprord  zmm6, zmm6, 7
517        vprord  zmm7, zmm7, 7
518        vpaddd  zmm0, zmm0, zmm22
519        vpaddd  zmm1, zmm1, zmm25
520        vpaddd  zmm2, zmm2, zmm27
521        vpaddd  zmm3, zmm3, zmm24
522        vpaddd  zmm0, zmm0, zmm5
523        vpaddd  zmm1, zmm1, zmm6
524        vpaddd  zmm2, zmm2, zmm7
525        vpaddd  zmm3, zmm3, zmm4
526        vpxord  zmm15, zmm15, zmm0
527        vpxord  zmm12, zmm12, zmm1
528        vpxord  zmm13, zmm13, zmm2
529        vpxord  zmm14, zmm14, zmm3
530        vprord  zmm15, zmm15, 16
531        vprord  zmm12, zmm12, 16
532        vprord  zmm13, zmm13, 16
533        vprord  zmm14, zmm14, 16
534        vpaddd  zmm10, zmm10, zmm15
535        vpaddd  zmm11, zmm11, zmm12
536        vpaddd  zmm8, zmm8, zmm13
537        vpaddd  zmm9, zmm9, zmm14
538        vpxord  zmm5, zmm5, zmm10
539        vpxord  zmm6, zmm6, zmm11
540        vpxord  zmm7, zmm7, zmm8
541        vpxord  zmm4, zmm4, zmm9
542        vprord  zmm5, zmm5, 12
543        vprord  zmm6, zmm6, 12
544        vprord  zmm7, zmm7, 12
545        vprord  zmm4, zmm4, 12
546        vpaddd  zmm0, zmm0, zmm21
547        vpaddd  zmm1, zmm1, zmm16
548        vpaddd  zmm2, zmm2, zmm31
549        vpaddd  zmm3, zmm3, zmm17
550        vpaddd  zmm0, zmm0, zmm5
551        vpaddd  zmm1, zmm1, zmm6
552        vpaddd  zmm2, zmm2, zmm7
553        vpaddd  zmm3, zmm3, zmm4
554        vpxord  zmm15, zmm15, zmm0
555        vpxord  zmm12, zmm12, zmm1
556        vpxord  zmm13, zmm13, zmm2
557        vpxord  zmm14, zmm14, zmm3
558        vprord  zmm15, zmm15, 8
559        vprord  zmm12, zmm12, 8
560        vprord  zmm13, zmm13, 8
561        vprord  zmm14, zmm14, 8
562        vpaddd  zmm10, zmm10, zmm15
563        vpaddd  zmm11, zmm11, zmm12
564        vpaddd  zmm8, zmm8, zmm13
565        vpaddd  zmm9, zmm9, zmm14
566        vpxord  zmm5, zmm5, zmm10
567        vpxord  zmm6, zmm6, zmm11
568        vpxord  zmm7, zmm7, zmm8
569        vpxord  zmm4, zmm4, zmm9
570        vprord  zmm5, zmm5, 7
571        vprord  zmm6, zmm6, 7
572        vprord  zmm7, zmm7, 7
573        vprord  zmm4, zmm4, 7
574        vpaddd  zmm0, zmm0, zmm26
575        vpaddd  zmm1, zmm1, zmm28
576        vpaddd  zmm2, zmm2, zmm30
577        vpaddd  zmm3, zmm3, zmm29
578        vpaddd  zmm0, zmm0, zmm4
579        vpaddd  zmm1, zmm1, zmm5
580        vpaddd  zmm2, zmm2, zmm6
581        vpaddd  zmm3, zmm3, zmm7
582        vpxord  zmm12, zmm12, zmm0
583        vpxord  zmm13, zmm13, zmm1
584        vpxord  zmm14, zmm14, zmm2
585        vpxord  zmm15, zmm15, zmm3
586        vprord  zmm12, zmm12, 16
587        vprord  zmm13, zmm13, 16
588        vprord  zmm14, zmm14, 16
589        vprord  zmm15, zmm15, 16
590        vpaddd  zmm8, zmm8, zmm12
591        vpaddd  zmm9, zmm9, zmm13
592        vpaddd  zmm10, zmm10, zmm14
593        vpaddd  zmm11, zmm11, zmm15
594        vpxord  zmm4, zmm4, zmm8
595        vpxord  zmm5, zmm5, zmm9
596        vpxord  zmm6, zmm6, zmm10
597        vpxord  zmm7, zmm7, zmm11
598        vprord  zmm4, zmm4, 12
599        vprord  zmm5, zmm5, 12
600        vprord  zmm6, zmm6, 12
601        vprord  zmm7, zmm7, 12
602        vpaddd  zmm0, zmm0, zmm23
603        vpaddd  zmm1, zmm1, zmm25
604        vpaddd  zmm2, zmm2, zmm19
605        vpaddd  zmm3, zmm3, zmm31
606        vpaddd  zmm0, zmm0, zmm4
607        vpaddd  zmm1, zmm1, zmm5
608        vpaddd  zmm2, zmm2, zmm6
609        vpaddd  zmm3, zmm3, zmm7
610        vpxord  zmm12, zmm12, zmm0
611        vpxord  zmm13, zmm13, zmm1
612        vpxord  zmm14, zmm14, zmm2
613        vpxord  zmm15, zmm15, zmm3
614        vprord  zmm12, zmm12, 8
615        vprord  zmm13, zmm13, 8
616        vprord  zmm14, zmm14, 8
617        vprord  zmm15, zmm15, 8
618        vpaddd  zmm8, zmm8, zmm12
619        vpaddd  zmm9, zmm9, zmm13
620        vpaddd  zmm10, zmm10, zmm14
621        vpaddd  zmm11, zmm11, zmm15
622        vpxord  zmm4, zmm4, zmm8
623        vpxord  zmm5, zmm5, zmm9
624        vpxord  zmm6, zmm6, zmm10
625        vpxord  zmm7, zmm7, zmm11
626        vprord  zmm4, zmm4, 7
627        vprord  zmm5, zmm5, 7
628        vprord  zmm6, zmm6, 7
629        vprord  zmm7, zmm7, 7
630        vpaddd  zmm0, zmm0, zmm20
631        vpaddd  zmm1, zmm1, zmm27
632        vpaddd  zmm2, zmm2, zmm21
633        vpaddd  zmm3, zmm3, zmm17
634        vpaddd  zmm0, zmm0, zmm5
635        vpaddd  zmm1, zmm1, zmm6
636        vpaddd  zmm2, zmm2, zmm7
637        vpaddd  zmm3, zmm3, zmm4
638        vpxord  zmm15, zmm15, zmm0
639        vpxord  zmm12, zmm12, zmm1
640        vpxord  zmm13, zmm13, zmm2
641        vpxord  zmm14, zmm14, zmm3
642        vprord  zmm15, zmm15, 16
643        vprord  zmm12, zmm12, 16
644        vprord  zmm13, zmm13, 16
645        vprord  zmm14, zmm14, 16
646        vpaddd  zmm10, zmm10, zmm15
647        vpaddd  zmm11, zmm11, zmm12
648        vpaddd  zmm8, zmm8, zmm13
649        vpaddd  zmm9, zmm9, zmm14
650        vpxord  zmm5, zmm5, zmm10
651        vpxord  zmm6, zmm6, zmm11
652        vpxord  zmm7, zmm7, zmm8
653        vpxord  zmm4, zmm4, zmm9
654        vprord  zmm5, zmm5, 12
655        vprord  zmm6, zmm6, 12
656        vprord  zmm7, zmm7, 12
657        vprord  zmm4, zmm4, 12
658        vpaddd  zmm0, zmm0, zmm16
659        vpaddd  zmm1, zmm1, zmm18
660        vpaddd  zmm2, zmm2, zmm24
661        vpaddd  zmm3, zmm3, zmm22
662        vpaddd  zmm0, zmm0, zmm5
663        vpaddd  zmm1, zmm1, zmm6
664        vpaddd  zmm2, zmm2, zmm7
665        vpaddd  zmm3, zmm3, zmm4
666        vpxord  zmm15, zmm15, zmm0
667        vpxord  zmm12, zmm12, zmm1
668        vpxord  zmm13, zmm13, zmm2
669        vpxord  zmm14, zmm14, zmm3
670        vprord  zmm15, zmm15, 8
671        vprord  zmm12, zmm12, 8
672        vprord  zmm13, zmm13, 8
673        vprord  zmm14, zmm14, 8
674        vpaddd  zmm10, zmm10, zmm15
675        vpaddd  zmm11, zmm11, zmm12
676        vpaddd  zmm8, zmm8, zmm13
677        vpaddd  zmm9, zmm9, zmm14
678        vpxord  zmm5, zmm5, zmm10
679        vpxord  zmm6, zmm6, zmm11
680        vpxord  zmm7, zmm7, zmm8
681        vpxord  zmm4, zmm4, zmm9
682        vprord  zmm5, zmm5, 7
683        vprord  zmm6, zmm6, 7
684        vprord  zmm7, zmm7, 7
685        vprord  zmm4, zmm4, 7
686        vpaddd  zmm0, zmm0, zmm28
687        vpaddd  zmm1, zmm1, zmm25
688        vpaddd  zmm2, zmm2, zmm31
689        vpaddd  zmm3, zmm3, zmm30
690        vpaddd  zmm0, zmm0, zmm4
691        vpaddd  zmm1, zmm1, zmm5
692        vpaddd  zmm2, zmm2, zmm6
693        vpaddd  zmm3, zmm3, zmm7
694        vpxord  zmm12, zmm12, zmm0
695        vpxord  zmm13, zmm13, zmm1
696        vpxord  zmm14, zmm14, zmm2
697        vpxord  zmm15, zmm15, zmm3
698        vprord  zmm12, zmm12, 16
699        vprord  zmm13, zmm13, 16
700        vprord  zmm14, zmm14, 16
701        vprord  zmm15, zmm15, 16
702        vpaddd  zmm8, zmm8, zmm12
703        vpaddd  zmm9, zmm9, zmm13
704        vpaddd  zmm10, zmm10, zmm14
705        vpaddd  zmm11, zmm11, zmm15
706        vpxord  zmm4, zmm4, zmm8
707        vpxord  zmm5, zmm5, zmm9
708        vpxord  zmm6, zmm6, zmm10
709        vpxord  zmm7, zmm7, zmm11
710        vprord  zmm4, zmm4, 12
711        vprord  zmm5, zmm5, 12
712        vprord  zmm6, zmm6, 12
713        vprord  zmm7, zmm7, 12
714        vpaddd  zmm0, zmm0, zmm29
715        vpaddd  zmm1, zmm1, zmm27
716        vpaddd  zmm2, zmm2, zmm26
717        vpaddd  zmm3, zmm3, zmm24
718        vpaddd  zmm0, zmm0, zmm4
719        vpaddd  zmm1, zmm1, zmm5
720        vpaddd  zmm2, zmm2, zmm6
721        vpaddd  zmm3, zmm3, zmm7
722        vpxord  zmm12, zmm12, zmm0
723        vpxord  zmm13, zmm13, zmm1
724        vpxord  zmm14, zmm14, zmm2
725        vpxord  zmm15, zmm15, zmm3
726        vprord  zmm12, zmm12, 8
727        vprord  zmm13, zmm13, 8
728        vprord  zmm14, zmm14, 8
729        vprord  zmm15, zmm15, 8
730        vpaddd  zmm8, zmm8, zmm12
731        vpaddd  zmm9, zmm9, zmm13
732        vpaddd  zmm10, zmm10, zmm14
733        vpaddd  zmm11, zmm11, zmm15
734        vpxord  zmm4, zmm4, zmm8
735        vpxord  zmm5, zmm5, zmm9
736        vpxord  zmm6, zmm6, zmm10
737        vpxord  zmm7, zmm7, zmm11
738        vprord  zmm4, zmm4, 7
739        vprord  zmm5, zmm5, 7
740        vprord  zmm6, zmm6, 7
741        vprord  zmm7, zmm7, 7
742        vpaddd  zmm0, zmm0, zmm23
743        vpaddd  zmm1, zmm1, zmm21
744        vpaddd  zmm2, zmm2, zmm16
745        vpaddd  zmm3, zmm3, zmm22
746        vpaddd  zmm0, zmm0, zmm5
747        vpaddd  zmm1, zmm1, zmm6
748        vpaddd  zmm2, zmm2, zmm7
749        vpaddd  zmm3, zmm3, zmm4
750        vpxord  zmm15, zmm15, zmm0
751        vpxord  zmm12, zmm12, zmm1
752        vpxord  zmm13, zmm13, zmm2
753        vpxord  zmm14, zmm14, zmm3
754        vprord  zmm15, zmm15, 16
755        vprord  zmm12, zmm12, 16
756        vprord  zmm13, zmm13, 16
757        vprord  zmm14, zmm14, 16
758        vpaddd  zmm10, zmm10, zmm15
759        vpaddd  zmm11, zmm11, zmm12
760        vpaddd  zmm8, zmm8, zmm13
761        vpaddd  zmm9, zmm9, zmm14
762        vpxord  zmm5, zmm5, zmm10
763        vpxord  zmm6, zmm6, zmm11
764        vpxord  zmm7, zmm7, zmm8
765        vpxord  zmm4, zmm4, zmm9
766        vprord  zmm5, zmm5, 12
767        vprord  zmm6, zmm6, 12
768        vprord  zmm7, zmm7, 12
769        vprord  zmm4, zmm4, 12
770        vpaddd  zmm0, zmm0, zmm18
771        vpaddd  zmm1, zmm1, zmm19
772        vpaddd  zmm2, zmm2, zmm17
773        vpaddd  zmm3, zmm3, zmm20
774        vpaddd  zmm0, zmm0, zmm5
775        vpaddd  zmm1, zmm1, zmm6
776        vpaddd  zmm2, zmm2, zmm7
777        vpaddd  zmm3, zmm3, zmm4
778        vpxord  zmm15, zmm15, zmm0
779        vpxord  zmm12, zmm12, zmm1
780        vpxord  zmm13, zmm13, zmm2
781        vpxord  zmm14, zmm14, zmm3
782        vprord  zmm15, zmm15, 8
783        vprord  zmm12, zmm12, 8
784        vprord  zmm13, zmm13, 8
785        vprord  zmm14, zmm14, 8
786        vpaddd  zmm10, zmm10, zmm15
787        vpaddd  zmm11, zmm11, zmm12
788        vpaddd  zmm8, zmm8, zmm13
789        vpaddd  zmm9, zmm9, zmm14
790        vpxord  zmm5, zmm5, zmm10
791        vpxord  zmm6, zmm6, zmm11
792        vpxord  zmm7, zmm7, zmm8
793        vpxord  zmm4, zmm4, zmm9
794        vprord  zmm5, zmm5, 7
795        vprord  zmm6, zmm6, 7
796        vprord  zmm7, zmm7, 7
797        vprord  zmm4, zmm4, 7
798        vpaddd  zmm0, zmm0, zmm25
799        vpaddd  zmm1, zmm1, zmm27
800        vpaddd  zmm2, zmm2, zmm24
801        vpaddd  zmm3, zmm3, zmm31
802        vpaddd  zmm0, zmm0, zmm4
803        vpaddd  zmm1, zmm1, zmm5
804        vpaddd  zmm2, zmm2, zmm6
805        vpaddd  zmm3, zmm3, zmm7
806        vpxord  zmm12, zmm12, zmm0
807        vpxord  zmm13, zmm13, zmm1
808        vpxord  zmm14, zmm14, zmm2
809        vpxord  zmm15, zmm15, zmm3
810        vprord  zmm12, zmm12, 16
811        vprord  zmm13, zmm13, 16
812        vprord  zmm14, zmm14, 16
813        vprord  zmm15, zmm15, 16
814        vpaddd  zmm8, zmm8, zmm12
815        vpaddd  zmm9, zmm9, zmm13
816        vpaddd  zmm10, zmm10, zmm14
817        vpaddd  zmm11, zmm11, zmm15
818        vpxord  zmm4, zmm4, zmm8
819        vpxord  zmm5, zmm5, zmm9
820        vpxord  zmm6, zmm6, zmm10
821        vpxord  zmm7, zmm7, zmm11
822        vprord  zmm4, zmm4, 12
823        vprord  zmm5, zmm5, 12
824        vprord  zmm6, zmm6, 12
825        vprord  zmm7, zmm7, 12
826        vpaddd  zmm0, zmm0, zmm30
827        vpaddd  zmm1, zmm1, zmm21
828        vpaddd  zmm2, zmm2, zmm28
829        vpaddd  zmm3, zmm3, zmm17
830        vpaddd  zmm0, zmm0, zmm4
831        vpaddd  zmm1, zmm1, zmm5
832        vpaddd  zmm2, zmm2, zmm6
833        vpaddd  zmm3, zmm3, zmm7
834        vpxord  zmm12, zmm12, zmm0
835        vpxord  zmm13, zmm13, zmm1
836        vpxord  zmm14, zmm14, zmm2
837        vpxord  zmm15, zmm15, zmm3
838        vprord  zmm12, zmm12, 8
839        vprord  zmm13, zmm13, 8
840        vprord  zmm14, zmm14, 8
841        vprord  zmm15, zmm15, 8
842        vpaddd  zmm8, zmm8, zmm12
843        vpaddd  zmm9, zmm9, zmm13
844        vpaddd  zmm10, zmm10, zmm14
845        vpaddd  zmm11, zmm11, zmm15
846        vpxord  zmm4, zmm4, zmm8
847        vpxord  zmm5, zmm5, zmm9
848        vpxord  zmm6, zmm6, zmm10
849        vpxord  zmm7, zmm7, zmm11
850        vprord  zmm4, zmm4, 7
851        vprord  zmm5, zmm5, 7
852        vprord  zmm6, zmm6, 7
853        vprord  zmm7, zmm7, 7
854        vpaddd  zmm0, zmm0, zmm29
855        vpaddd  zmm1, zmm1, zmm16
856        vpaddd  zmm2, zmm2, zmm18
857        vpaddd  zmm3, zmm3, zmm20
858        vpaddd  zmm0, zmm0, zmm5
859        vpaddd  zmm1, zmm1, zmm6
860        vpaddd  zmm2, zmm2, zmm7
861        vpaddd  zmm3, zmm3, zmm4
862        vpxord  zmm15, zmm15, zmm0
863        vpxord  zmm12, zmm12, zmm1
864        vpxord  zmm13, zmm13, zmm2
865        vpxord  zmm14, zmm14, zmm3
866        vprord  zmm15, zmm15, 16
867        vprord  zmm12, zmm12, 16
868        vprord  zmm13, zmm13, 16
869        vprord  zmm14, zmm14, 16
870        vpaddd  zmm10, zmm10, zmm15
871        vpaddd  zmm11, zmm11, zmm12
872        vpaddd  zmm8, zmm8, zmm13
873        vpaddd  zmm9, zmm9, zmm14
874        vpxord  zmm5, zmm5, zmm10
875        vpxord  zmm6, zmm6, zmm11
876        vpxord  zmm7, zmm7, zmm8
877        vpxord  zmm4, zmm4, zmm9
878        vprord  zmm5, zmm5, 12
879        vprord  zmm6, zmm6, 12
880        vprord  zmm7, zmm7, 12
881        vprord  zmm4, zmm4, 12
882        vpaddd  zmm0, zmm0, zmm19
883        vpaddd  zmm1, zmm1, zmm26
884        vpaddd  zmm2, zmm2, zmm22
885        vpaddd  zmm3, zmm3, zmm23
886        vpaddd  zmm0, zmm0, zmm5
887        vpaddd  zmm1, zmm1, zmm6
888        vpaddd  zmm2, zmm2, zmm7
889        vpaddd  zmm3, zmm3, zmm4
890        vpxord  zmm15, zmm15, zmm0
891        vpxord  zmm12, zmm12, zmm1
892        vpxord  zmm13, zmm13, zmm2
893        vpxord  zmm14, zmm14, zmm3
894        vprord  zmm15, zmm15, 8
895        vprord  zmm12, zmm12, 8
896        vprord  zmm13, zmm13, 8
897        vprord  zmm14, zmm14, 8
898        vpaddd  zmm10, zmm10, zmm15
899        vpaddd  zmm11, zmm11, zmm12
900        vpaddd  zmm8, zmm8, zmm13
901        vpaddd  zmm9, zmm9, zmm14
902        vpxord  zmm5, zmm5, zmm10
903        vpxord  zmm6, zmm6, zmm11
904        vpxord  zmm7, zmm7, zmm8
905        vpxord  zmm4, zmm4, zmm9
906        vprord  zmm5, zmm5, 7
907        vprord  zmm6, zmm6, 7
908        vprord  zmm7, zmm7, 7
909        vprord  zmm4, zmm4, 7
910        vpaddd  zmm0, zmm0, zmm27
911        vpaddd  zmm1, zmm1, zmm21
912        vpaddd  zmm2, zmm2, zmm17
913        vpaddd  zmm3, zmm3, zmm24
914        vpaddd  zmm0, zmm0, zmm4
915        vpaddd  zmm1, zmm1, zmm5
916        vpaddd  zmm2, zmm2, zmm6
917        vpaddd  zmm3, zmm3, zmm7
918        vpxord  zmm12, zmm12, zmm0
919        vpxord  zmm13, zmm13, zmm1
920        vpxord  zmm14, zmm14, zmm2
921        vpxord  zmm15, zmm15, zmm3
922        vprord  zmm12, zmm12, 16
923        vprord  zmm13, zmm13, 16
924        vprord  zmm14, zmm14, 16
925        vprord  zmm15, zmm15, 16
926        vpaddd  zmm8, zmm8, zmm12
927        vpaddd  zmm9, zmm9, zmm13
928        vpaddd  zmm10, zmm10, zmm14
929        vpaddd  zmm11, zmm11, zmm15
930        vpxord  zmm4, zmm4, zmm8
931        vpxord  zmm5, zmm5, zmm9
932        vpxord  zmm6, zmm6, zmm10
933        vpxord  zmm7, zmm7, zmm11
934        vprord  zmm4, zmm4, 12
935        vprord  zmm5, zmm5, 12
936        vprord  zmm6, zmm6, 12
937        vprord  zmm7, zmm7, 12
938        vpaddd  zmm0, zmm0, zmm31
939        vpaddd  zmm1, zmm1, zmm16
940        vpaddd  zmm2, zmm2, zmm25
941        vpaddd  zmm3, zmm3, zmm22
942        vpaddd  zmm0, zmm0, zmm4
943        vpaddd  zmm1, zmm1, zmm5
944        vpaddd  zmm2, zmm2, zmm6
945        vpaddd  zmm3, zmm3, zmm7
946        vpxord  zmm12, zmm12, zmm0
947        vpxord  zmm13, zmm13, zmm1
948        vpxord  zmm14, zmm14, zmm2
949        vpxord  zmm15, zmm15, zmm3
950        vprord  zmm12, zmm12, 8
951        vprord  zmm13, zmm13, 8
952        vprord  zmm14, zmm14, 8
953        vprord  zmm15, zmm15, 8
954        vpaddd  zmm8, zmm8, zmm12
955        vpaddd  zmm9, zmm9, zmm13
956        vpaddd  zmm10, zmm10, zmm14
957        vpaddd  zmm11, zmm11, zmm15
958        vpxord  zmm4, zmm4, zmm8
959        vpxord  zmm5, zmm5, zmm9
960        vpxord  zmm6, zmm6, zmm10
961        vpxord  zmm7, zmm7, zmm11
962        vprord  zmm4, zmm4, 7
963        vprord  zmm5, zmm5, 7
964        vprord  zmm6, zmm6, 7
965        vprord  zmm7, zmm7, 7
966        vpaddd  zmm0, zmm0, zmm30
967        vpaddd  zmm1, zmm1, zmm18
968        vpaddd  zmm2, zmm2, zmm19
969        vpaddd  zmm3, zmm3, zmm23
970        vpaddd  zmm0, zmm0, zmm5
971        vpaddd  zmm1, zmm1, zmm6
972        vpaddd  zmm2, zmm2, zmm7
973        vpaddd  zmm3, zmm3, zmm4
974        vpxord  zmm15, zmm15, zmm0
975        vpxord  zmm12, zmm12, zmm1
976        vpxord  zmm13, zmm13, zmm2
977        vpxord  zmm14, zmm14, zmm3
978        vprord  zmm15, zmm15, 16
979        vprord  zmm12, zmm12, 16
980        vprord  zmm13, zmm13, 16
981        vprord  zmm14, zmm14, 16
982        vpaddd  zmm10, zmm10, zmm15
983        vpaddd  zmm11, zmm11, zmm12
984        vpaddd  zmm8, zmm8, zmm13
985        vpaddd  zmm9, zmm9, zmm14
986        vpxord  zmm5, zmm5, zmm10
987        vpxord  zmm6, zmm6, zmm11
988        vpxord  zmm7, zmm7, zmm8
989        vpxord  zmm4, zmm4, zmm9
990        vprord  zmm5, zmm5, 12
991        vprord  zmm6, zmm6, 12
992        vprord  zmm7, zmm7, 12
993        vprord  zmm4, zmm4, 12
994        vpaddd  zmm0, zmm0, zmm26
995        vpaddd  zmm1, zmm1, zmm28
996        vpaddd  zmm2, zmm2, zmm20
997        vpaddd  zmm3, zmm3, zmm29
998        vpaddd  zmm0, zmm0, zmm5
999        vpaddd  zmm1, zmm1, zmm6
1000        vpaddd  zmm2, zmm2, zmm7
1001        vpaddd  zmm3, zmm3, zmm4
1002        vpxord  zmm15, zmm15, zmm0
1003        vpxord  zmm12, zmm12, zmm1
1004        vpxord  zmm13, zmm13, zmm2
1005        vpxord  zmm14, zmm14, zmm3
1006        vprord  zmm15, zmm15, 8
1007        vprord  zmm12, zmm12, 8
1008        vprord  zmm13, zmm13, 8
1009        vprord  zmm14, zmm14, 8
1010        vpaddd  zmm10, zmm10, zmm15
1011        vpaddd  zmm11, zmm11, zmm12
1012        vpaddd  zmm8, zmm8, zmm13
1013        vpaddd  zmm9, zmm9, zmm14
1014        vpxord  zmm5, zmm5, zmm10
1015        vpxord  zmm6, zmm6, zmm11
1016        vpxord  zmm7, zmm7, zmm8
1017        vpxord  zmm4, zmm4, zmm9
1018        vprord  zmm5, zmm5, 7
1019        vprord  zmm6, zmm6, 7
1020        vprord  zmm7, zmm7, 7
1021        vprord  zmm4, zmm4, 7
1022        vpxord  zmm0, zmm0, zmm8
1023        vpxord  zmm1, zmm1, zmm9
1024        vpxord  zmm2, zmm2, zmm10
1025        vpxord  zmm3, zmm3, zmm11
1026        vpxord  zmm4, zmm4, zmm12
1027        vpxord  zmm5, zmm5, zmm13
1028        vpxord  zmm6, zmm6, zmm14
1029        vpxord  zmm7, zmm7, zmm15
1030        movzx   eax, byte ptr [rbp+78H]
1031        jne     innerloop16
1032        mov     rbx, qword ptr [rbp+90H]
1033        vpunpckldq zmm16, zmm0, zmm1
1034        vpunpckhdq zmm17, zmm0, zmm1
1035        vpunpckldq zmm18, zmm2, zmm3
1036        vpunpckhdq zmm19, zmm2, zmm3
1037        vpunpckldq zmm20, zmm4, zmm5
1038        vpunpckhdq zmm21, zmm4, zmm5
1039        vpunpckldq zmm22, zmm6, zmm7
1040        vpunpckhdq zmm23, zmm6, zmm7
1041        vpunpcklqdq zmm0, zmm16, zmm18
1042        vpunpckhqdq zmm1, zmm16, zmm18
1043        vpunpcklqdq zmm2, zmm17, zmm19
1044        vpunpckhqdq zmm3, zmm17, zmm19
1045        vpunpcklqdq zmm4, zmm20, zmm22
1046        vpunpckhqdq zmm5, zmm20, zmm22
1047        vpunpcklqdq zmm6, zmm21, zmm23
1048        vpunpckhqdq zmm7, zmm21, zmm23
1049        vshufi32x4 zmm16, zmm0, zmm4, 88H
1050        vshufi32x4 zmm17, zmm1, zmm5, 88H
1051        vshufi32x4 zmm18, zmm2, zmm6, 88H
1052        vshufi32x4 zmm19, zmm3, zmm7, 88H
1053        vshufi32x4 zmm20, zmm0, zmm4, 0DDH
1054        vshufi32x4 zmm21, zmm1, zmm5, 0DDH
1055        vshufi32x4 zmm22, zmm2, zmm6, 0DDH
1056        vshufi32x4 zmm23, zmm3, zmm7, 0DDH
1057        vshufi32x4 zmm0, zmm16, zmm17, 88H
1058        vshufi32x4 zmm1, zmm18, zmm19, 88H
1059        vshufi32x4 zmm2, zmm20, zmm21, 88H
1060        vshufi32x4 zmm3, zmm22, zmm23, 88H
1061        vshufi32x4 zmm4, zmm16, zmm17, 0DDH
1062        vshufi32x4 zmm5, zmm18, zmm19, 0DDH
1063        vshufi32x4 zmm6, zmm20, zmm21, 0DDH
1064        vshufi32x4 zmm7, zmm22, zmm23, 0DDH
1065        vmovdqu32 zmmword ptr [rbx], zmm0
1066        vmovdqu32 zmmword ptr [rbx+1H*40H], zmm1
1067        vmovdqu32 zmmword ptr [rbx+2H*40H], zmm2
1068        vmovdqu32 zmmword ptr [rbx+3H*40H], zmm3
1069        vmovdqu32 zmmword ptr [rbx+4H*40H], zmm4
1070        vmovdqu32 zmmword ptr [rbx+5H*40H], zmm5
1071        vmovdqu32 zmmword ptr [rbx+6H*40H], zmm6
1072        vmovdqu32 zmmword ptr [rbx+7H*40H], zmm7
1073        vmovdqa32 zmm0, zmmword ptr [rsp]
1074        vmovdqa32 zmm1, zmmword ptr [rsp+1H*40H]
1075        vmovdqa32 zmm2, zmm0
1076        ; XXX: ml64.exe does not currently understand the syntax. We use a workaround.
1077        vpbroadcastd zmm4, dword ptr [ADD16]
1078        vpbroadcastd zmm5, dword ptr [ADD1]
1079        vpaddd  zmm2{k1}, zmm0, zmm4
1080        ; vpaddd  zmm2{k1}, zmm0, dword ptr [ADD16] ; {1to16}
1081        vpcmpud k2, zmm2, zmm0, 1
1082        vpaddd  zmm1 {k2}, zmm1, zmm5
1083        ; vpaddd  zmm1 {k2}, zmm1, dword ptr [ADD1] ; {1to16}
1084        vmovdqa32 zmmword ptr [rsp], zmm2
1085        vmovdqa32 zmmword ptr [rsp+1H*40H], zmm1
1086        add     rdi, 128
1087        add     rbx, 512
1088        mov     qword ptr [rbp+90H], rbx
1089        sub     rsi, 16
1090        cmp     rsi, 16
1091        jnc     outerloop16
1092        test    rsi, rsi
1093        jne     final15blocks
1094unwind:
1095        vzeroupper
1096        vmovdqa xmm6, xmmword ptr [rsp+90H]
1097        vmovdqa xmm7, xmmword ptr [rsp+0A0H]
1098        vmovdqa xmm8, xmmword ptr [rsp+0B0H]
1099        vmovdqa xmm9, xmmword ptr [rsp+0C0H]
1100        vmovdqa xmm10, xmmword ptr [rsp+0D0H]
1101        vmovdqa xmm11, xmmword ptr [rsp+0E0H]
1102        vmovdqa xmm12, xmmword ptr [rsp+0F0H]
1103        vmovdqa xmm13, xmmword ptr [rsp+100H]
1104        vmovdqa xmm14, xmmword ptr [rsp+110H]
1105        vmovdqa xmm15, xmmword ptr [rsp+120H]
1106        mov     rsp, rbp
1107        pop     rbp
1108        pop     rbx
1109        pop     rsi
1110        pop     rdi
1111        pop     r12
1112        pop     r13
1113        pop     r14
1114        pop     r15
1115        ret
1116ALIGN   16
1117final15blocks:
1118        test    esi, 8H
1119        je      final7blocks
1120        vpbroadcastd ymm0, dword ptr [rcx]
1121        vpbroadcastd ymm1, dword ptr [rcx+4H]
1122        vpbroadcastd ymm2, dword ptr [rcx+8H]
1123        vpbroadcastd ymm3, dword ptr [rcx+0CH]
1124        vpbroadcastd ymm4, dword ptr [rcx+10H]
1125        vpbroadcastd ymm5, dword ptr [rcx+14H]
1126        vpbroadcastd ymm6, dword ptr [rcx+18H]
1127        vpbroadcastd ymm7, dword ptr [rcx+1CH]
1128        mov     r8, qword ptr [rdi]
1129        mov     r9, qword ptr [rdi+8H]
1130        mov     r10, qword ptr [rdi+10H]
1131        mov     r11, qword ptr [rdi+18H]
1132        mov     r12, qword ptr [rdi+20H]
1133        mov     r13, qword ptr [rdi+28H]
1134        mov     r14, qword ptr [rdi+30H]
1135        mov     r15, qword ptr [rdi+38H]
1136        movzx   eax, byte ptr [rbp+78H]
1137        movzx   ebx, byte ptr [rbp+80H]
1138        or      eax, ebx
1139        xor     edx, edx
1140innerloop8:
1141        movzx   ebx, byte ptr [rbp+88H]
1142        or      ebx, eax
1143        add     rdx, 64
1144        cmp     rdx, qword ptr [rsp+80H]
1145        cmove   eax, ebx
1146        mov     dword ptr [rsp+88H], eax
1147        vmovups xmm8, xmmword ptr [r8+rdx-40H]
1148        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-40H], 01H
1149        vmovups xmm9, xmmword ptr [r9+rdx-40H]
1150        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-40H], 01H
1151        vunpcklpd ymm12, ymm8, ymm9
1152        vunpckhpd ymm13, ymm8, ymm9
1153        vmovups xmm10, xmmword ptr [r10+rdx-40H]
1154        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-40H], 01H
1155        vmovups xmm11, xmmword ptr [r11+rdx-40H]
1156        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-40H], 01H
1157        vunpcklpd ymm14, ymm10, ymm11
1158        vunpckhpd ymm15, ymm10, ymm11
1159        vshufps ymm16, ymm12, ymm14, 136
1160        vshufps ymm17, ymm12, ymm14, 221
1161        vshufps ymm18, ymm13, ymm15, 136
1162        vshufps ymm19, ymm13, ymm15, 221
1163        vmovups xmm8, xmmword ptr [r8+rdx-30H]
1164        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-30H], 01H
1165        vmovups xmm9, xmmword ptr [r9+rdx-30H]
1166        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-30H], 01H
1167        vunpcklpd ymm12, ymm8, ymm9
1168        vunpckhpd ymm13, ymm8, ymm9
1169        vmovups xmm10, xmmword ptr [r10+rdx-30H]
1170        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-30H], 01H
1171        vmovups xmm11, xmmword ptr [r11+rdx-30H]
1172        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-30H], 01H
1173        vunpcklpd ymm14, ymm10, ymm11
1174        vunpckhpd ymm15, ymm10, ymm11
1175        vshufps ymm20, ymm12, ymm14, 136
1176        vshufps ymm21, ymm12, ymm14, 221
1177        vshufps ymm22, ymm13, ymm15, 136
1178        vshufps ymm23, ymm13, ymm15, 221
1179        vmovups xmm8, xmmword ptr [r8+rdx-20H]
1180        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-20H], 01H
1181        vmovups xmm9, xmmword ptr [r9+rdx-20H]
1182        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-20H], 01H
1183        vunpcklpd ymm12, ymm8, ymm9
1184        vunpckhpd ymm13, ymm8, ymm9
1185        vmovups xmm10, xmmword ptr [r10+rdx-20H]
1186        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-20H], 01H
1187        vmovups xmm11, xmmword ptr [r11+rdx-20H]
1188        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-20H], 01H
1189        vunpcklpd ymm14, ymm10, ymm11
1190        vunpckhpd ymm15, ymm10, ymm11
1191        vshufps ymm24, ymm12, ymm14, 136
1192        vshufps ymm25, ymm12, ymm14, 221
1193        vshufps ymm26, ymm13, ymm15, 136
1194        vshufps ymm27, ymm13, ymm15, 221
1195        vmovups xmm8, xmmword ptr [r8+rdx-10H]
1196        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-10H], 01H
1197        vmovups xmm9, xmmword ptr [r9+rdx-10H]
1198        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-10H], 01H
1199        vunpcklpd ymm12, ymm8, ymm9
1200        vunpckhpd ymm13, ymm8, ymm9
1201        vmovups xmm10, xmmword ptr [r10+rdx-10H]
1202        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-10H], 01H
1203        vmovups xmm11, xmmword ptr [r11+rdx-10H]
1204        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-10H], 01H
1205        vunpcklpd ymm14, ymm10, ymm11
1206        vunpckhpd ymm15, ymm10, ymm11
1207        vshufps ymm28, ymm12, ymm14, 136
1208        vshufps ymm29, ymm12, ymm14, 221
1209        vshufps ymm30, ymm13, ymm15, 136
1210        vshufps ymm31, ymm13, ymm15, 221
1211        vpbroadcastd ymm8, dword ptr [BLAKE3_IV_0]
1212        vpbroadcastd ymm9, dword ptr [BLAKE3_IV_1]
1213        vpbroadcastd ymm10, dword ptr [BLAKE3_IV_2]
1214        vpbroadcastd ymm11, dword ptr [BLAKE3_IV_3]
1215        vmovdqa ymm12, ymmword ptr [rsp]
1216        vmovdqa ymm13, ymmword ptr [rsp+40H]
1217        vpbroadcastd ymm14, dword ptr [BLAKE3_BLOCK_LEN]
1218        vpbroadcastd ymm15, dword ptr [rsp+88H]
1219        vpaddd  ymm0, ymm0, ymm16
1220        vpaddd  ymm1, ymm1, ymm18
1221        vpaddd  ymm2, ymm2, ymm20
1222        vpaddd  ymm3, ymm3, ymm22
1223        vpaddd  ymm0, ymm0, ymm4
1224        vpaddd  ymm1, ymm1, ymm5
1225        vpaddd  ymm2, ymm2, ymm6
1226        vpaddd  ymm3, ymm3, ymm7
1227        vpxord  ymm12, ymm12, ymm0
1228        vpxord  ymm13, ymm13, ymm1
1229        vpxord  ymm14, ymm14, ymm2
1230        vpxord  ymm15, ymm15, ymm3
1231        vprord  ymm12, ymm12, 16
1232        vprord  ymm13, ymm13, 16
1233        vprord  ymm14, ymm14, 16
1234        vprord  ymm15, ymm15, 16
1235        vpaddd  ymm8, ymm8, ymm12
1236        vpaddd  ymm9, ymm9, ymm13
1237        vpaddd  ymm10, ymm10, ymm14
1238        vpaddd  ymm11, ymm11, ymm15
1239        vpxord  ymm4, ymm4, ymm8
1240        vpxord  ymm5, ymm5, ymm9
1241        vpxord  ymm6, ymm6, ymm10
1242        vpxord  ymm7, ymm7, ymm11
1243        vprord  ymm4, ymm4, 12
1244        vprord  ymm5, ymm5, 12
1245        vprord  ymm6, ymm6, 12
1246        vprord  ymm7, ymm7, 12
1247        vpaddd  ymm0, ymm0, ymm17
1248        vpaddd  ymm1, ymm1, ymm19
1249        vpaddd  ymm2, ymm2, ymm21
1250        vpaddd  ymm3, ymm3, ymm23
1251        vpaddd  ymm0, ymm0, ymm4
1252        vpaddd  ymm1, ymm1, ymm5
1253        vpaddd  ymm2, ymm2, ymm6
1254        vpaddd  ymm3, ymm3, ymm7
1255        vpxord  ymm12, ymm12, ymm0
1256        vpxord  ymm13, ymm13, ymm1
1257        vpxord  ymm14, ymm14, ymm2
1258        vpxord  ymm15, ymm15, ymm3
1259        vprord  ymm12, ymm12, 8
1260        vprord  ymm13, ymm13, 8
1261        vprord  ymm14, ymm14, 8
1262        vprord  ymm15, ymm15, 8
1263        vpaddd  ymm8, ymm8, ymm12
1264        vpaddd  ymm9, ymm9, ymm13
1265        vpaddd  ymm10, ymm10, ymm14
1266        vpaddd  ymm11, ymm11, ymm15
1267        vpxord  ymm4, ymm4, ymm8
1268        vpxord  ymm5, ymm5, ymm9
1269        vpxord  ymm6, ymm6, ymm10
1270        vpxord  ymm7, ymm7, ymm11
1271        vprord  ymm4, ymm4, 7
1272        vprord  ymm5, ymm5, 7
1273        vprord  ymm6, ymm6, 7
1274        vprord  ymm7, ymm7, 7
1275        vpaddd  ymm0, ymm0, ymm24
1276        vpaddd  ymm1, ymm1, ymm26
1277        vpaddd  ymm2, ymm2, ymm28
1278        vpaddd  ymm3, ymm3, ymm30
1279        vpaddd  ymm0, ymm0, ymm5
1280        vpaddd  ymm1, ymm1, ymm6
1281        vpaddd  ymm2, ymm2, ymm7
1282        vpaddd  ymm3, ymm3, ymm4
1283        vpxord  ymm15, ymm15, ymm0
1284        vpxord  ymm12, ymm12, ymm1
1285        vpxord  ymm13, ymm13, ymm2
1286        vpxord  ymm14, ymm14, ymm3
1287        vprord  ymm15, ymm15, 16
1288        vprord  ymm12, ymm12, 16
1289        vprord  ymm13, ymm13, 16
1290        vprord  ymm14, ymm14, 16
1291        vpaddd  ymm10, ymm10, ymm15
1292        vpaddd  ymm11, ymm11, ymm12
1293        vpaddd  ymm8, ymm8, ymm13
1294        vpaddd  ymm9, ymm9, ymm14
1295        vpxord  ymm5, ymm5, ymm10
1296        vpxord  ymm6, ymm6, ymm11
1297        vpxord  ymm7, ymm7, ymm8
1298        vpxord  ymm4, ymm4, ymm9
1299        vprord  ymm5, ymm5, 12
1300        vprord  ymm6, ymm6, 12
1301        vprord  ymm7, ymm7, 12
1302        vprord  ymm4, ymm4, 12
1303        vpaddd  ymm0, ymm0, ymm25
1304        vpaddd  ymm1, ymm1, ymm27
1305        vpaddd  ymm2, ymm2, ymm29
1306        vpaddd  ymm3, ymm3, ymm31
1307        vpaddd  ymm0, ymm0, ymm5
1308        vpaddd  ymm1, ymm1, ymm6
1309        vpaddd  ymm2, ymm2, ymm7
1310        vpaddd  ymm3, ymm3, ymm4
1311        vpxord  ymm15, ymm15, ymm0
1312        vpxord  ymm12, ymm12, ymm1
1313        vpxord  ymm13, ymm13, ymm2
1314        vpxord  ymm14, ymm14, ymm3
1315        vprord  ymm15, ymm15, 8
1316        vprord  ymm12, ymm12, 8
1317        vprord  ymm13, ymm13, 8
1318        vprord  ymm14, ymm14, 8
1319        vpaddd  ymm10, ymm10, ymm15
1320        vpaddd  ymm11, ymm11, ymm12
1321        vpaddd  ymm8, ymm8, ymm13
1322        vpaddd  ymm9, ymm9, ymm14
1323        vpxord  ymm5, ymm5, ymm10
1324        vpxord  ymm6, ymm6, ymm11
1325        vpxord  ymm7, ymm7, ymm8
1326        vpxord  ymm4, ymm4, ymm9
1327        vprord  ymm5, ymm5, 7
1328        vprord  ymm6, ymm6, 7
1329        vprord  ymm7, ymm7, 7
1330        vprord  ymm4, ymm4, 7
1331        vpaddd  ymm0, ymm0, ymm18
1332        vpaddd  ymm1, ymm1, ymm19
1333        vpaddd  ymm2, ymm2, ymm23
1334        vpaddd  ymm3, ymm3, ymm20
1335        vpaddd  ymm0, ymm0, ymm4
1336        vpaddd  ymm1, ymm1, ymm5
1337        vpaddd  ymm2, ymm2, ymm6
1338        vpaddd  ymm3, ymm3, ymm7
1339        vpxord  ymm12, ymm12, ymm0
1340        vpxord  ymm13, ymm13, ymm1
1341        vpxord  ymm14, ymm14, ymm2
1342        vpxord  ymm15, ymm15, ymm3
1343        vprord  ymm12, ymm12, 16
1344        vprord  ymm13, ymm13, 16
1345        vprord  ymm14, ymm14, 16
1346        vprord  ymm15, ymm15, 16
1347        vpaddd  ymm8, ymm8, ymm12
1348        vpaddd  ymm9, ymm9, ymm13
1349        vpaddd  ymm10, ymm10, ymm14
1350        vpaddd  ymm11, ymm11, ymm15
1351        vpxord  ymm4, ymm4, ymm8
1352        vpxord  ymm5, ymm5, ymm9
1353        vpxord  ymm6, ymm6, ymm10
1354        vpxord  ymm7, ymm7, ymm11
1355        vprord  ymm4, ymm4, 12
1356        vprord  ymm5, ymm5, 12
1357        vprord  ymm6, ymm6, 12
1358        vprord  ymm7, ymm7, 12
1359        vpaddd  ymm0, ymm0, ymm22
1360        vpaddd  ymm1, ymm1, ymm26
1361        vpaddd  ymm2, ymm2, ymm16
1362        vpaddd  ymm3, ymm3, ymm29
1363        vpaddd  ymm0, ymm0, ymm4
1364        vpaddd  ymm1, ymm1, ymm5
1365        vpaddd  ymm2, ymm2, ymm6
1366        vpaddd  ymm3, ymm3, ymm7
1367        vpxord  ymm12, ymm12, ymm0
1368        vpxord  ymm13, ymm13, ymm1
1369        vpxord  ymm14, ymm14, ymm2
1370        vpxord  ymm15, ymm15, ymm3
1371        vprord  ymm12, ymm12, 8
1372        vprord  ymm13, ymm13, 8
1373        vprord  ymm14, ymm14, 8
1374        vprord  ymm15, ymm15, 8
1375        vpaddd  ymm8, ymm8, ymm12
1376        vpaddd  ymm9, ymm9, ymm13
1377        vpaddd  ymm10, ymm10, ymm14
1378        vpaddd  ymm11, ymm11, ymm15
1379        vpxord  ymm4, ymm4, ymm8
1380        vpxord  ymm5, ymm5, ymm9
1381        vpxord  ymm6, ymm6, ymm10
1382        vpxord  ymm7, ymm7, ymm11
1383        vprord  ymm4, ymm4, 7
1384        vprord  ymm5, ymm5, 7
1385        vprord  ymm6, ymm6, 7
1386        vprord  ymm7, ymm7, 7
1387        vpaddd  ymm0, ymm0, ymm17
1388        vpaddd  ymm1, ymm1, ymm28
1389        vpaddd  ymm2, ymm2, ymm25
1390        vpaddd  ymm3, ymm3, ymm31
1391        vpaddd  ymm0, ymm0, ymm5
1392        vpaddd  ymm1, ymm1, ymm6
1393        vpaddd  ymm2, ymm2, ymm7
1394        vpaddd  ymm3, ymm3, ymm4
1395        vpxord  ymm15, ymm15, ymm0
1396        vpxord  ymm12, ymm12, ymm1
1397        vpxord  ymm13, ymm13, ymm2
1398        vpxord  ymm14, ymm14, ymm3
1399        vprord  ymm15, ymm15, 16
1400        vprord  ymm12, ymm12, 16
1401        vprord  ymm13, ymm13, 16
1402        vprord  ymm14, ymm14, 16
1403        vpaddd  ymm10, ymm10, ymm15
1404        vpaddd  ymm11, ymm11, ymm12
1405        vpaddd  ymm8, ymm8, ymm13
1406        vpaddd  ymm9, ymm9, ymm14
1407        vpxord  ymm5, ymm5, ymm10
1408        vpxord  ymm6, ymm6, ymm11
1409        vpxord  ymm7, ymm7, ymm8
1410        vpxord  ymm4, ymm4, ymm9
1411        vprord  ymm5, ymm5, 12
1412        vprord  ymm6, ymm6, 12
1413        vprord  ymm7, ymm7, 12
1414        vprord  ymm4, ymm4, 12
1415        vpaddd  ymm0, ymm0, ymm27
1416        vpaddd  ymm1, ymm1, ymm21
1417        vpaddd  ymm2, ymm2, ymm30
1418        vpaddd  ymm3, ymm3, ymm24
1419        vpaddd  ymm0, ymm0, ymm5
1420        vpaddd  ymm1, ymm1, ymm6
1421        vpaddd  ymm2, ymm2, ymm7
1422        vpaddd  ymm3, ymm3, ymm4
1423        vpxord  ymm15, ymm15, ymm0
1424        vpxord  ymm12, ymm12, ymm1
1425        vpxord  ymm13, ymm13, ymm2
1426        vpxord  ymm14, ymm14, ymm3
1427        vprord  ymm15, ymm15, 8
1428        vprord  ymm12, ymm12, 8
1429        vprord  ymm13, ymm13, 8
1430        vprord  ymm14, ymm14, 8
1431        vpaddd  ymm10, ymm10, ymm15
1432        vpaddd  ymm11, ymm11, ymm12
1433        vpaddd  ymm8, ymm8, ymm13
1434        vpaddd  ymm9, ymm9, ymm14
1435        vpxord  ymm5, ymm5, ymm10
1436        vpxord  ymm6, ymm6, ymm11
1437        vpxord  ymm7, ymm7, ymm8
1438        vpxord  ymm4, ymm4, ymm9
1439        vprord  ymm5, ymm5, 7
1440        vprord  ymm6, ymm6, 7
1441        vprord  ymm7, ymm7, 7
1442        vprord  ymm4, ymm4, 7
1443        vpaddd  ymm0, ymm0, ymm19
1444        vpaddd  ymm1, ymm1, ymm26
1445        vpaddd  ymm2, ymm2, ymm29
1446        vpaddd  ymm3, ymm3, ymm23
1447        vpaddd  ymm0, ymm0, ymm4
1448        vpaddd  ymm1, ymm1, ymm5
1449        vpaddd  ymm2, ymm2, ymm6
1450        vpaddd  ymm3, ymm3, ymm7
1451        vpxord  ymm12, ymm12, ymm0
1452        vpxord  ymm13, ymm13, ymm1
1453        vpxord  ymm14, ymm14, ymm2
1454        vpxord  ymm15, ymm15, ymm3
1455        vprord  ymm12, ymm12, 16
1456        vprord  ymm13, ymm13, 16
1457        vprord  ymm14, ymm14, 16
1458        vprord  ymm15, ymm15, 16
1459        vpaddd  ymm8, ymm8, ymm12
1460        vpaddd  ymm9, ymm9, ymm13
1461        vpaddd  ymm10, ymm10, ymm14
1462        vpaddd  ymm11, ymm11, ymm15
1463        vpxord  ymm4, ymm4, ymm8
1464        vpxord  ymm5, ymm5, ymm9
1465        vpxord  ymm6, ymm6, ymm10
1466        vpxord  ymm7, ymm7, ymm11
1467        vprord  ymm4, ymm4, 12
1468        vprord  ymm5, ymm5, 12
1469        vprord  ymm6, ymm6, 12
1470        vprord  ymm7, ymm7, 12
1471        vpaddd  ymm0, ymm0, ymm20
1472        vpaddd  ymm1, ymm1, ymm28
1473        vpaddd  ymm2, ymm2, ymm18
1474        vpaddd  ymm3, ymm3, ymm30
1475        vpaddd  ymm0, ymm0, ymm4
1476        vpaddd  ymm1, ymm1, ymm5
1477        vpaddd  ymm2, ymm2, ymm6
1478        vpaddd  ymm3, ymm3, ymm7
1479        vpxord  ymm12, ymm12, ymm0
1480        vpxord  ymm13, ymm13, ymm1
1481        vpxord  ymm14, ymm14, ymm2
1482        vpxord  ymm15, ymm15, ymm3
1483        vprord  ymm12, ymm12, 8
1484        vprord  ymm13, ymm13, 8
1485        vprord  ymm14, ymm14, 8
1486        vprord  ymm15, ymm15, 8
1487        vpaddd  ymm8, ymm8, ymm12
1488        vpaddd  ymm9, ymm9, ymm13
1489        vpaddd  ymm10, ymm10, ymm14
1490        vpaddd  ymm11, ymm11, ymm15
1491        vpxord  ymm4, ymm4, ymm8
1492        vpxord  ymm5, ymm5, ymm9
1493        vpxord  ymm6, ymm6, ymm10
1494        vpxord  ymm7, ymm7, ymm11
1495        vprord  ymm4, ymm4, 7
1496        vprord  ymm5, ymm5, 7
1497        vprord  ymm6, ymm6, 7
1498        vprord  ymm7, ymm7, 7
1499        vpaddd  ymm0, ymm0, ymm22
1500        vpaddd  ymm1, ymm1, ymm25
1501        vpaddd  ymm2, ymm2, ymm27
1502        vpaddd  ymm3, ymm3, ymm24
1503        vpaddd  ymm0, ymm0, ymm5
1504        vpaddd  ymm1, ymm1, ymm6
1505        vpaddd  ymm2, ymm2, ymm7
1506        vpaddd  ymm3, ymm3, ymm4
1507        vpxord  ymm15, ymm15, ymm0
1508        vpxord  ymm12, ymm12, ymm1
1509        vpxord  ymm13, ymm13, ymm2
1510        vpxord  ymm14, ymm14, ymm3
1511        vprord  ymm15, ymm15, 16
1512        vprord  ymm12, ymm12, 16
1513        vprord  ymm13, ymm13, 16
1514        vprord  ymm14, ymm14, 16
1515        vpaddd  ymm10, ymm10, ymm15
1516        vpaddd  ymm11, ymm11, ymm12
1517        vpaddd  ymm8, ymm8, ymm13
1518        vpaddd  ymm9, ymm9, ymm14
1519        vpxord  ymm5, ymm5, ymm10
1520        vpxord  ymm6, ymm6, ymm11
1521        vpxord  ymm7, ymm7, ymm8
1522        vpxord  ymm4, ymm4, ymm9
1523        vprord  ymm5, ymm5, 12
1524        vprord  ymm6, ymm6, 12
1525        vprord  ymm7, ymm7, 12
1526        vprord  ymm4, ymm4, 12
1527        vpaddd  ymm0, ymm0, ymm21
1528        vpaddd  ymm1, ymm1, ymm16
1529        vpaddd  ymm2, ymm2, ymm31
1530        vpaddd  ymm3, ymm3, ymm17
1531        vpaddd  ymm0, ymm0, ymm5
1532        vpaddd  ymm1, ymm1, ymm6
1533        vpaddd  ymm2, ymm2, ymm7
1534        vpaddd  ymm3, ymm3, ymm4
1535        vpxord  ymm15, ymm15, ymm0
1536        vpxord  ymm12, ymm12, ymm1
1537        vpxord  ymm13, ymm13, ymm2
1538        vpxord  ymm14, ymm14, ymm3
1539        vprord  ymm15, ymm15, 8
1540        vprord  ymm12, ymm12, 8
1541        vprord  ymm13, ymm13, 8
1542        vprord  ymm14, ymm14, 8
1543        vpaddd  ymm10, ymm10, ymm15
1544        vpaddd  ymm11, ymm11, ymm12
1545        vpaddd  ymm8, ymm8, ymm13
1546        vpaddd  ymm9, ymm9, ymm14
1547        vpxord  ymm5, ymm5, ymm10
1548        vpxord  ymm6, ymm6, ymm11
1549        vpxord  ymm7, ymm7, ymm8
1550        vpxord  ymm4, ymm4, ymm9
1551        vprord  ymm5, ymm5, 7
1552        vprord  ymm6, ymm6, 7
1553        vprord  ymm7, ymm7, 7
1554        vprord  ymm4, ymm4, 7
1555        vpaddd  ymm0, ymm0, ymm26
1556        vpaddd  ymm1, ymm1, ymm28
1557        vpaddd  ymm2, ymm2, ymm30
1558        vpaddd  ymm3, ymm3, ymm29
1559        vpaddd  ymm0, ymm0, ymm4
1560        vpaddd  ymm1, ymm1, ymm5
1561        vpaddd  ymm2, ymm2, ymm6
1562        vpaddd  ymm3, ymm3, ymm7
1563        vpxord  ymm12, ymm12, ymm0
1564        vpxord  ymm13, ymm13, ymm1
1565        vpxord  ymm14, ymm14, ymm2
1566        vpxord  ymm15, ymm15, ymm3
1567        vprord  ymm12, ymm12, 16
1568        vprord  ymm13, ymm13, 16
1569        vprord  ymm14, ymm14, 16
1570        vprord  ymm15, ymm15, 16
1571        vpaddd  ymm8, ymm8, ymm12
1572        vpaddd  ymm9, ymm9, ymm13
1573        vpaddd  ymm10, ymm10, ymm14
1574        vpaddd  ymm11, ymm11, ymm15
1575        vpxord  ymm4, ymm4, ymm8
1576        vpxord  ymm5, ymm5, ymm9
1577        vpxord  ymm6, ymm6, ymm10
1578        vpxord  ymm7, ymm7, ymm11
1579        vprord  ymm4, ymm4, 12
1580        vprord  ymm5, ymm5, 12
1581        vprord  ymm6, ymm6, 12
1582        vprord  ymm7, ymm7, 12
1583        vpaddd  ymm0, ymm0, ymm23
1584        vpaddd  ymm1, ymm1, ymm25
1585        vpaddd  ymm2, ymm2, ymm19
1586        vpaddd  ymm3, ymm3, ymm31
1587        vpaddd  ymm0, ymm0, ymm4
1588        vpaddd  ymm1, ymm1, ymm5
1589        vpaddd  ymm2, ymm2, ymm6
1590        vpaddd  ymm3, ymm3, ymm7
1591        vpxord  ymm12, ymm12, ymm0
1592        vpxord  ymm13, ymm13, ymm1
1593        vpxord  ymm14, ymm14, ymm2
1594        vpxord  ymm15, ymm15, ymm3
1595        vprord  ymm12, ymm12, 8
1596        vprord  ymm13, ymm13, 8
1597        vprord  ymm14, ymm14, 8
1598        vprord  ymm15, ymm15, 8
1599        vpaddd  ymm8, ymm8, ymm12
1600        vpaddd  ymm9, ymm9, ymm13
1601        vpaddd  ymm10, ymm10, ymm14
1602        vpaddd  ymm11, ymm11, ymm15
1603        vpxord  ymm4, ymm4, ymm8
1604        vpxord  ymm5, ymm5, ymm9
1605        vpxord  ymm6, ymm6, ymm10
1606        vpxord  ymm7, ymm7, ymm11
1607        vprord  ymm4, ymm4, 7
1608        vprord  ymm5, ymm5, 7
1609        vprord  ymm6, ymm6, 7
1610        vprord  ymm7, ymm7, 7
1611        vpaddd  ymm0, ymm0, ymm20
1612        vpaddd  ymm1, ymm1, ymm27
1613        vpaddd  ymm2, ymm2, ymm21
1614        vpaddd  ymm3, ymm3, ymm17
1615        vpaddd  ymm0, ymm0, ymm5
1616        vpaddd  ymm1, ymm1, ymm6
1617        vpaddd  ymm2, ymm2, ymm7
1618        vpaddd  ymm3, ymm3, ymm4
1619        vpxord  ymm15, ymm15, ymm0
1620        vpxord  ymm12, ymm12, ymm1
1621        vpxord  ymm13, ymm13, ymm2
1622        vpxord  ymm14, ymm14, ymm3
1623        vprord  ymm15, ymm15, 16
1624        vprord  ymm12, ymm12, 16
1625        vprord  ymm13, ymm13, 16
1626        vprord  ymm14, ymm14, 16
1627        vpaddd  ymm10, ymm10, ymm15
1628        vpaddd  ymm11, ymm11, ymm12
1629        vpaddd  ymm8, ymm8, ymm13
1630        vpaddd  ymm9, ymm9, ymm14
1631        vpxord  ymm5, ymm5, ymm10
1632        vpxord  ymm6, ymm6, ymm11
1633        vpxord  ymm7, ymm7, ymm8
1634        vpxord  ymm4, ymm4, ymm9
1635        vprord  ymm5, ymm5, 12
1636        vprord  ymm6, ymm6, 12
1637        vprord  ymm7, ymm7, 12
1638        vprord  ymm4, ymm4, 12
1639        vpaddd  ymm0, ymm0, ymm16
1640        vpaddd  ymm1, ymm1, ymm18
1641        vpaddd  ymm2, ymm2, ymm24
1642        vpaddd  ymm3, ymm3, ymm22
1643        vpaddd  ymm0, ymm0, ymm5
1644        vpaddd  ymm1, ymm1, ymm6
1645        vpaddd  ymm2, ymm2, ymm7
1646        vpaddd  ymm3, ymm3, ymm4
1647        vpxord  ymm15, ymm15, ymm0
1648        vpxord  ymm12, ymm12, ymm1
1649        vpxord  ymm13, ymm13, ymm2
1650        vpxord  ymm14, ymm14, ymm3
1651        vprord  ymm15, ymm15, 8
1652        vprord  ymm12, ymm12, 8
1653        vprord  ymm13, ymm13, 8
1654        vprord  ymm14, ymm14, 8
1655        vpaddd  ymm10, ymm10, ymm15
1656        vpaddd  ymm11, ymm11, ymm12
1657        vpaddd  ymm8, ymm8, ymm13
1658        vpaddd  ymm9, ymm9, ymm14
1659        vpxord  ymm5, ymm5, ymm10
1660        vpxord  ymm6, ymm6, ymm11
1661        vpxord  ymm7, ymm7, ymm8
1662        vpxord  ymm4, ymm4, ymm9
1663        vprord  ymm5, ymm5, 7
1664        vprord  ymm6, ymm6, 7
1665        vprord  ymm7, ymm7, 7
1666        vprord  ymm4, ymm4, 7
1667        vpaddd  ymm0, ymm0, ymm28
1668        vpaddd  ymm1, ymm1, ymm25
1669        vpaddd  ymm2, ymm2, ymm31
1670        vpaddd  ymm3, ymm3, ymm30
1671        vpaddd  ymm0, ymm0, ymm4
1672        vpaddd  ymm1, ymm1, ymm5
1673        vpaddd  ymm2, ymm2, ymm6
1674        vpaddd  ymm3, ymm3, ymm7
1675        vpxord  ymm12, ymm12, ymm0
1676        vpxord  ymm13, ymm13, ymm1
1677        vpxord  ymm14, ymm14, ymm2
1678        vpxord  ymm15, ymm15, ymm3
1679        vprord  ymm12, ymm12, 16
1680        vprord  ymm13, ymm13, 16
1681        vprord  ymm14, ymm14, 16
1682        vprord  ymm15, ymm15, 16
1683        vpaddd  ymm8, ymm8, ymm12
1684        vpaddd  ymm9, ymm9, ymm13
1685        vpaddd  ymm10, ymm10, ymm14
1686        vpaddd  ymm11, ymm11, ymm15
1687        vpxord  ymm4, ymm4, ymm8
1688        vpxord  ymm5, ymm5, ymm9
1689        vpxord  ymm6, ymm6, ymm10
1690        vpxord  ymm7, ymm7, ymm11
1691        vprord  ymm4, ymm4, 12
1692        vprord  ymm5, ymm5, 12
1693        vprord  ymm6, ymm6, 12
1694        vprord  ymm7, ymm7, 12
1695        vpaddd  ymm0, ymm0, ymm29
1696        vpaddd  ymm1, ymm1, ymm27
1697        vpaddd  ymm2, ymm2, ymm26
1698        vpaddd  ymm3, ymm3, ymm24
1699        vpaddd  ymm0, ymm0, ymm4
1700        vpaddd  ymm1, ymm1, ymm5
1701        vpaddd  ymm2, ymm2, ymm6
1702        vpaddd  ymm3, ymm3, ymm7
1703        vpxord  ymm12, ymm12, ymm0
1704        vpxord  ymm13, ymm13, ymm1
1705        vpxord  ymm14, ymm14, ymm2
1706        vpxord  ymm15, ymm15, ymm3
1707        vprord  ymm12, ymm12, 8
1708        vprord  ymm13, ymm13, 8
1709        vprord  ymm14, ymm14, 8
1710        vprord  ymm15, ymm15, 8
1711        vpaddd  ymm8, ymm8, ymm12
1712        vpaddd  ymm9, ymm9, ymm13
1713        vpaddd  ymm10, ymm10, ymm14
1714        vpaddd  ymm11, ymm11, ymm15
1715        vpxord  ymm4, ymm4, ymm8
1716        vpxord  ymm5, ymm5, ymm9
1717        vpxord  ymm6, ymm6, ymm10
1718        vpxord  ymm7, ymm7, ymm11
1719        vprord  ymm4, ymm4, 7
1720        vprord  ymm5, ymm5, 7
1721        vprord  ymm6, ymm6, 7
1722        vprord  ymm7, ymm7, 7
1723        vpaddd  ymm0, ymm0, ymm23
1724        vpaddd  ymm1, ymm1, ymm21
1725        vpaddd  ymm2, ymm2, ymm16
1726        vpaddd  ymm3, ymm3, ymm22
1727        vpaddd  ymm0, ymm0, ymm5
1728        vpaddd  ymm1, ymm1, ymm6
1729        vpaddd  ymm2, ymm2, ymm7
1730        vpaddd  ymm3, ymm3, ymm4
1731        vpxord  ymm15, ymm15, ymm0
1732        vpxord  ymm12, ymm12, ymm1
1733        vpxord  ymm13, ymm13, ymm2
1734        vpxord  ymm14, ymm14, ymm3
1735        vprord  ymm15, ymm15, 16
1736        vprord  ymm12, ymm12, 16
1737        vprord  ymm13, ymm13, 16
1738        vprord  ymm14, ymm14, 16
1739        vpaddd  ymm10, ymm10, ymm15
1740        vpaddd  ymm11, ymm11, ymm12
1741        vpaddd  ymm8, ymm8, ymm13
1742        vpaddd  ymm9, ymm9, ymm14
1743        vpxord  ymm5, ymm5, ymm10
1744        vpxord  ymm6, ymm6, ymm11
1745        vpxord  ymm7, ymm7, ymm8
1746        vpxord  ymm4, ymm4, ymm9
1747        vprord  ymm5, ymm5, 12
1748        vprord  ymm6, ymm6, 12
1749        vprord  ymm7, ymm7, 12
1750        vprord  ymm4, ymm4, 12
1751        vpaddd  ymm0, ymm0, ymm18
1752        vpaddd  ymm1, ymm1, ymm19
1753        vpaddd  ymm2, ymm2, ymm17
1754        vpaddd  ymm3, ymm3, ymm20
1755        vpaddd  ymm0, ymm0, ymm5
1756        vpaddd  ymm1, ymm1, ymm6
1757        vpaddd  ymm2, ymm2, ymm7
1758        vpaddd  ymm3, ymm3, ymm4
1759        vpxord  ymm15, ymm15, ymm0
1760        vpxord  ymm12, ymm12, ymm1
1761        vpxord  ymm13, ymm13, ymm2
1762        vpxord  ymm14, ymm14, ymm3
1763        vprord  ymm15, ymm15, 8
1764        vprord  ymm12, ymm12, 8
1765        vprord  ymm13, ymm13, 8
1766        vprord  ymm14, ymm14, 8
1767        vpaddd  ymm10, ymm10, ymm15
1768        vpaddd  ymm11, ymm11, ymm12
1769        vpaddd  ymm8, ymm8, ymm13
1770        vpaddd  ymm9, ymm9, ymm14
1771        vpxord  ymm5, ymm5, ymm10
1772        vpxord  ymm6, ymm6, ymm11
1773        vpxord  ymm7, ymm7, ymm8
1774        vpxord  ymm4, ymm4, ymm9
1775        vprord  ymm5, ymm5, 7
1776        vprord  ymm6, ymm6, 7
1777        vprord  ymm7, ymm7, 7
1778        vprord  ymm4, ymm4, 7
1779        vpaddd  ymm0, ymm0, ymm25
1780        vpaddd  ymm1, ymm1, ymm27
1781        vpaddd  ymm2, ymm2, ymm24
1782        vpaddd  ymm3, ymm3, ymm31
1783        vpaddd  ymm0, ymm0, ymm4
1784        vpaddd  ymm1, ymm1, ymm5
1785        vpaddd  ymm2, ymm2, ymm6
1786        vpaddd  ymm3, ymm3, ymm7
1787        vpxord  ymm12, ymm12, ymm0
1788        vpxord  ymm13, ymm13, ymm1
1789        vpxord  ymm14, ymm14, ymm2
1790        vpxord  ymm15, ymm15, ymm3
1791        vprord  ymm12, ymm12, 16
1792        vprord  ymm13, ymm13, 16
1793        vprord  ymm14, ymm14, 16
1794        vprord  ymm15, ymm15, 16
1795        vpaddd  ymm8, ymm8, ymm12
1796        vpaddd  ymm9, ymm9, ymm13
1797        vpaddd  ymm10, ymm10, ymm14
1798        vpaddd  ymm11, ymm11, ymm15
1799        vpxord  ymm4, ymm4, ymm8
1800        vpxord  ymm5, ymm5, ymm9
1801        vpxord  ymm6, ymm6, ymm10
1802        vpxord  ymm7, ymm7, ymm11
1803        vprord  ymm4, ymm4, 12
1804        vprord  ymm5, ymm5, 12
1805        vprord  ymm6, ymm6, 12
1806        vprord  ymm7, ymm7, 12
1807        vpaddd  ymm0, ymm0, ymm30
1808        vpaddd  ymm1, ymm1, ymm21
1809        vpaddd  ymm2, ymm2, ymm28
1810        vpaddd  ymm3, ymm3, ymm17
1811        vpaddd  ymm0, ymm0, ymm4
1812        vpaddd  ymm1, ymm1, ymm5
1813        vpaddd  ymm2, ymm2, ymm6
1814        vpaddd  ymm3, ymm3, ymm7
1815        vpxord  ymm12, ymm12, ymm0
1816        vpxord  ymm13, ymm13, ymm1
1817        vpxord  ymm14, ymm14, ymm2
1818        vpxord  ymm15, ymm15, ymm3
1819        vprord  ymm12, ymm12, 8
1820        vprord  ymm13, ymm13, 8
1821        vprord  ymm14, ymm14, 8
1822        vprord  ymm15, ymm15, 8
1823        vpaddd  ymm8, ymm8, ymm12
1824        vpaddd  ymm9, ymm9, ymm13
1825        vpaddd  ymm10, ymm10, ymm14
1826        vpaddd  ymm11, ymm11, ymm15
1827        vpxord  ymm4, ymm4, ymm8
1828        vpxord  ymm5, ymm5, ymm9
1829        vpxord  ymm6, ymm6, ymm10
1830        vpxord  ymm7, ymm7, ymm11
1831        vprord  ymm4, ymm4, 7
1832        vprord  ymm5, ymm5, 7
1833        vprord  ymm6, ymm6, 7
1834        vprord  ymm7, ymm7, 7
1835        vpaddd  ymm0, ymm0, ymm29
1836        vpaddd  ymm1, ymm1, ymm16
1837        vpaddd  ymm2, ymm2, ymm18
1838        vpaddd  ymm3, ymm3, ymm20
1839        vpaddd  ymm0, ymm0, ymm5
1840        vpaddd  ymm1, ymm1, ymm6
1841        vpaddd  ymm2, ymm2, ymm7
1842        vpaddd  ymm3, ymm3, ymm4
1843        vpxord  ymm15, ymm15, ymm0
1844        vpxord  ymm12, ymm12, ymm1
1845        vpxord  ymm13, ymm13, ymm2
1846        vpxord  ymm14, ymm14, ymm3
1847        vprord  ymm15, ymm15, 16
1848        vprord  ymm12, ymm12, 16
1849        vprord  ymm13, ymm13, 16
1850        vprord  ymm14, ymm14, 16
1851        vpaddd  ymm10, ymm10, ymm15
1852        vpaddd  ymm11, ymm11, ymm12
1853        vpaddd  ymm8, ymm8, ymm13
1854        vpaddd  ymm9, ymm9, ymm14
1855        vpxord  ymm5, ymm5, ymm10
1856        vpxord  ymm6, ymm6, ymm11
1857        vpxord  ymm7, ymm7, ymm8
1858        vpxord  ymm4, ymm4, ymm9
1859        vprord  ymm5, ymm5, 12
1860        vprord  ymm6, ymm6, 12
1861        vprord  ymm7, ymm7, 12
1862        vprord  ymm4, ymm4, 12
1863        vpaddd  ymm0, ymm0, ymm19
1864        vpaddd  ymm1, ymm1, ymm26
1865        vpaddd  ymm2, ymm2, ymm22
1866        vpaddd  ymm3, ymm3, ymm23
1867        vpaddd  ymm0, ymm0, ymm5
1868        vpaddd  ymm1, ymm1, ymm6
1869        vpaddd  ymm2, ymm2, ymm7
1870        vpaddd  ymm3, ymm3, ymm4
1871        vpxord  ymm15, ymm15, ymm0
1872        vpxord  ymm12, ymm12, ymm1
1873        vpxord  ymm13, ymm13, ymm2
1874        vpxord  ymm14, ymm14, ymm3
1875        vprord  ymm15, ymm15, 8
1876        vprord  ymm12, ymm12, 8
1877        vprord  ymm13, ymm13, 8
1878        vprord  ymm14, ymm14, 8
1879        vpaddd  ymm10, ymm10, ymm15
1880        vpaddd  ymm11, ymm11, ymm12
1881        vpaddd  ymm8, ymm8, ymm13
1882        vpaddd  ymm9, ymm9, ymm14
1883        vpxord  ymm5, ymm5, ymm10
1884        vpxord  ymm6, ymm6, ymm11
1885        vpxord  ymm7, ymm7, ymm8
1886        vpxord  ymm4, ymm4, ymm9
1887        vprord  ymm5, ymm5, 7
1888        vprord  ymm6, ymm6, 7
1889        vprord  ymm7, ymm7, 7
1890        vprord  ymm4, ymm4, 7
1891        vpaddd  ymm0, ymm0, ymm27
1892        vpaddd  ymm1, ymm1, ymm21
1893        vpaddd  ymm2, ymm2, ymm17
1894        vpaddd  ymm3, ymm3, ymm24
1895        vpaddd  ymm0, ymm0, ymm4
1896        vpaddd  ymm1, ymm1, ymm5
1897        vpaddd  ymm2, ymm2, ymm6
1898        vpaddd  ymm3, ymm3, ymm7
1899        vpxord  ymm12, ymm12, ymm0
1900        vpxord  ymm13, ymm13, ymm1
1901        vpxord  ymm14, ymm14, ymm2
1902        vpxord  ymm15, ymm15, ymm3
1903        vprord  ymm12, ymm12, 16
1904        vprord  ymm13, ymm13, 16
1905        vprord  ymm14, ymm14, 16
1906        vprord  ymm15, ymm15, 16
1907        vpaddd  ymm8, ymm8, ymm12
1908        vpaddd  ymm9, ymm9, ymm13
1909        vpaddd  ymm10, ymm10, ymm14
1910        vpaddd  ymm11, ymm11, ymm15
1911        vpxord  ymm4, ymm4, ymm8
1912        vpxord  ymm5, ymm5, ymm9
1913        vpxord  ymm6, ymm6, ymm10
1914        vpxord  ymm7, ymm7, ymm11
1915        vprord  ymm4, ymm4, 12
1916        vprord  ymm5, ymm5, 12
1917        vprord  ymm6, ymm6, 12
1918        vprord  ymm7, ymm7, 12
1919        vpaddd  ymm0, ymm0, ymm31
1920        vpaddd  ymm1, ymm1, ymm16
1921        vpaddd  ymm2, ymm2, ymm25
1922        vpaddd  ymm3, ymm3, ymm22
1923        vpaddd  ymm0, ymm0, ymm4
1924        vpaddd  ymm1, ymm1, ymm5
1925        vpaddd  ymm2, ymm2, ymm6
1926        vpaddd  ymm3, ymm3, ymm7
1927        vpxord  ymm12, ymm12, ymm0
1928        vpxord  ymm13, ymm13, ymm1
1929        vpxord  ymm14, ymm14, ymm2
1930        vpxord  ymm15, ymm15, ymm3
1931        vprord  ymm12, ymm12, 8
1932        vprord  ymm13, ymm13, 8
1933        vprord  ymm14, ymm14, 8
1934        vprord  ymm15, ymm15, 8
1935        vpaddd  ymm8, ymm8, ymm12
1936        vpaddd  ymm9, ymm9, ymm13
1937        vpaddd  ymm10, ymm10, ymm14
1938        vpaddd  ymm11, ymm11, ymm15
1939        vpxord  ymm4, ymm4, ymm8
1940        vpxord  ymm5, ymm5, ymm9
1941        vpxord  ymm6, ymm6, ymm10
1942        vpxord  ymm7, ymm7, ymm11
1943        vprord  ymm4, ymm4, 7
1944        vprord  ymm5, ymm5, 7
1945        vprord  ymm6, ymm6, 7
1946        vprord  ymm7, ymm7, 7
1947        vpaddd  ymm0, ymm0, ymm30
1948        vpaddd  ymm1, ymm1, ymm18
1949        vpaddd  ymm2, ymm2, ymm19
1950        vpaddd  ymm3, ymm3, ymm23
1951        vpaddd  ymm0, ymm0, ymm5
1952        vpaddd  ymm1, ymm1, ymm6
1953        vpaddd  ymm2, ymm2, ymm7
1954        vpaddd  ymm3, ymm3, ymm4
1955        vpxord  ymm15, ymm15, ymm0
1956        vpxord  ymm12, ymm12, ymm1
1957        vpxord  ymm13, ymm13, ymm2
1958        vpxord  ymm14, ymm14, ymm3
1959        vprord  ymm15, ymm15, 16
1960        vprord  ymm12, ymm12, 16
1961        vprord  ymm13, ymm13, 16
1962        vprord  ymm14, ymm14, 16
1963        vpaddd  ymm10, ymm10, ymm15
1964        vpaddd  ymm11, ymm11, ymm12
1965        vpaddd  ymm8, ymm8, ymm13
1966        vpaddd  ymm9, ymm9, ymm14
1967        vpxord  ymm5, ymm5, ymm10
1968        vpxord  ymm6, ymm6, ymm11
1969        vpxord  ymm7, ymm7, ymm8
1970        vpxord  ymm4, ymm4, ymm9
1971        vprord  ymm5, ymm5, 12
1972        vprord  ymm6, ymm6, 12
1973        vprord  ymm7, ymm7, 12
1974        vprord  ymm4, ymm4, 12
1975        vpaddd  ymm0, ymm0, ymm26
1976        vpaddd  ymm1, ymm1, ymm28
1977        vpaddd  ymm2, ymm2, ymm20
1978        vpaddd  ymm3, ymm3, ymm29
1979        vpaddd  ymm0, ymm0, ymm5
1980        vpaddd  ymm1, ymm1, ymm6
1981        vpaddd  ymm2, ymm2, ymm7
1982        vpaddd  ymm3, ymm3, ymm4
1983        vpxord  ymm15, ymm15, ymm0
1984        vpxord  ymm12, ymm12, ymm1
1985        vpxord  ymm13, ymm13, ymm2
1986        vpxord  ymm14, ymm14, ymm3
1987        vprord  ymm15, ymm15, 8
1988        vprord  ymm12, ymm12, 8
1989        vprord  ymm13, ymm13, 8
1990        vprord  ymm14, ymm14, 8
1991        vpaddd  ymm10, ymm10, ymm15
1992        vpaddd  ymm11, ymm11, ymm12
1993        vpaddd  ymm8, ymm8, ymm13
1994        vpaddd  ymm9, ymm9, ymm14
1995        vpxord  ymm5, ymm5, ymm10
1996        vpxord  ymm6, ymm6, ymm11
1997        vpxord  ymm7, ymm7, ymm8
1998        vpxord  ymm4, ymm4, ymm9
1999        vprord  ymm5, ymm5, 7
2000        vprord  ymm6, ymm6, 7
2001        vprord  ymm7, ymm7, 7
2002        vprord  ymm4, ymm4, 7
2003        vpxor   ymm0, ymm0, ymm8
2004        vpxor   ymm1, ymm1, ymm9
2005        vpxor   ymm2, ymm2, ymm10
2006        vpxor   ymm3, ymm3, ymm11
2007        vpxor   ymm4, ymm4, ymm12
2008        vpxor   ymm5, ymm5, ymm13
2009        vpxor   ymm6, ymm6, ymm14
2010        vpxor   ymm7, ymm7, ymm15
2011        movzx   eax, byte ptr [rbp+78H]
2012        jne     innerloop8
2013        mov     rbx, qword ptr [rbp+90H]
2014        vunpcklps ymm8, ymm0, ymm1
2015        vunpcklps ymm9, ymm2, ymm3
2016        vunpckhps ymm10, ymm0, ymm1
2017        vunpcklps ymm11, ymm4, ymm5
2018        vunpcklps ymm0, ymm6, ymm7
2019        vshufps ymm12, ymm8, ymm9, 78
2020        vblendps ymm1, ymm8, ymm12, 0CCH
2021        vshufps ymm8, ymm11, ymm0, 78
2022        vunpckhps ymm13, ymm2, ymm3
2023        vblendps ymm2, ymm11, ymm8, 0CCH
2024        vblendps ymm3, ymm12, ymm9, 0CCH
2025        vperm2f128 ymm12, ymm1, ymm2, 20H
2026        vmovups ymmword ptr [rbx], ymm12
2027        vunpckhps ymm14, ymm4, ymm5
2028        vblendps ymm4, ymm8, ymm0, 0CCH
2029        vunpckhps ymm15, ymm6, ymm7
2030        vperm2f128 ymm7, ymm3, ymm4, 20H
2031        vmovups ymmword ptr [rbx+20H], ymm7
2032        vshufps ymm5, ymm10, ymm13, 78
2033        vblendps ymm6, ymm5, ymm13, 0CCH
2034        vshufps ymm13, ymm14, ymm15, 78
2035        vblendps ymm10, ymm10, ymm5, 0CCH
2036        vblendps ymm14, ymm14, ymm13, 0CCH
2037        vperm2f128 ymm8, ymm10, ymm14, 20H
2038        vmovups ymmword ptr [rbx+40H], ymm8
2039        vblendps ymm15, ymm13, ymm15, 0CCH
2040        vperm2f128 ymm13, ymm6, ymm15, 20H
2041        vmovups ymmword ptr [rbx+60H], ymm13
2042        vperm2f128 ymm9, ymm1, ymm2, 31H
2043        vperm2f128 ymm11, ymm3, ymm4, 31H
2044        vmovups ymmword ptr [rbx+80H], ymm9
2045        vperm2f128 ymm14, ymm10, ymm14, 31H
2046        vperm2f128 ymm15, ymm6, ymm15, 31H
2047        vmovups ymmword ptr [rbx+0A0H], ymm11
2048        vmovups ymmword ptr [rbx+0C0H], ymm14
2049        vmovups ymmword ptr [rbx+0E0H], ymm15
2050        vmovdqa ymm0, ymmword ptr [rsp]
2051        vmovdqa ymm2, ymmword ptr [rsp+40H]
2052        vmovdqa32 ymm0 {k1}, ymmword ptr [rsp+1H*20H]
2053        vmovdqa32 ymm2 {k1}, ymmword ptr [rsp+3H*20H]
2054        vmovdqa ymmword ptr [rsp], ymm0
2055        vmovdqa ymmword ptr [rsp+40H], ymm2
2056        add     rbx, 256
2057        mov     qword ptr [rbp+90H], rbx
2058        add     rdi, 64
2059        sub     rsi, 8
2060final7blocks:
2061        mov     rbx, qword ptr [rbp+90H]
2062        mov     r15, qword ptr [rsp+80H]
2063        movzx   r13, byte ptr [rbp+78H]
2064        movzx   r12, byte ptr [rbp+88H]
2065        test    esi, 4H
2066        je      final3blocks
2067        vbroadcasti32x4 zmm0, xmmword ptr [rcx]
2068        vbroadcasti32x4 zmm1, xmmword ptr [rcx+1H*10H]
2069        vmovdqa xmm12, xmmword ptr [rsp]
2070        vmovdqa xmm13, xmmword ptr [rsp+40H]
2071        vpunpckldq xmm14, xmm12, xmm13
2072        vpunpckhdq xmm15, xmm12, xmm13
2073        vpermq  ymm14, ymm14, 0DCH
2074        vpermq  ymm15, ymm15, 0DCH
2075        vpbroadcastd zmm12, dword ptr [BLAKE3_BLOCK_LEN]
2076        vinserti64x4 zmm13, zmm14, ymm15, 01H
2077        mov     eax, 17476
2078        kmovw   k2, eax
2079        vpblendmd zmm13 {k2}, zmm13, zmm12
2080        vbroadcasti32x4 zmm15, xmmword ptr [BLAKE3_IV]
2081        mov     r8, qword ptr [rdi]
2082        mov     r9, qword ptr [rdi+8H]
2083        mov     r10, qword ptr [rdi+10H]
2084        mov     r11, qword ptr [rdi+18H]
2085        mov     eax, 43690
2086        kmovw   k3, eax
2087        mov     eax, 34952
2088        kmovw   k4, eax
2089        movzx   eax, byte ptr [rbp+80H]
2090        or      eax, r13d
2091        xor     edx, edx
2092ALIGN   16
2093innerloop4:
2094        mov     r14d, eax
2095        or      eax, r12d
2096        add     rdx, 64
2097        cmp     rdx, r15
2098        cmovne  eax, r14d
2099        mov     dword ptr [rsp+88H], eax
2100        vmovdqa32 zmm2, zmm15
2101        vpbroadcastd zmm8, dword ptr [rsp+22H*4H]
2102        vpblendmd zmm3 {k4}, zmm13, zmm8
2103        vmovups zmm8, zmmword ptr [r8+rdx-1H*40H]
2104        vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-4H*10H], 01H
2105        vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-4H*10H], 02H
2106        vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-4H*10H], 03H
2107        vmovups zmm9, zmmword ptr [r8+rdx-30H]
2108        vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-3H*10H], 01H
2109        vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-3H*10H], 02H
2110        vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-3H*10H], 03H
2111        vshufps zmm4, zmm8, zmm9, 136
2112        vshufps zmm5, zmm8, zmm9, 221
2113        vmovups zmm8, zmmword ptr [r8+rdx-20H]
2114        vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-2H*10H], 01H
2115        vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-2H*10H], 02H
2116        vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-2H*10H], 03H
2117        vmovups zmm9, zmmword ptr [r8+rdx-10H]
2118        vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-1H*10H], 01H
2119        vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-1H*10H], 02H
2120        vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-1H*10H], 03H
2121        vshufps zmm6, zmm8, zmm9, 136
2122        vshufps zmm7, zmm8, zmm9, 221
2123        vpshufd zmm6, zmm6, 93H
2124        vpshufd zmm7, zmm7, 93H
2125        mov     al, 7
2126roundloop4:
2127        vpaddd  zmm0, zmm0, zmm4
2128        vpaddd  zmm0, zmm0, zmm1
2129        vpxord  zmm3, zmm3, zmm0
2130        vprord  zmm3, zmm3, 16
2131        vpaddd  zmm2, zmm2, zmm3
2132        vpxord  zmm1, zmm1, zmm2
2133        vprord  zmm1, zmm1, 12
2134        vpaddd  zmm0, zmm0, zmm5
2135        vpaddd  zmm0, zmm0, zmm1
2136        vpxord  zmm3, zmm3, zmm0
2137        vprord  zmm3, zmm3, 8
2138        vpaddd  zmm2, zmm2, zmm3
2139        vpxord  zmm1, zmm1, zmm2
2140        vprord  zmm1, zmm1, 7
2141        vpshufd zmm0, zmm0, 93H
2142        vpshufd zmm3, zmm3, 4EH
2143        vpshufd zmm2, zmm2, 39H
2144        vpaddd  zmm0, zmm0, zmm6
2145        vpaddd  zmm0, zmm0, zmm1
2146        vpxord  zmm3, zmm3, zmm0
2147        vprord  zmm3, zmm3, 16
2148        vpaddd  zmm2, zmm2, zmm3
2149        vpxord  zmm1, zmm1, zmm2
2150        vprord  zmm1, zmm1, 12
2151        vpaddd  zmm0, zmm0, zmm7
2152        vpaddd  zmm0, zmm0, zmm1
2153        vpxord  zmm3, zmm3, zmm0
2154        vprord  zmm3, zmm3, 8
2155        vpaddd  zmm2, zmm2, zmm3
2156        vpxord  zmm1, zmm1, zmm2
2157        vprord  zmm1, zmm1, 7
2158        vpshufd zmm0, zmm0, 39H
2159        vpshufd zmm3, zmm3, 4EH
2160        vpshufd zmm2, zmm2, 93H
2161        dec     al
2162        jz      endroundloop4
2163        vshufps zmm8, zmm4, zmm5, 214
2164        vpshufd zmm9, zmm4, 0FH
2165        vpshufd zmm4, zmm8, 39H
2166        vshufps zmm8, zmm6, zmm7, 250
2167        vpblendmd zmm9 {k3}, zmm9, zmm8
2168        vpunpcklqdq zmm8, zmm7, zmm5
2169        vpblendmd zmm8 {k4}, zmm8, zmm6
2170        vpshufd zmm8, zmm8, 78H
2171        vpunpckhdq zmm5, zmm5, zmm7
2172        vpunpckldq zmm6, zmm6, zmm5
2173        vpshufd zmm7, zmm6, 1EH
2174        vmovdqa32 zmm5, zmm9
2175        vmovdqa32 zmm6, zmm8
2176        jmp     roundloop4
2177endroundloop4:
2178        vpxord  zmm0, zmm0, zmm2
2179        vpxord  zmm1, zmm1, zmm3
2180        mov     eax, r13d
2181        cmp     rdx, r15
2182        jne     innerloop4
2183        vmovdqu xmmword ptr [rbx], xmm0
2184        vmovdqu xmmword ptr [rbx+10H], xmm1
2185        vextracti128 xmmword ptr [rbx+20H], ymm0, 01H
2186        vextracti128 xmmword ptr [rbx+30H], ymm1, 01H
2187        vextracti32x4 xmmword ptr [rbx+4H*10H], zmm0, 02H
2188        vextracti32x4 xmmword ptr [rbx+5H*10H], zmm1, 02H
2189        vextracti32x4 xmmword ptr [rbx+6H*10H], zmm0, 03H
2190        vextracti32x4 xmmword ptr [rbx+7H*10H], zmm1, 03H
2191        vmovdqa xmm0, xmmword ptr [rsp]
2192        vmovdqa xmm2, xmmword ptr [rsp+40H]
2193        vmovdqa32 xmm0 {k1}, xmmword ptr [rsp+1H*10H]
2194        vmovdqa32 xmm2 {k1}, xmmword ptr [rsp+5H*10H]
2195        vmovdqa xmmword ptr [rsp], xmm0
2196        vmovdqa xmmword ptr [rsp+40H], xmm2
2197        add     rbx, 128
2198        add     rdi, 32
2199        sub     rsi, 4
2200final3blocks:
2201        test    esi, 2H
2202        je      final1block
2203        vbroadcasti128 ymm0, xmmword ptr [rcx]
2204        vbroadcasti128 ymm1, xmmword ptr [rcx+10H]
2205        vmovd   xmm13, dword ptr [rsp]
2206        vpinsrd xmm13, xmm13, dword ptr [rsp+40H], 1
2207        vpinsrd xmm13, xmm13, dword ptr [BLAKE3_BLOCK_LEN], 2
2208        vmovd   xmm14, dword ptr [rsp+4H]
2209        vpinsrd xmm14, xmm14, dword ptr [rsp+44H], 1
2210        vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2
2211        vinserti128 ymm13, ymm13, xmm14, 01H
2212        mov     r8, qword ptr [rdi]
2213        mov     r9, qword ptr [rdi+8H]
2214        movzx   eax, byte ptr [rbp+80H]
2215        or      eax, r13d
2216        xor     edx, edx
2217ALIGN   16
2218innerloop2:
2219        mov     r14d, eax
2220        or      eax, r12d
2221        add     rdx, 64
2222        cmp     rdx, r15
2223        cmovne  eax, r14d
2224        mov     dword ptr [rsp+88H], eax
2225        vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV]
2226        vpbroadcastd ymm8, dword ptr [rsp+88H]
2227        vpblendd ymm3, ymm13, ymm8, 88H
2228        vmovups ymm8, ymmword ptr [r8+rdx-40H]
2229        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-40H], 01H
2230        vmovups ymm9, ymmword ptr [r8+rdx-30H]
2231        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-30H], 01H
2232        vshufps ymm4, ymm8, ymm9, 136
2233        vshufps ymm5, ymm8, ymm9, 221
2234        vmovups ymm8, ymmword ptr [r8+rdx-20H]
2235        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-20H], 01H
2236        vmovups ymm9, ymmword ptr [r8+rdx-10H]
2237        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-10H], 01H
2238        vshufps ymm6, ymm8, ymm9, 136
2239        vshufps ymm7, ymm8, ymm9, 221
2240        vpshufd ymm6, ymm6, 93H
2241        vpshufd ymm7, ymm7, 93H
2242        mov     al, 7
2243roundloop2:
2244        vpaddd  ymm0, ymm0, ymm4
2245        vpaddd  ymm0, ymm0, ymm1
2246        vpxord  ymm3, ymm3, ymm0
2247        vprord  ymm3, ymm3, 16
2248        vpaddd  ymm2, ymm2, ymm3
2249        vpxord  ymm1, ymm1, ymm2
2250        vprord  ymm1, ymm1, 12
2251        vpaddd  ymm0, ymm0, ymm5
2252        vpaddd  ymm0, ymm0, ymm1
2253        vpxord  ymm3, ymm3, ymm0
2254        vprord  ymm3, ymm3, 8
2255        vpaddd  ymm2, ymm2, ymm3
2256        vpxord  ymm1, ymm1, ymm2
2257        vprord  ymm1, ymm1, 7
2258        vpshufd ymm0, ymm0, 93H
2259        vpshufd ymm3, ymm3, 4EH
2260        vpshufd ymm2, ymm2, 39H
2261        vpaddd  ymm0, ymm0, ymm6
2262        vpaddd  ymm0, ymm0, ymm1
2263        vpxord  ymm3, ymm3, ymm0
2264        vprord  ymm3, ymm3, 16
2265        vpaddd  ymm2, ymm2, ymm3
2266        vpxord  ymm1, ymm1, ymm2
2267        vprord  ymm1, ymm1, 12
2268        vpaddd  ymm0, ymm0, ymm7
2269        vpaddd  ymm0, ymm0, ymm1
2270        vpxord  ymm3, ymm3, ymm0
2271        vprord  ymm3, ymm3, 8
2272        vpaddd  ymm2, ymm2, ymm3
2273        vpxord  ymm1, ymm1, ymm2
2274        vprord  ymm1, ymm1, 7
2275        vpshufd ymm0, ymm0, 39H
2276        vpshufd ymm3, ymm3, 4EH
2277        vpshufd ymm2, ymm2, 93H
2278        dec     al
2279        jz      endroundloop2
2280        vshufps ymm8, ymm4, ymm5, 214
2281        vpshufd ymm9, ymm4, 0FH
2282        vpshufd ymm4, ymm8, 39H
2283        vshufps ymm8, ymm6, ymm7, 250
2284        vpblendd ymm9, ymm9, ymm8, 0AAH
2285        vpunpcklqdq ymm8, ymm7, ymm5
2286        vpblendd ymm8, ymm8, ymm6, 88H
2287        vpshufd ymm8, ymm8, 78H
2288        vpunpckhdq ymm5, ymm5, ymm7
2289        vpunpckldq ymm6, ymm6, ymm5
2290        vpshufd ymm7, ymm6, 1EH
2291        vmovdqa ymm5, ymm9
2292        vmovdqa ymm6, ymm8
2293        jmp     roundloop2
2294endroundloop2:
2295        vpxor   ymm0, ymm0, ymm2
2296        vpxor   ymm1, ymm1, ymm3
2297        mov     eax, r13d
2298        cmp     rdx, r15
2299        jne     innerloop2
2300        vmovdqu xmmword ptr [rbx], xmm0
2301        vmovdqu xmmword ptr [rbx+10H], xmm1
2302        vextracti128 xmmword ptr [rbx+20H], ymm0, 01H
2303        vextracti128 xmmword ptr [rbx+30H], ymm1, 01H
2304        vmovdqa xmm0, xmmword ptr [rsp]
2305        vmovdqa xmm2, xmmword ptr [rsp+40H]
2306        vmovdqu32 xmm0 {k1}, xmmword ptr [rsp+8H]
2307        vmovdqu32 xmm2 {k1}, xmmword ptr [rsp+48H]
2308        vmovdqa xmmword ptr [rsp], xmm0
2309        vmovdqa xmmword ptr [rsp+40H], xmm2
2310        add     rbx, 64
2311        add     rdi, 16
2312        sub     rsi, 2
2313final1block:
2314        test    esi, 1H
2315        je      unwind
2316        vmovdqu xmm0, xmmword ptr [rcx]
2317        vmovdqu xmm1, xmmword ptr [rcx+10H]
2318        vmovd   xmm14, dword ptr [rsp]
2319        vpinsrd xmm14, xmm14, dword ptr [rsp+40H], 1
2320        vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2
2321        vmovdqa xmm15, xmmword ptr [BLAKE3_IV]
2322        mov     r8, qword ptr [rdi]
2323        movzx   eax, byte ptr [rbp+80H]
2324        or      eax, r13d
2325        xor     edx, edx
2326ALIGN   16
2327innerloop1:
2328        mov     r14d, eax
2329        or      eax, r12d
2330        add     rdx, 64
2331        cmp     rdx, r15
2332        cmovne  eax, r14d
2333        vpinsrd xmm3, xmm14, eax, 3
2334        vmovdqa xmm2, xmm15
2335        vmovups xmm8, xmmword ptr [r8+rdx-40H]
2336        vmovups xmm9, xmmword ptr [r8+rdx-30H]
2337        vshufps xmm4, xmm8, xmm9, 136
2338        vshufps xmm5, xmm8, xmm9, 221
2339        vmovups xmm8, xmmword ptr [r8+rdx-20H]
2340        vmovups xmm9, xmmword ptr [r8+rdx-10H]
2341        vshufps xmm6, xmm8, xmm9, 136
2342        vshufps xmm7, xmm8, xmm9, 221
2343        vpshufd xmm6, xmm6, 93H
2344        vpshufd xmm7, xmm7, 93H
2345        mov     al, 7
2346roundloop1:
2347        vpaddd  xmm0, xmm0, xmm4
2348        vpaddd  xmm0, xmm0, xmm1
2349        vpxord  xmm3, xmm3, xmm0
2350        vprord  xmm3, xmm3, 16
2351        vpaddd  xmm2, xmm2, xmm3
2352        vpxord  xmm1, xmm1, xmm2
2353        vprord  xmm1, xmm1, 12
2354        vpaddd  xmm0, xmm0, xmm5
2355        vpaddd  xmm0, xmm0, xmm1
2356        vpxord  xmm3, xmm3, xmm0
2357        vprord  xmm3, xmm3, 8
2358        vpaddd  xmm2, xmm2, xmm3
2359        vpxord  xmm1, xmm1, xmm2
2360        vprord  xmm1, xmm1, 7
2361        vpshufd xmm0, xmm0, 93H
2362        vpshufd xmm3, xmm3, 4EH
2363        vpshufd xmm2, xmm2, 39H
2364        vpaddd  xmm0, xmm0, xmm6
2365        vpaddd  xmm0, xmm0, xmm1
2366        vpxord  xmm3, xmm3, xmm0
2367        vprord  xmm3, xmm3, 16
2368        vpaddd  xmm2, xmm2, xmm3
2369        vpxord  xmm1, xmm1, xmm2
2370        vprord  xmm1, xmm1, 12
2371        vpaddd  xmm0, xmm0, xmm7
2372        vpaddd  xmm0, xmm0, xmm1
2373        vpxord  xmm3, xmm3, xmm0
2374        vprord  xmm3, xmm3, 8
2375        vpaddd  xmm2, xmm2, xmm3
2376        vpxord  xmm1, xmm1, xmm2
2377        vprord  xmm1, xmm1, 7
2378        vpshufd xmm0, xmm0, 39H
2379        vpshufd xmm3, xmm3, 4EH
2380        vpshufd xmm2, xmm2, 93H
2381        dec     al
2382        jz      endroundloop1
2383        vshufps xmm8, xmm4, xmm5, 214
2384        vpshufd xmm9, xmm4, 0FH
2385        vpshufd xmm4, xmm8, 39H
2386        vshufps xmm8, xmm6, xmm7, 250
2387        vpblendd xmm9, xmm9, xmm8, 0AAH
2388        vpunpcklqdq xmm8, xmm7, xmm5
2389        vpblendd xmm8, xmm8, xmm6, 88H
2390        vpshufd xmm8, xmm8, 78H
2391        vpunpckhdq xmm5, xmm5, xmm7
2392        vpunpckldq xmm6, xmm6, xmm5
2393        vpshufd xmm7, xmm6, 1EH
2394        vmovdqa xmm5, xmm9
2395        vmovdqa xmm6, xmm8
2396        jmp     roundloop1
2397endroundloop1:
2398        vpxor   xmm0, xmm0, xmm2
2399        vpxor   xmm1, xmm1, xmm3
2400        mov     eax, r13d
2401        cmp     rdx, r15
2402        jne     innerloop1
2403        vmovdqu xmmword ptr [rbx], xmm0
2404        vmovdqu xmmword ptr [rbx+10H], xmm1
2405        jmp     unwind
2406
2407_llvm_blake3_hash_many_avx512 ENDP
2408llvm_blake3_hash_many_avx512 ENDP
2409
2410ALIGN 16
2411llvm_blake3_compress_in_place_avx512 PROC
2412_llvm_blake3_compress_in_place_avx512 PROC
2413        sub     rsp, 72
2414        vmovdqa xmmword ptr [rsp], xmm6
2415        vmovdqa xmmword ptr [rsp+10H], xmm7
2416        vmovdqa xmmword ptr [rsp+20H], xmm8
2417        vmovdqa xmmword ptr [rsp+30H], xmm9
2418        vmovdqu xmm0, xmmword ptr [rcx]
2419        vmovdqu xmm1, xmmword ptr [rcx+10H]
2420        movzx   eax, byte ptr [rsp+70H]
2421        movzx   r8d, r8b
2422        shl     rax, 32
2423        add     r8, rax
2424        vmovq   xmm3, r9
2425        vmovq   xmm4, r8
2426        vpunpcklqdq xmm3, xmm3, xmm4
2427        vmovaps xmm2, xmmword ptr [BLAKE3_IV]
2428        vmovups xmm8, xmmword ptr [rdx]
2429        vmovups xmm9, xmmword ptr [rdx+10H]
2430        vshufps xmm4, xmm8, xmm9, 136
2431        vshufps xmm5, xmm8, xmm9, 221
2432        vmovups xmm8, xmmword ptr [rdx+20H]
2433        vmovups xmm9, xmmword ptr [rdx+30H]
2434        vshufps xmm6, xmm8, xmm9, 136
2435        vshufps xmm7, xmm8, xmm9, 221
2436        vpshufd xmm6, xmm6, 93H
2437        vpshufd xmm7, xmm7, 93H
2438        mov     al, 7
2439@@:
2440        vpaddd  xmm0, xmm0, xmm4
2441        vpaddd  xmm0, xmm0, xmm1
2442        vpxord  xmm3, xmm3, xmm0
2443        vprord  xmm3, xmm3, 16
2444        vpaddd  xmm2, xmm2, xmm3
2445        vpxord  xmm1, xmm1, xmm2
2446        vprord  xmm1, xmm1, 12
2447        vpaddd  xmm0, xmm0, xmm5
2448        vpaddd  xmm0, xmm0, xmm1
2449        vpxord  xmm3, xmm3, xmm0
2450        vprord  xmm3, xmm3, 8
2451        vpaddd  xmm2, xmm2, xmm3
2452        vpxord  xmm1, xmm1, xmm2
2453        vprord  xmm1, xmm1, 7
2454        vpshufd xmm0, xmm0, 93H
2455        vpshufd xmm3, xmm3, 4EH
2456        vpshufd xmm2, xmm2, 39H
2457        vpaddd  xmm0, xmm0, xmm6
2458        vpaddd  xmm0, xmm0, xmm1
2459        vpxord  xmm3, xmm3, xmm0
2460        vprord  xmm3, xmm3, 16
2461        vpaddd  xmm2, xmm2, xmm3
2462        vpxord  xmm1, xmm1, xmm2
2463        vprord  xmm1, xmm1, 12
2464        vpaddd  xmm0, xmm0, xmm7
2465        vpaddd  xmm0, xmm0, xmm1
2466        vpxord  xmm3, xmm3, xmm0
2467        vprord  xmm3, xmm3, 8
2468        vpaddd  xmm2, xmm2, xmm3
2469        vpxord  xmm1, xmm1, xmm2
2470        vprord  xmm1, xmm1, 7
2471        vpshufd xmm0, xmm0, 39H
2472        vpshufd xmm3, xmm3, 4EH
2473        vpshufd xmm2, xmm2, 93H
2474        dec     al
2475        jz      @F
2476        vshufps xmm8, xmm4, xmm5, 214
2477        vpshufd xmm9, xmm4, 0FH
2478        vpshufd xmm4, xmm8, 39H
2479        vshufps xmm8, xmm6, xmm7, 250
2480        vpblendd xmm9, xmm9, xmm8, 0AAH
2481        vpunpcklqdq xmm8, xmm7, xmm5
2482        vpblendd xmm8, xmm8, xmm6, 88H
2483        vpshufd xmm8, xmm8, 78H
2484        vpunpckhdq xmm5, xmm5, xmm7
2485        vpunpckldq xmm6, xmm6, xmm5
2486        vpshufd xmm7, xmm6, 1EH
2487        vmovdqa xmm5, xmm9
2488        vmovdqa xmm6, xmm8
2489        jmp     @B
2490@@:
2491        vpxor   xmm0, xmm0, xmm2
2492        vpxor   xmm1, xmm1, xmm3
2493        vmovdqu xmmword ptr [rcx], xmm0
2494        vmovdqu xmmword ptr [rcx+10H], xmm1
2495        vmovdqa xmm6, xmmword ptr [rsp]
2496        vmovdqa xmm7, xmmword ptr [rsp+10H]
2497        vmovdqa xmm8, xmmword ptr [rsp+20H]
2498        vmovdqa xmm9, xmmword ptr [rsp+30H]
2499        add     rsp, 72
2500        ret
2501_llvm_blake3_compress_in_place_avx512 ENDP
2502llvm_blake3_compress_in_place_avx512 ENDP
2503
2504ALIGN 16
2505llvm_blake3_compress_xof_avx512 PROC
2506_llvm_blake3_compress_xof_avx512 PROC
2507        sub     rsp, 72
2508        vmovdqa xmmword ptr [rsp], xmm6
2509        vmovdqa xmmword ptr [rsp+10H], xmm7
2510        vmovdqa xmmword ptr [rsp+20H], xmm8
2511        vmovdqa xmmword ptr [rsp+30H], xmm9
2512        vmovdqu xmm0, xmmword ptr [rcx]
2513        vmovdqu xmm1, xmmword ptr [rcx+10H]
2514        movzx   eax, byte ptr [rsp+70H]
2515        movzx   r8d, r8b
2516        mov     r10, qword ptr [rsp+78H]
2517        shl     rax, 32
2518        add     r8, rax
2519        vmovq   xmm3, r9
2520        vmovq   xmm4, r8
2521        vpunpcklqdq xmm3, xmm3, xmm4
2522        vmovaps xmm2, xmmword ptr [BLAKE3_IV]
2523        vmovups xmm8, xmmword ptr [rdx]
2524        vmovups xmm9, xmmword ptr [rdx+10H]
2525        vshufps xmm4, xmm8, xmm9, 136
2526        vshufps xmm5, xmm8, xmm9, 221
2527        vmovups xmm8, xmmword ptr [rdx+20H]
2528        vmovups xmm9, xmmword ptr [rdx+30H]
2529        vshufps xmm6, xmm8, xmm9, 136
2530        vshufps xmm7, xmm8, xmm9, 221
2531        vpshufd xmm6, xmm6, 93H
2532        vpshufd xmm7, xmm7, 93H
2533        mov     al, 7
2534@@:
2535        vpaddd  xmm0, xmm0, xmm4
2536        vpaddd  xmm0, xmm0, xmm1
2537        vpxord  xmm3, xmm3, xmm0
2538        vprord  xmm3, xmm3, 16
2539        vpaddd  xmm2, xmm2, xmm3
2540        vpxord  xmm1, xmm1, xmm2
2541        vprord  xmm1, xmm1, 12
2542        vpaddd  xmm0, xmm0, xmm5
2543        vpaddd  xmm0, xmm0, xmm1
2544        vpxord  xmm3, xmm3, xmm0
2545        vprord  xmm3, xmm3, 8
2546        vpaddd  xmm2, xmm2, xmm3
2547        vpxord  xmm1, xmm1, xmm2
2548        vprord  xmm1, xmm1, 7
2549        vpshufd xmm0, xmm0, 93H
2550        vpshufd xmm3, xmm3, 4EH
2551        vpshufd xmm2, xmm2, 39H
2552        vpaddd  xmm0, xmm0, xmm6
2553        vpaddd  xmm0, xmm0, xmm1
2554        vpxord  xmm3, xmm3, xmm0
2555        vprord  xmm3, xmm3, 16
2556        vpaddd  xmm2, xmm2, xmm3
2557        vpxord  xmm1, xmm1, xmm2
2558        vprord  xmm1, xmm1, 12
2559        vpaddd  xmm0, xmm0, xmm7
2560        vpaddd  xmm0, xmm0, xmm1
2561        vpxord  xmm3, xmm3, xmm0
2562        vprord  xmm3, xmm3, 8
2563        vpaddd  xmm2, xmm2, xmm3
2564        vpxord  xmm1, xmm1, xmm2
2565        vprord  xmm1, xmm1, 7
2566        vpshufd xmm0, xmm0, 39H
2567        vpshufd xmm3, xmm3, 4EH
2568        vpshufd xmm2, xmm2, 93H
2569        dec     al
2570        jz      @F
2571        vshufps xmm8, xmm4, xmm5, 214
2572        vpshufd xmm9, xmm4, 0FH
2573        vpshufd xmm4, xmm8, 39H
2574        vshufps xmm8, xmm6, xmm7, 250
2575        vpblendd xmm9, xmm9, xmm8, 0AAH
2576        vpunpcklqdq xmm8, xmm7, xmm5
2577        vpblendd xmm8, xmm8, xmm6, 88H
2578        vpshufd xmm8, xmm8, 78H
2579        vpunpckhdq xmm5, xmm5, xmm7
2580        vpunpckldq xmm6, xmm6, xmm5
2581        vpshufd xmm7, xmm6, 1EH
2582        vmovdqa xmm5, xmm9
2583        vmovdqa xmm6, xmm8
2584        jmp     @B
2585@@:
2586        vpxor   xmm0, xmm0, xmm2
2587        vpxor   xmm1, xmm1, xmm3
2588        vpxor   xmm2, xmm2, xmmword ptr [rcx]
2589        vpxor   xmm3, xmm3, xmmword ptr [rcx+10H]
2590        vmovdqu xmmword ptr [r10], xmm0
2591        vmovdqu xmmword ptr [r10+10H], xmm1
2592        vmovdqu xmmword ptr [r10+20H], xmm2
2593        vmovdqu xmmword ptr [r10+30H], xmm3
2594        vmovdqa xmm6, xmmword ptr [rsp]
2595        vmovdqa xmm7, xmmword ptr [rsp+10H]
2596        vmovdqa xmm8, xmmword ptr [rsp+20H]
2597        vmovdqa xmm9, xmmword ptr [rsp+30H]
2598        add     rsp, 72
2599        ret
2600_llvm_blake3_compress_xof_avx512 ENDP
2601llvm_blake3_compress_xof_avx512 ENDP
2602
2603_TEXT ENDS
2604
2605_RDATA SEGMENT READONLY PAGE ALIAS(".rdata") 'CONST'
2606ALIGN   64
2607INDEX0:
2608        dd    0,  1,  2,  3, 16, 17, 18, 19
2609        dd    8,  9, 10, 11, 24, 25, 26, 27
2610INDEX1:
2611        dd    4,  5,  6,  7, 20, 21, 22, 23
2612        dd   12, 13, 14, 15, 28, 29, 30, 31
2613ADD0:
2614        dd    0,  1,  2,  3,  4,  5,  6,  7
2615        dd    8,  9, 10, 11, 12, 13, 14, 15
2616ADD1:   
2617        dd    1
2618ADD16:  
2619        dd   16
2620BLAKE3_BLOCK_LEN:
2621        dd   64
2622ALIGN   64
2623BLAKE3_IV:
2624BLAKE3_IV_0:
2625        dd   06A09E667H
2626BLAKE3_IV_1:
2627        dd   0BB67AE85H
2628BLAKE3_IV_2:
2629        dd   03C6EF372H
2630BLAKE3_IV_3:
2631        dd   0A54FF53AH
2632
2633_RDATA ENDS
2634END
2635