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