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