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