]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
bump: Upgrade to blake3 1.6.1
authorJoel Rosdahl <joel@rosdahl.net>
Thu, 27 Feb 2025 19:47:07 +0000 (20:47 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Thu, 27 Feb 2025 19:57:57 +0000 (20:57 +0100)
LICENSE.adoc
src/third_party/blake3/CMakeLists.txt
src/third_party/blake3/blake3/blake3.c
src/third_party/blake3/blake3/blake3.h
src/third_party/blake3/blake3/blake3_avx512.c
src/third_party/blake3/blake3/blake3_avx512_x86-64_unix.S
src/third_party/blake3/blake3/blake3_dispatch.c
src/third_party/blake3/blake3/blake3_impl.h
src/third_party/blake3/blake3/blake3_neon.c

index 5c90db177e65e6e1bfd5ad23395cfae3358ec598..020a69c4426181f55632c6be2e8ad1f9e5a5c682 100644 (file)
@@ -50,7 +50,7 @@ under less restrictive terms.
 
 === src/third_party/blake3/blake3/*
 
-This is a subset of https://github.com/BLAKE3-team/BLAKE3[BLAKE3] 1.5.1 with the
+This is a subset of https://github.com/BLAKE3-team/BLAKE3[BLAKE3] 1.6.1 with the
 following license:
 
 ----
index 0f69337d8cb92d9838104e292b809aaa0f584f43..6cff8006589ef02922a076b5b677512b7b994de8 100644 (file)
@@ -1,4 +1,4 @@
-register_dependency(Blake3 BUNDLED 1.5.1)
+register_dependency(Blake3 BUNDLED 1.6.1)
 
 add_library(
   dep_blake3 STATIC
index 1b44c7193457aeec7138a065261eb91341589f98..7e6d01ec5cbac1a6043fea7aab6df5daf0ffdfb1 100644 (file)
@@ -88,24 +88,30 @@ INLINE void output_chaining_value(const output_t *self, uint8_t cv[32]) {
 
 INLINE void output_root_bytes(const output_t *self, uint64_t seek, uint8_t *out,
                               size_t out_len) {
+  if (out_len == 0) {
+      return;
+  }
   uint64_t output_block_counter = seek / 64;
   size_t offset_within_block = seek % 64;
   uint8_t wide_buf[64];
-  while (out_len > 0) {
-    blake3_compress_xof(self->input_cv, self->block, self->block_len,
-                        output_block_counter, self->flags | ROOT, wide_buf);
-    size_t available_bytes = 64 - offset_within_block;
-    size_t memcpy_len;
-    if (out_len > available_bytes) {
-      memcpy_len = available_bytes;
-    } else {
-      memcpy_len = out_len;
-    }
-    memcpy(out, wide_buf + offset_within_block, memcpy_len);
-    out += memcpy_len;
-    out_len -= memcpy_len;
+  if(offset_within_block) {
+    blake3_compress_xof(self->input_cv, self->block, self->block_len, output_block_counter, self->flags | ROOT, wide_buf);
+    const size_t available_bytes = 64 - offset_within_block;
+    const size_t bytes = out_len > available_bytes ? available_bytes : out_len;
+    memcpy(out, wide_buf + offset_within_block, bytes);
+    out += bytes;
+    out_len -= bytes;
     output_block_counter += 1;
-    offset_within_block = 0;
+  }
+  if(out_len / 64) {
+    blake3_xof_many(self->input_cv, self->block, self->block_len, output_block_counter, self->flags | ROOT, out, out_len / 64);
+  }
+  output_block_counter += out_len / 64;
+  out += out_len & -64;
+  out_len -= out_len & -64;
+  if(out_len) {
+    blake3_compress_xof(self->input_cv, self->block, self->block_len, output_block_counter, self->flags | ROOT, wide_buf);
+    memcpy(out, wide_buf, out_len);
   }
 }
 
@@ -134,9 +140,7 @@ INLINE void chunk_state_update(blake3_chunk_state *self, const uint8_t *input,
     input_len -= BLAKE3_BLOCK_LEN;
   }
 
-  size_t take = chunk_state_fill_buf(self, input, input_len);
-  input += take;
-  input_len -= take;
+  chunk_state_fill_buf(self, input, input_len);
 }
 
 INLINE output_t chunk_state_output(const blake3_chunk_state *self) {
@@ -430,7 +434,7 @@ INLINE void hasher_merge_cv_stack(blake3_hasher *self, uint64_t total_len) {
 //    of the whole tree, and it would need to be ROOT finalized. We can't
 //    compress it until we know.
 // 2) This 64 KiB input might complete a larger tree, whose root node is
-//    similarly going to be the the root of the whole tree. For example, maybe
+//    similarly going to be the root of the whole tree. For example, maybe
 //    we have 196 KiB (that is, 128 + 64) hashed so far. We can't compress the
 //    node at the root of the 256 KiB subtree until we know how to finalize it.
 //
index 48284e50891147a94c4a5bbc4a01ddf2a39af3cf..d917503ef94a82ef13b5cbe5c162445dfe73c38e 100644 (file)
@@ -30,7 +30,7 @@
 extern "C" {
 #endif
 
-#define BLAKE3_VERSION_STRING "1.5.1"
+#define BLAKE3_VERSION_STRING "1.6.1"
 #define BLAKE3_KEY_LEN 32
 #define BLAKE3_OUT_LEN 32
 #define BLAKE3_BLOCK_LEN 64
index d6b1ae9b18314ba3395f61023e131271318e9723..f88a32d312b106ee975336751367bbd6cba4ce5c 100644 (file)
@@ -7,23 +7,27 @@
       _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), (c))))
 
 INLINE __m128i loadu_128(const uint8_t src[16]) {
-  return _mm_loadu_si128((const __m128i *)src);
+  return _mm_loadu_si128((void*)src);
 }
 
 INLINE __m256i loadu_256(const uint8_t src[32]) {
-  return _mm256_loadu_si256((const __m256i *)src);
+  return _mm256_loadu_si256((void*)src);
 }
 
 INLINE __m512i loadu_512(const uint8_t src[64]) {
-  return _mm512_loadu_si512((const __m512i *)src);
+  return _mm512_loadu_si512((void*)src);
 }
 
 INLINE void storeu_128(__m128i src, uint8_t dest[16]) {
-  _mm_storeu_si128((__m128i *)dest, src);
+  _mm_storeu_si128((void*)dest, src);
 }
 
 INLINE void storeu_256(__m256i src, uint8_t dest[16]) {
-  _mm256_storeu_si256((__m256i *)dest, src);
+  _mm256_storeu_si256((void*)dest, src);
+}
+
+INLINE void storeu_512(__m512i src, uint8_t dest[16]) {
+  _mm512_storeu_si512((void*)dest, src);
 }
 
 INLINE __m128i add_128(__m128i a, __m128i b) { return _mm_add_epi32(a, b); }
@@ -550,6 +554,54 @@ void blake3_hash4_avx512(const uint8_t *const *inputs, size_t blocks,
   storeu_128(h_vecs[7], &out[7 * sizeof(__m128i)]);
 }
 
+static
+void blake3_xof4_avx512(const uint32_t cv[8],
+                        const uint8_t block[BLAKE3_BLOCK_LEN],
+                        uint8_t block_len, uint64_t counter, uint8_t flags,
+                        uint8_t out[4 * 64]) {
+  __m128i h_vecs[8] = {
+      set1_128(cv[0]), set1_128(cv[1]), set1_128(cv[2]), set1_128(cv[3]),
+      set1_128(cv[4]), set1_128(cv[5]), set1_128(cv[6]), set1_128(cv[7]),
+  };
+  uint32_t block_words[16];
+  load_block_words(block, block_words);
+  __m128i msg_vecs[16];
+  for (size_t i = 0; i < 16; i++) {
+      msg_vecs[i] = set1_128(block_words[i]);
+  }
+  __m128i counter_low_vec, counter_high_vec;
+  load_counters4(counter, true, &counter_low_vec, &counter_high_vec);
+  __m128i block_len_vec = set1_128(block_len);
+  __m128i block_flags_vec = set1_128(flags);
+  __m128i v[16] = {
+      h_vecs[0],       h_vecs[1],        h_vecs[2],       h_vecs[3],
+      h_vecs[4],       h_vecs[5],        h_vecs[6],       h_vecs[7],
+      set1_128(IV[0]), set1_128(IV[1]),  set1_128(IV[2]), set1_128(IV[3]),
+      counter_low_vec, counter_high_vec, block_len_vec,   block_flags_vec,
+  };
+  round_fn4(v, msg_vecs, 0);
+  round_fn4(v, msg_vecs, 1);
+  round_fn4(v, msg_vecs, 2);
+  round_fn4(v, msg_vecs, 3);
+  round_fn4(v, msg_vecs, 4);
+  round_fn4(v, msg_vecs, 5);
+  round_fn4(v, msg_vecs, 6);
+  for (size_t i = 0; i < 8; i++) {
+      v[i] = xor_128(v[i], v[i+8]);
+      v[i+8] = xor_128(v[i+8], h_vecs[i]);
+  }
+  transpose_vecs_128(&v[0]);
+  transpose_vecs_128(&v[4]);
+  transpose_vecs_128(&v[8]);
+  transpose_vecs_128(&v[12]);
+  for (size_t i = 0; i < 4; i++) {
+      storeu_128(v[i+ 0], &out[(4*i+0) * sizeof(__m128i)]);
+      storeu_128(v[i+ 4], &out[(4*i+1) * sizeof(__m128i)]);
+      storeu_128(v[i+ 8], &out[(4*i+2) * sizeof(__m128i)]);
+      storeu_128(v[i+12], &out[(4*i+3) * sizeof(__m128i)]);
+  }
+}
+
 /*
  * ----------------------------------------------------------------------------
  * hash8_avx512
@@ -802,6 +854,50 @@ void blake3_hash8_avx512(const uint8_t *const *inputs, size_t blocks,
   storeu_256(h_vecs[7], &out[7 * sizeof(__m256i)]);
 }
 
+static
+void blake3_xof8_avx512(const uint32_t cv[8],
+                        const uint8_t block[BLAKE3_BLOCK_LEN],
+                        uint8_t block_len, uint64_t counter, uint8_t flags,
+                        uint8_t out[8 * 64]) {
+  __m256i h_vecs[8] = {
+      set1_256(cv[0]), set1_256(cv[1]), set1_256(cv[2]), set1_256(cv[3]),
+      set1_256(cv[4]), set1_256(cv[5]), set1_256(cv[6]), set1_256(cv[7]),
+  };
+  uint32_t block_words[16];
+  load_block_words(block, block_words);
+  __m256i msg_vecs[16];
+  for (size_t i = 0; i < 16; i++) {
+      msg_vecs[i] = set1_256(block_words[i]);
+  }
+  __m256i counter_low_vec, counter_high_vec;
+  load_counters8(counter, true, &counter_low_vec, &counter_high_vec);
+  __m256i block_len_vec = set1_256(block_len);
+  __m256i block_flags_vec = set1_256(flags);
+  __m256i v[16] = {
+      h_vecs[0],       h_vecs[1],        h_vecs[2],       h_vecs[3],
+      h_vecs[4],       h_vecs[5],        h_vecs[6],       h_vecs[7],
+      set1_256(IV[0]), set1_256(IV[1]),  set1_256(IV[2]), set1_256(IV[3]),
+      counter_low_vec, counter_high_vec, block_len_vec,   block_flags_vec,
+  };
+  round_fn8(v, msg_vecs, 0);
+  round_fn8(v, msg_vecs, 1);
+  round_fn8(v, msg_vecs, 2);
+  round_fn8(v, msg_vecs, 3);
+  round_fn8(v, msg_vecs, 4);
+  round_fn8(v, msg_vecs, 5);
+  round_fn8(v, msg_vecs, 6);
+  for (size_t i = 0; i < 8; i++) {
+      v[i] = xor_256(v[i], v[i+8]);
+      v[i+8] = xor_256(v[i+8], h_vecs[i]);
+  }
+  transpose_vecs_256(&v[0]);
+  transpose_vecs_256(&v[8]);
+  for (size_t i = 0; i < 8; i++) {
+      storeu_256(v[i+0], &out[(2*i+0) * sizeof(__m256i)]);
+      storeu_256(v[i+8], &out[(2*i+1) * sizeof(__m256i)]);
+  }
+}
+
 /*
  * ----------------------------------------------------------------------------
  * hash16_avx512
@@ -1146,6 +1242,48 @@ void blake3_hash16_avx512(const uint8_t *const *inputs, size_t blocks,
   _mm256_mask_storeu_epi32(&out[15 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[15]));
 }
 
+static
+void blake3_xof16_avx512(const uint32_t cv[8],
+                        const uint8_t block[BLAKE3_BLOCK_LEN],
+                        uint8_t block_len, uint64_t counter, uint8_t flags,
+                        uint8_t out[16 * 64]) {
+  __m512i h_vecs[8] = {
+      set1_512(cv[0]), set1_512(cv[1]), set1_512(cv[2]), set1_512(cv[3]),
+      set1_512(cv[4]), set1_512(cv[5]), set1_512(cv[6]), set1_512(cv[7]),
+  };
+  uint32_t block_words[16];
+  load_block_words(block, block_words);
+  __m512i msg_vecs[16];
+  for (size_t i = 0; i < 16; i++) {
+      msg_vecs[i] = set1_512(block_words[i]);
+  }
+  __m512i counter_low_vec, counter_high_vec;
+  load_counters16(counter, true, &counter_low_vec, &counter_high_vec);
+  __m512i block_len_vec = set1_512(block_len);
+  __m512i block_flags_vec = set1_512(flags);
+  __m512i v[16] = {
+      h_vecs[0],       h_vecs[1],        h_vecs[2],       h_vecs[3],
+      h_vecs[4],       h_vecs[5],        h_vecs[6],       h_vecs[7],
+      set1_512(IV[0]), set1_512(IV[1]),  set1_512(IV[2]), set1_512(IV[3]),
+      counter_low_vec, counter_high_vec, block_len_vec,   block_flags_vec,
+  };
+  round_fn16(v, msg_vecs, 0);
+  round_fn16(v, msg_vecs, 1);
+  round_fn16(v, msg_vecs, 2);
+  round_fn16(v, msg_vecs, 3);
+  round_fn16(v, msg_vecs, 4);
+  round_fn16(v, msg_vecs, 5);
+  round_fn16(v, msg_vecs, 6);
+  for (size_t i = 0; i < 8; i++) {
+      v[i] = xor_512(v[i], v[i+8]);
+      v[i+8] = xor_512(v[i+8], h_vecs[i]);
+  }
+  transpose_vecs_512(&v[0]);
+  for (size_t i = 0; i < 16; i++) {
+      storeu_512(v[i], &out[i * sizeof(__m512i)]);
+  }
+}
+
 /*
  * ----------------------------------------------------------------------------
  * hash_many_avx512
@@ -1218,3 +1356,33 @@ void blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_inputs,
     out = &out[BLAKE3_OUT_LEN];
   }
 }
+
+void blake3_xof_many_avx512(const uint32_t cv[8],
+                            const uint8_t block[BLAKE3_BLOCK_LEN],
+                            uint8_t block_len, uint64_t counter, uint8_t flags,
+                            uint8_t* out, size_t outblocks) {
+  while (outblocks >= 16) {
+    blake3_xof16_avx512(cv, block, block_len, counter, flags, out);
+    counter += 16;
+    outblocks -= 16;
+    out += 16 * BLAKE3_BLOCK_LEN;
+  }
+  while (outblocks >= 8) {
+    blake3_xof8_avx512(cv, block, block_len, counter, flags, out);
+    counter += 8;
+    outblocks -= 8;
+    out += 8 * BLAKE3_BLOCK_LEN;
+  }
+  while (outblocks >= 4) {
+    blake3_xof4_avx512(cv, block, block_len, counter, flags, out);
+    counter += 4;
+    outblocks -= 4;
+    out += 4 * BLAKE3_BLOCK_LEN;
+  }
+  while (outblocks > 0) {
+    blake3_compress_xof_avx512(cv, block, block_len, counter, flags, out);
+    counter += 1;
+    outblocks -= 1;
+    out += BLAKE3_BLOCK_LEN;
+  }
+}
index a06aede0f1a912bf92e4eee0e6a7200633d1ee21..9642e413a3ad0f959449e0089dfd672fbff9fb86 100644 (file)
@@ -19,6 +19,8 @@
 .global _blake3_compress_in_place_avx512
 .global blake3_compress_xof_avx512
 .global _blake3_compress_xof_avx512
+.global blake3_xof_many_avx512
+.global _blake3_xof_many_avx512
 
 #ifdef __APPLE__
 .text
@@ -2553,6 +2555,2243 @@ blake3_compress_xof_avx512:
         vmovdqu xmmword ptr [r9+0x30], xmm3
         ret
 
+.p2align 6
+blake3_xof_many_avx512:
+_blake3_xof_many_avx512:
+        _CET_ENDBR
+        mov    r10,QWORD PTR [rsp+0x8]
+        cmp    r10,0x1
+        ja     2f
+        vmovdqu xmm0,XMMWORD PTR [rdi]
+        vmovdqu xmm1,XMMWORD PTR [rdi+0x10]
+        movzx  eax,r8b
+        movzx  edx,dl
+        shl    rax,0x20
+        add    rdx,rax
+        vmovq  xmm3,rcx
+        vmovq  xmm4,rdx
+        vpunpcklqdq xmm3,xmm3,xmm4
+        vmovaps xmm2,XMMWORD PTR [BLAKE3_IV+rip]
+        vmovups xmm8,XMMWORD PTR [rsi]
+        vmovups xmm9,XMMWORD PTR [rsi+0x10]
+        vshufps xmm4,xmm8,xmm9,0x88
+        vshufps xmm5,xmm8,xmm9,0xdd
+        vmovups xmm8,XMMWORD PTR [rsi+0x20]
+        vmovups xmm9,XMMWORD PTR [rsi+0x30]
+        vshufps xmm6,xmm8,xmm9,0x88
+        vshufps xmm7,xmm8,xmm9,0xdd
+        vpshufd xmm6,xmm6,0x93
+        vpshufd xmm7,xmm7,0x93
+        mov    al,0x7
+3:
+        vpaddd xmm0,xmm0,xmm4
+        vpaddd xmm0,xmm0,xmm1
+        vpxord xmm3,xmm3,xmm0
+        vprord xmm3,xmm3,0x10
+        vpaddd xmm2,xmm2,xmm3
+        vpxord xmm1,xmm1,xmm2
+        vprord xmm1,xmm1,0xc
+        vpaddd xmm0,xmm0,xmm5
+        vpaddd xmm0,xmm0,xmm1
+        vpxord xmm3,xmm3,xmm0
+        vprord xmm3,xmm3,0x8
+        vpaddd xmm2,xmm2,xmm3
+        vpxord xmm1,xmm1,xmm2
+        vprord xmm1,xmm1,0x7
+        vpshufd xmm0,xmm0,0x93
+        vpshufd xmm3,xmm3,0x4e
+        vpshufd xmm2,xmm2,0x39
+        vpaddd xmm0,xmm0,xmm6
+        vpaddd xmm0,xmm0,xmm1
+        vpxord xmm3,xmm3,xmm0
+        vprord xmm3,xmm3,0x10
+        vpaddd xmm2,xmm2,xmm3
+        vpxord xmm1,xmm1,xmm2
+        vprord xmm1,xmm1,0xc
+        vpaddd xmm0,xmm0,xmm7
+        vpaddd xmm0,xmm0,xmm1
+        vpxord xmm3,xmm3,xmm0
+        vprord xmm3,xmm3,0x8
+        vpaddd xmm2,xmm2,xmm3
+        vpxord xmm1,xmm1,xmm2
+        vprord xmm1,xmm1,0x7
+        vpshufd xmm0,xmm0,0x39
+        vpshufd xmm3,xmm3,0x4e
+        vpshufd xmm2,xmm2,0x93
+        dec    al
+        je     3f
+        vshufps xmm8,xmm4,xmm5,0xd6
+        vpshufd xmm9,xmm4,0xf
+        vpshufd xmm4,xmm8,0x39
+        vshufps xmm8,xmm6,xmm7,0xfa
+        vpblendd xmm9,xmm9,xmm8,0xaa
+        vpunpcklqdq xmm8,xmm7,xmm5
+        vpblendd xmm8,xmm8,xmm6,0x88
+        vpshufd xmm8,xmm8,0x78
+        vpunpckhdq xmm5,xmm5,xmm7
+        vpunpckldq xmm6,xmm6,xmm5
+        vpshufd xmm7,xmm6,0x1e
+        vmovdqa xmm5,xmm9
+        vmovdqa xmm6,xmm8
+        jmp    3b
+3:
+        vpxor  xmm0,xmm0,xmm2
+        vpxor  xmm1,xmm1,xmm3
+        vpxor  xmm2,xmm2,XMMWORD PTR [rdi]
+        vpxor  xmm3,xmm3,XMMWORD PTR [rdi+0x10]
+        vmovdqu XMMWORD PTR [r9],xmm0
+        vmovdqu XMMWORD PTR [r9+0x10],xmm1
+        vmovdqu XMMWORD PTR [r9+0x20],xmm2
+        vmovdqu XMMWORD PTR [r9+0x30],xmm3
+        ret    
+.p2align 6
+2:
+        push   rbp
+        mov    rbp,rsp
+        sub    rsp,0x90
+        and    rsp,0xffffffffffffffc0
+        vpbroadcastd zmm0,ecx
+        shr    rcx,0x20
+        vpbroadcastd zmm1,ecx
+        vpaddd zmm2,zmm0,ZMMWORD PTR [ADD0+rip]
+        vpcmpltud k1,zmm2,zmm0
+        vpaddd zmm1{k1},zmm1,DWORD PTR [ADD1+rip]{1to16}
+        vmovdqa32 ZMMWORD PTR [rsp],zmm2
+        vmovdqa32 ZMMWORD PTR [rsp+0x40],zmm1
+        cmp    r10,0x10
+        jb     2f
+3:
+        vpbroadcastd zmm16,DWORD PTR [rsi]
+        vpbroadcastd zmm17,DWORD PTR [rsi+0x4]
+        vpbroadcastd zmm18,DWORD PTR [rsi+0x8]
+        vpbroadcastd zmm19,DWORD PTR [rsi+0xc]
+        vpbroadcastd zmm20,DWORD PTR [rsi+0x10]
+        vpbroadcastd zmm21,DWORD PTR [rsi+0x14]
+        vpbroadcastd zmm22,DWORD PTR [rsi+0x18]
+        vpbroadcastd zmm23,DWORD PTR [rsi+0x1c]
+        vpbroadcastd zmm24,DWORD PTR [rsi+0x20]
+        vpbroadcastd zmm25,DWORD PTR [rsi+0x24]
+        vpbroadcastd zmm26,DWORD PTR [rsi+0x28]
+        vpbroadcastd zmm27,DWORD PTR [rsi+0x2c]
+        vpbroadcastd zmm28,DWORD PTR [rsi+0x30]
+        vpbroadcastd zmm29,DWORD PTR [rsi+0x34]
+        vpbroadcastd zmm30,DWORD PTR [rsi+0x38]
+        vpbroadcastd zmm31,DWORD PTR [rsi+0x3c]
+        vpbroadcastd zmm0,DWORD PTR [rdi]
+        vpbroadcastd zmm1,DWORD PTR [rdi+0x4]
+        vpbroadcastd zmm2,DWORD PTR [rdi+0x8]
+        vpbroadcastd zmm3,DWORD PTR [rdi+0xc]
+        vpbroadcastd zmm4,DWORD PTR [rdi+0x10]
+        vpbroadcastd zmm5,DWORD PTR [rdi+0x14]
+        vpbroadcastd zmm6,DWORD PTR [rdi+0x18]
+        vpbroadcastd zmm7,DWORD PTR [rdi+0x1c]
+        vpbroadcastd zmm8,DWORD PTR [BLAKE3_IV_0+rip]
+        vpbroadcastd zmm9,DWORD PTR [BLAKE3_IV_1+rip]
+        vpbroadcastd zmm10,DWORD PTR [BLAKE3_IV_2+rip]
+        vpbroadcastd zmm11,DWORD PTR [BLAKE3_IV_3+rip]
+        vmovdqa32 zmm12,ZMMWORD PTR [rsp]
+        vmovdqa32 zmm13,ZMMWORD PTR [rsp+0x40]
+        vpbroadcastd zmm14,edx
+        vpbroadcastd zmm15,r8d
+        vpaddd zmm0,zmm0,zmm16
+        vpaddd zmm1,zmm1,zmm18
+        vpaddd zmm2,zmm2,zmm20
+        vpaddd zmm3,zmm3,zmm22
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vprord zmm15,zmm15,0x10
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0xc
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vpaddd zmm0,zmm0,zmm17
+        vpaddd zmm1,zmm1,zmm19
+        vpaddd zmm2,zmm2,zmm21
+        vpaddd zmm3,zmm3,zmm23
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vprord zmm15,zmm15,0x8
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0x7
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vpaddd zmm0,zmm0,zmm24
+        vpaddd zmm1,zmm1,zmm26
+        vpaddd zmm2,zmm2,zmm28
+        vpaddd zmm3,zmm3,zmm30
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x10
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vprord zmm4,zmm4,0xc
+        vpaddd zmm0,zmm0,zmm25
+        vpaddd zmm1,zmm1,zmm27
+        vpaddd zmm2,zmm2,zmm29
+        vpaddd zmm3,zmm3,zmm31
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x8
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vprord zmm4,zmm4,0x7
+        vpaddd zmm0,zmm0,zmm18
+        vpaddd zmm1,zmm1,zmm19
+        vpaddd zmm2,zmm2,zmm23
+        vpaddd zmm3,zmm3,zmm20
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vprord zmm15,zmm15,0x10
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0xc
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vpaddd zmm0,zmm0,zmm22
+        vpaddd zmm1,zmm1,zmm26
+        vpaddd zmm2,zmm2,zmm16
+        vpaddd zmm3,zmm3,zmm29
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vprord zmm15,zmm15,0x8
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0x7
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vpaddd zmm0,zmm0,zmm17
+        vpaddd zmm1,zmm1,zmm28
+        vpaddd zmm2,zmm2,zmm25
+        vpaddd zmm3,zmm3,zmm31
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x10
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vprord zmm4,zmm4,0xc
+        vpaddd zmm0,zmm0,zmm27
+        vpaddd zmm1,zmm1,zmm21
+        vpaddd zmm2,zmm2,zmm30
+        vpaddd zmm3,zmm3,zmm24
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x8
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vprord zmm4,zmm4,0x7
+        vpaddd zmm0,zmm0,zmm19
+        vpaddd zmm1,zmm1,zmm26
+        vpaddd zmm2,zmm2,zmm29
+        vpaddd zmm3,zmm3,zmm23
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vprord zmm15,zmm15,0x10
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0xc
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vpaddd zmm0,zmm0,zmm20
+        vpaddd zmm1,zmm1,zmm28
+        vpaddd zmm2,zmm2,zmm18
+        vpaddd zmm3,zmm3,zmm30
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vprord zmm15,zmm15,0x8
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0x7
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vpaddd zmm0,zmm0,zmm22
+        vpaddd zmm1,zmm1,zmm25
+        vpaddd zmm2,zmm2,zmm27
+        vpaddd zmm3,zmm3,zmm24
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x10
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vprord zmm4,zmm4,0xc
+        vpaddd zmm0,zmm0,zmm21
+        vpaddd zmm1,zmm1,zmm16
+        vpaddd zmm2,zmm2,zmm31
+        vpaddd zmm3,zmm3,zmm17
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x8
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vprord zmm4,zmm4,0x7
+        vpaddd zmm0,zmm0,zmm26
+        vpaddd zmm1,zmm1,zmm28
+        vpaddd zmm2,zmm2,zmm30
+        vpaddd zmm3,zmm3,zmm29
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vprord zmm15,zmm15,0x10
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0xc
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vpaddd zmm0,zmm0,zmm23
+        vpaddd zmm1,zmm1,zmm25
+        vpaddd zmm2,zmm2,zmm19
+        vpaddd zmm3,zmm3,zmm31
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vprord zmm15,zmm15,0x8
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0x7
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vpaddd zmm0,zmm0,zmm20
+        vpaddd zmm1,zmm1,zmm27
+        vpaddd zmm2,zmm2,zmm21
+        vpaddd zmm3,zmm3,zmm17
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x10
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vprord zmm4,zmm4,0xc
+        vpaddd zmm0,zmm0,zmm16
+        vpaddd zmm1,zmm1,zmm18
+        vpaddd zmm2,zmm2,zmm24
+        vpaddd zmm3,zmm3,zmm22
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x8
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vprord zmm4,zmm4,0x7
+        vpaddd zmm0,zmm0,zmm28
+        vpaddd zmm1,zmm1,zmm25
+        vpaddd zmm2,zmm2,zmm31
+        vpaddd zmm3,zmm3,zmm30
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vprord zmm15,zmm15,0x10
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0xc
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vpaddd zmm0,zmm0,zmm29
+        vpaddd zmm1,zmm1,zmm27
+        vpaddd zmm2,zmm2,zmm26
+        vpaddd zmm3,zmm3,zmm24
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vprord zmm15,zmm15,0x8
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0x7
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vpaddd zmm0,zmm0,zmm23
+        vpaddd zmm1,zmm1,zmm21
+        vpaddd zmm2,zmm2,zmm16
+        vpaddd zmm3,zmm3,zmm22
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x10
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vprord zmm4,zmm4,0xc
+        vpaddd zmm0,zmm0,zmm18
+        vpaddd zmm1,zmm1,zmm19
+        vpaddd zmm2,zmm2,zmm17
+        vpaddd zmm3,zmm3,zmm20
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x8
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vprord zmm4,zmm4,0x7
+        vpaddd zmm0,zmm0,zmm25
+        vpaddd zmm1,zmm1,zmm27
+        vpaddd zmm2,zmm2,zmm24
+        vpaddd zmm3,zmm3,zmm31
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vprord zmm15,zmm15,0x10
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0xc
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vpaddd zmm0,zmm0,zmm30
+        vpaddd zmm1,zmm1,zmm21
+        vpaddd zmm2,zmm2,zmm28
+        vpaddd zmm3,zmm3,zmm17
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vprord zmm15,zmm15,0x8
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0x7
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vpaddd zmm0,zmm0,zmm29
+        vpaddd zmm1,zmm1,zmm16
+        vpaddd zmm2,zmm2,zmm18
+        vpaddd zmm3,zmm3,zmm20
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x10
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vprord zmm4,zmm4,0xc
+        vpaddd zmm0,zmm0,zmm19
+        vpaddd zmm1,zmm1,zmm26
+        vpaddd zmm2,zmm2,zmm22
+        vpaddd zmm3,zmm3,zmm23
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x8
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vprord zmm4,zmm4,0x7
+        vpaddd zmm0,zmm0,zmm27
+        vpaddd zmm1,zmm1,zmm21
+        vpaddd zmm2,zmm2,zmm17
+        vpaddd zmm3,zmm3,zmm24
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vprord zmm15,zmm15,0x10
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0xc
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vpaddd zmm0,zmm0,zmm31
+        vpaddd zmm1,zmm1,zmm16
+        vpaddd zmm2,zmm2,zmm25
+        vpaddd zmm3,zmm3,zmm22
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm1,zmm1,zmm5
+        vpaddd zmm2,zmm2,zmm6
+        vpaddd zmm3,zmm3,zmm7
+        vpxord zmm12,zmm12,zmm0
+        vpxord zmm13,zmm13,zmm1
+        vpxord zmm14,zmm14,zmm2
+        vpxord zmm15,zmm15,zmm3
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vprord zmm15,zmm15,0x8
+        vpaddd zmm8,zmm8,zmm12
+        vpaddd zmm9,zmm9,zmm13
+        vpaddd zmm10,zmm10,zmm14
+        vpaddd zmm11,zmm11,zmm15
+        vpxord zmm4,zmm4,zmm8
+        vpxord zmm5,zmm5,zmm9
+        vpxord zmm6,zmm6,zmm10
+        vpxord zmm7,zmm7,zmm11
+        vprord zmm4,zmm4,0x7
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vpaddd zmm0,zmm0,zmm30
+        vpaddd zmm1,zmm1,zmm18
+        vpaddd zmm2,zmm2,zmm19
+        vpaddd zmm3,zmm3,zmm23
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x10
+        vprord zmm12,zmm12,0x10
+        vprord zmm13,zmm13,0x10
+        vprord zmm14,zmm14,0x10
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0xc
+        vprord zmm6,zmm6,0xc
+        vprord zmm7,zmm7,0xc
+        vprord zmm4,zmm4,0xc
+        vpaddd zmm0,zmm0,zmm26
+        vpaddd zmm1,zmm1,zmm28
+        vpaddd zmm2,zmm2,zmm20
+        vpaddd zmm3,zmm3,zmm29
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm1,zmm1,zmm6
+        vpaddd zmm2,zmm2,zmm7
+        vpaddd zmm3,zmm3,zmm4
+        vpxord zmm15,zmm15,zmm0
+        vpxord zmm12,zmm12,zmm1
+        vpxord zmm13,zmm13,zmm2
+        vpxord zmm14,zmm14,zmm3
+        vprord zmm15,zmm15,0x8
+        vprord zmm12,zmm12,0x8
+        vprord zmm13,zmm13,0x8
+        vprord zmm14,zmm14,0x8
+        vpaddd zmm10,zmm10,zmm15
+        vpaddd zmm11,zmm11,zmm12
+        vpaddd zmm8,zmm8,zmm13
+        vpaddd zmm9,zmm9,zmm14
+        vpxord zmm5,zmm5,zmm10
+        vpxord zmm6,zmm6,zmm11
+        vpxord zmm7,zmm7,zmm8
+        vpxord zmm4,zmm4,zmm9
+        vprord zmm5,zmm5,0x7
+        vprord zmm6,zmm6,0x7
+        vprord zmm7,zmm7,0x7
+        vprord zmm4,zmm4,0x7
+        vpxord zmm0,zmm0,zmm8
+        vpxord zmm1,zmm1,zmm9
+        vpxord zmm2,zmm2,zmm10
+        vpxord zmm3,zmm3,zmm11
+        vpxord zmm4,zmm4,zmm12
+        vpxord zmm5,zmm5,zmm13
+        vpxord zmm6,zmm6,zmm14
+        vpxord zmm7,zmm7,zmm15
+        vpxord zmm8,zmm8,DWORD PTR [rdi]{1to16}
+        vpxord zmm9,zmm9,DWORD PTR [rdi+0x4]{1to16}
+        vpxord zmm10,zmm10,DWORD PTR [rdi+0x8]{1to16}
+        vpxord zmm11,zmm11,DWORD PTR [rdi+0xc]{1to16}
+        vpxord zmm12,zmm12,DWORD PTR [rdi+0x10]{1to16}
+        vpxord zmm13,zmm13,DWORD PTR [rdi+0x14]{1to16}
+        vpxord zmm14,zmm14,DWORD PTR [rdi+0x18]{1to16}
+        vpxord zmm15,zmm15,DWORD PTR [rdi+0x1c]{1to16}
+        vpunpckldq zmm16,zmm0,zmm1
+        vpunpckhdq zmm17,zmm0,zmm1
+        vpunpckldq zmm18,zmm2,zmm3
+        vpunpckhdq zmm19,zmm2,zmm3
+        vpunpckldq zmm20,zmm4,zmm5
+        vpunpckhdq zmm21,zmm4,zmm5
+        vpunpckldq zmm22,zmm6,zmm7
+        vpunpckhdq zmm23,zmm6,zmm7
+        vpunpckldq zmm24,zmm8,zmm9
+        vpunpckhdq zmm25,zmm8,zmm9
+        vpunpckldq zmm26,zmm10,zmm11
+        vpunpckhdq zmm27,zmm10,zmm11
+        vpunpckldq zmm28,zmm12,zmm13
+        vpunpckhdq zmm29,zmm12,zmm13
+        vpunpckldq zmm30,zmm14,zmm15
+        vpunpckhdq zmm31,zmm14,zmm15
+        vpunpcklqdq zmm0,zmm16,zmm18
+        vpunpckhqdq zmm1,zmm16,zmm18
+        vpunpcklqdq zmm2,zmm17,zmm19
+        vpunpckhqdq zmm3,zmm17,zmm19
+        vpunpcklqdq zmm4,zmm20,zmm22
+        vpunpckhqdq zmm5,zmm20,zmm22
+        vpunpcklqdq zmm6,zmm21,zmm23
+        vpunpckhqdq zmm7,zmm21,zmm23
+        vpunpcklqdq zmm8,zmm24,zmm26
+        vpunpckhqdq zmm9,zmm24,zmm26
+        vpunpcklqdq zmm10,zmm25,zmm27
+        vpunpckhqdq zmm11,zmm25,zmm27
+        vpunpcklqdq zmm12,zmm28,zmm30
+        vpunpckhqdq zmm13,zmm28,zmm30
+        vpunpcklqdq zmm14,zmm29,zmm31
+        vpunpckhqdq zmm15,zmm29,zmm31
+        vshufi32x4 zmm16,zmm0,zmm4,0x88
+        vshufi32x4 zmm17,zmm1,zmm5,0x88
+        vshufi32x4 zmm18,zmm2,zmm6,0x88
+        vshufi32x4 zmm19,zmm3,zmm7,0x88
+        vshufi32x4 zmm20,zmm0,zmm4,0xdd
+        vshufi32x4 zmm21,zmm1,zmm5,0xdd
+        vshufi32x4 zmm22,zmm2,zmm6,0xdd
+        vshufi32x4 zmm23,zmm3,zmm7,0xdd
+        vshufi32x4 zmm24,zmm8,zmm12,0x88
+        vshufi32x4 zmm25,zmm9,zmm13,0x88
+        vshufi32x4 zmm26,zmm10,zmm14,0x88
+        vshufi32x4 zmm27,zmm11,zmm15,0x88
+        vshufi32x4 zmm28,zmm8,zmm12,0xdd
+        vshufi32x4 zmm29,zmm9,zmm13,0xdd
+        vshufi32x4 zmm30,zmm10,zmm14,0xdd
+        vshufi32x4 zmm31,zmm11,zmm15,0xdd
+        vshufi32x4 zmm0,zmm16,zmm24,0x88
+        vshufi32x4 zmm1,zmm17,zmm25,0x88
+        vshufi32x4 zmm2,zmm18,zmm26,0x88
+        vshufi32x4 zmm3,zmm19,zmm27,0x88
+        vshufi32x4 zmm4,zmm20,zmm28,0x88
+        vshufi32x4 zmm5,zmm21,zmm29,0x88
+        vshufi32x4 zmm6,zmm22,zmm30,0x88
+        vshufi32x4 zmm7,zmm23,zmm31,0x88
+        vshufi32x4 zmm8,zmm16,zmm24,0xdd
+        vshufi32x4 zmm9,zmm17,zmm25,0xdd
+        vshufi32x4 zmm10,zmm18,zmm26,0xdd
+        vshufi32x4 zmm11,zmm19,zmm27,0xdd
+        vshufi32x4 zmm12,zmm20,zmm28,0xdd
+        vshufi32x4 zmm13,zmm21,zmm29,0xdd
+        vshufi32x4 zmm14,zmm22,zmm30,0xdd
+        vshufi32x4 zmm15,zmm23,zmm31,0xdd
+        vmovdqu32 ZMMWORD PTR [r9],zmm0
+        vmovdqu32 ZMMWORD PTR [r9+0x40],zmm1
+        vmovdqu32 ZMMWORD PTR [r9+0x80],zmm2
+        vmovdqu32 ZMMWORD PTR [r9+0xc0],zmm3
+        vmovdqu32 ZMMWORD PTR [r9+0x100],zmm4
+        vmovdqu32 ZMMWORD PTR [r9+0x140],zmm5
+        vmovdqu32 ZMMWORD PTR [r9+0x180],zmm6
+        vmovdqu32 ZMMWORD PTR [r9+0x1c0],zmm7
+        vmovdqu32 ZMMWORD PTR [r9+0x200],zmm8
+        vmovdqu32 ZMMWORD PTR [r9+0x240],zmm9
+        vmovdqu32 ZMMWORD PTR [r9+0x280],zmm10
+        vmovdqu32 ZMMWORD PTR [r9+0x2c0],zmm11
+        vmovdqu32 ZMMWORD PTR [r9+0x300],zmm12
+        vmovdqu32 ZMMWORD PTR [r9+0x340],zmm13
+        vmovdqu32 ZMMWORD PTR [r9+0x380],zmm14
+        vmovdqu32 ZMMWORD PTR [r9+0x3c0],zmm15
+        vmovdqa32 zmm0,ZMMWORD PTR [rsp]
+        vmovdqa32 zmm1,ZMMWORD PTR [rsp+0x40]
+        vpaddd zmm2,zmm0,DWORD PTR [ADD16+rip]{1to16}
+        vpcmpltud k1,zmm2,zmm0
+        vpaddd zmm1{k1},zmm1,DWORD PTR [ADD1+rip]{1to16}
+        vmovdqa32 ZMMWORD PTR [rsp],zmm2
+        vmovdqa32 ZMMWORD PTR [rsp+0x40],zmm1
+        add    r9,0x400
+        sub    r10,0x10
+        cmp    r10,0x10
+        jae    3b
+        test   r10,r10
+        jne    2f
+9:
+        vzeroupper 
+        mov    rsp,rbp
+        pop    rbp
+        ret    
+2:
+        test   r10,0x8
+        je     2f
+        vpbroadcastd ymm16,DWORD PTR [rsi]
+        vpbroadcastd ymm17,DWORD PTR [rsi+0x4]
+        vpbroadcastd ymm18,DWORD PTR [rsi+0x8]
+        vpbroadcastd ymm19,DWORD PTR [rsi+0xc]
+        vpbroadcastd ymm20,DWORD PTR [rsi+0x10]
+        vpbroadcastd ymm21,DWORD PTR [rsi+0x14]
+        vpbroadcastd ymm22,DWORD PTR [rsi+0x18]
+        vpbroadcastd ymm23,DWORD PTR [rsi+0x1c]
+        vpbroadcastd ymm24,DWORD PTR [rsi+0x20]
+        vpbroadcastd ymm25,DWORD PTR [rsi+0x24]
+        vpbroadcastd ymm26,DWORD PTR [rsi+0x28]
+        vpbroadcastd ymm27,DWORD PTR [rsi+0x2c]
+        vpbroadcastd ymm28,DWORD PTR [rsi+0x30]
+        vpbroadcastd ymm29,DWORD PTR [rsi+0x34]
+        vpbroadcastd ymm30,DWORD PTR [rsi+0x38]
+        vpbroadcastd ymm31,DWORD PTR [rsi+0x3c]
+        vpbroadcastd ymm0,DWORD PTR [rdi]
+        vpbroadcastd ymm1,DWORD PTR [rdi+0x4]
+        vpbroadcastd ymm2,DWORD PTR [rdi+0x8]
+        vpbroadcastd ymm3,DWORD PTR [rdi+0xc]
+        vpbroadcastd ymm4,DWORD PTR [rdi+0x10]
+        vpbroadcastd ymm5,DWORD PTR [rdi+0x14]
+        vpbroadcastd ymm6,DWORD PTR [rdi+0x18]
+        vpbroadcastd ymm7,DWORD PTR [rdi+0x1c]
+        vpbroadcastd ymm8,DWORD PTR [BLAKE3_IV_0+rip]
+        vpbroadcastd ymm9,DWORD PTR [BLAKE3_IV_1+rip]
+        vpbroadcastd ymm10,DWORD PTR [BLAKE3_IV_2+rip]
+        vpbroadcastd ymm11,DWORD PTR [BLAKE3_IV_3+rip]
+        vmovdqa ymm12,YMMWORD PTR [rsp]
+        vmovdqa ymm13,YMMWORD PTR [rsp+0x40]
+        vpbroadcastd ymm14,edx
+        vpbroadcastd ymm15,r8d
+        vpaddd ymm0,ymm0,ymm16
+        vpaddd ymm1,ymm1,ymm18
+        vpaddd ymm2,ymm2,ymm20
+        vpaddd ymm3,ymm3,ymm22
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vprord ymm15,ymm15,0x10
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0xc
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vpaddd ymm0,ymm0,ymm17
+        vpaddd ymm1,ymm1,ymm19
+        vpaddd ymm2,ymm2,ymm21
+        vpaddd ymm3,ymm3,ymm23
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vprord ymm15,ymm15,0x8
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0x7
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vpaddd ymm0,ymm0,ymm24
+        vpaddd ymm1,ymm1,ymm26
+        vpaddd ymm2,ymm2,ymm28
+        vpaddd ymm3,ymm3,ymm30
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x10
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vprord ymm4,ymm4,0xc
+        vpaddd ymm0,ymm0,ymm25
+        vpaddd ymm1,ymm1,ymm27
+        vpaddd ymm2,ymm2,ymm29
+        vpaddd ymm3,ymm3,ymm31
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x8
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vprord ymm4,ymm4,0x7
+        vpaddd ymm0,ymm0,ymm18
+        vpaddd ymm1,ymm1,ymm19
+        vpaddd ymm2,ymm2,ymm23
+        vpaddd ymm3,ymm3,ymm20
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vprord ymm15,ymm15,0x10
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0xc
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vpaddd ymm0,ymm0,ymm22
+        vpaddd ymm1,ymm1,ymm26
+        vpaddd ymm2,ymm2,ymm16
+        vpaddd ymm3,ymm3,ymm29
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vprord ymm15,ymm15,0x8
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0x7
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vpaddd ymm0,ymm0,ymm17
+        vpaddd ymm1,ymm1,ymm28
+        vpaddd ymm2,ymm2,ymm25
+        vpaddd ymm3,ymm3,ymm31
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x10
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vprord ymm4,ymm4,0xc
+        vpaddd ymm0,ymm0,ymm27
+        vpaddd ymm1,ymm1,ymm21
+        vpaddd ymm2,ymm2,ymm30
+        vpaddd ymm3,ymm3,ymm24
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x8
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vprord ymm4,ymm4,0x7
+        vpaddd ymm0,ymm0,ymm19
+        vpaddd ymm1,ymm1,ymm26
+        vpaddd ymm2,ymm2,ymm29
+        vpaddd ymm3,ymm3,ymm23
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vprord ymm15,ymm15,0x10
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0xc
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vpaddd ymm0,ymm0,ymm20
+        vpaddd ymm1,ymm1,ymm28
+        vpaddd ymm2,ymm2,ymm18
+        vpaddd ymm3,ymm3,ymm30
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vprord ymm15,ymm15,0x8
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0x7
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vpaddd ymm0,ymm0,ymm22
+        vpaddd ymm1,ymm1,ymm25
+        vpaddd ymm2,ymm2,ymm27
+        vpaddd ymm3,ymm3,ymm24
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x10
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vprord ymm4,ymm4,0xc
+        vpaddd ymm0,ymm0,ymm21
+        vpaddd ymm1,ymm1,ymm16
+        vpaddd ymm2,ymm2,ymm31
+        vpaddd ymm3,ymm3,ymm17
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x8
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vprord ymm4,ymm4,0x7
+        vpaddd ymm0,ymm0,ymm26
+        vpaddd ymm1,ymm1,ymm28
+        vpaddd ymm2,ymm2,ymm30
+        vpaddd ymm3,ymm3,ymm29
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vprord ymm15,ymm15,0x10
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0xc
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vpaddd ymm0,ymm0,ymm23
+        vpaddd ymm1,ymm1,ymm25
+        vpaddd ymm2,ymm2,ymm19
+        vpaddd ymm3,ymm3,ymm31
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vprord ymm15,ymm15,0x8
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0x7
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vpaddd ymm0,ymm0,ymm20
+        vpaddd ymm1,ymm1,ymm27
+        vpaddd ymm2,ymm2,ymm21
+        vpaddd ymm3,ymm3,ymm17
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x10
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vprord ymm4,ymm4,0xc
+        vpaddd ymm0,ymm0,ymm16
+        vpaddd ymm1,ymm1,ymm18
+        vpaddd ymm2,ymm2,ymm24
+        vpaddd ymm3,ymm3,ymm22
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x8
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vprord ymm4,ymm4,0x7
+        vpaddd ymm0,ymm0,ymm28
+        vpaddd ymm1,ymm1,ymm25
+        vpaddd ymm2,ymm2,ymm31
+        vpaddd ymm3,ymm3,ymm30
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vprord ymm15,ymm15,0x10
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0xc
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vpaddd ymm0,ymm0,ymm29
+        vpaddd ymm1,ymm1,ymm27
+        vpaddd ymm2,ymm2,ymm26
+        vpaddd ymm3,ymm3,ymm24
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vprord ymm15,ymm15,0x8
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0x7
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vpaddd ymm0,ymm0,ymm23
+        vpaddd ymm1,ymm1,ymm21
+        vpaddd ymm2,ymm2,ymm16
+        vpaddd ymm3,ymm3,ymm22
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x10
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vprord ymm4,ymm4,0xc
+        vpaddd ymm0,ymm0,ymm18
+        vpaddd ymm1,ymm1,ymm19
+        vpaddd ymm2,ymm2,ymm17
+        vpaddd ymm3,ymm3,ymm20
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x8
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vprord ymm4,ymm4,0x7
+        vpaddd ymm0,ymm0,ymm25
+        vpaddd ymm1,ymm1,ymm27
+        vpaddd ymm2,ymm2,ymm24
+        vpaddd ymm3,ymm3,ymm31
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vprord ymm15,ymm15,0x10
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0xc
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vpaddd ymm0,ymm0,ymm30
+        vpaddd ymm1,ymm1,ymm21
+        vpaddd ymm2,ymm2,ymm28
+        vpaddd ymm3,ymm3,ymm17
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vprord ymm15,ymm15,0x8
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0x7
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vpaddd ymm0,ymm0,ymm29
+        vpaddd ymm1,ymm1,ymm16
+        vpaddd ymm2,ymm2,ymm18
+        vpaddd ymm3,ymm3,ymm20
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x10
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vprord ymm4,ymm4,0xc
+        vpaddd ymm0,ymm0,ymm19
+        vpaddd ymm1,ymm1,ymm26
+        vpaddd ymm2,ymm2,ymm22
+        vpaddd ymm3,ymm3,ymm23
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x8
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vprord ymm4,ymm4,0x7
+        vpaddd ymm0,ymm0,ymm27
+        vpaddd ymm1,ymm1,ymm21
+        vpaddd ymm2,ymm2,ymm17
+        vpaddd ymm3,ymm3,ymm24
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vprord ymm15,ymm15,0x10
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0xc
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vpaddd ymm0,ymm0,ymm31
+        vpaddd ymm1,ymm1,ymm16
+        vpaddd ymm2,ymm2,ymm25
+        vpaddd ymm3,ymm3,ymm22
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm1,ymm1,ymm5
+        vpaddd ymm2,ymm2,ymm6
+        vpaddd ymm3,ymm3,ymm7
+        vpxord ymm12,ymm12,ymm0
+        vpxord ymm13,ymm13,ymm1
+        vpxord ymm14,ymm14,ymm2
+        vpxord ymm15,ymm15,ymm3
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vprord ymm15,ymm15,0x8
+        vpaddd ymm8,ymm8,ymm12
+        vpaddd ymm9,ymm9,ymm13
+        vpaddd ymm10,ymm10,ymm14
+        vpaddd ymm11,ymm11,ymm15
+        vpxord ymm4,ymm4,ymm8
+        vpxord ymm5,ymm5,ymm9
+        vpxord ymm6,ymm6,ymm10
+        vpxord ymm7,ymm7,ymm11
+        vprord ymm4,ymm4,0x7
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vpaddd ymm0,ymm0,ymm30
+        vpaddd ymm1,ymm1,ymm18
+        vpaddd ymm2,ymm2,ymm19
+        vpaddd ymm3,ymm3,ymm23
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x10
+        vprord ymm12,ymm12,0x10
+        vprord ymm13,ymm13,0x10
+        vprord ymm14,ymm14,0x10
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0xc
+        vprord ymm6,ymm6,0xc
+        vprord ymm7,ymm7,0xc
+        vprord ymm4,ymm4,0xc
+        vpaddd ymm0,ymm0,ymm26
+        vpaddd ymm1,ymm1,ymm28
+        vpaddd ymm2,ymm2,ymm20
+        vpaddd ymm3,ymm3,ymm29
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm1,ymm1,ymm6
+        vpaddd ymm2,ymm2,ymm7
+        vpaddd ymm3,ymm3,ymm4
+        vpxord ymm15,ymm15,ymm0
+        vpxord ymm12,ymm12,ymm1
+        vpxord ymm13,ymm13,ymm2
+        vpxord ymm14,ymm14,ymm3
+        vprord ymm15,ymm15,0x8
+        vprord ymm12,ymm12,0x8
+        vprord ymm13,ymm13,0x8
+        vprord ymm14,ymm14,0x8
+        vpaddd ymm10,ymm10,ymm15
+        vpaddd ymm11,ymm11,ymm12
+        vpaddd ymm8,ymm8,ymm13
+        vpaddd ymm9,ymm9,ymm14
+        vpxord ymm5,ymm5,ymm10
+        vpxord ymm6,ymm6,ymm11
+        vpxord ymm7,ymm7,ymm8
+        vpxord ymm4,ymm4,ymm9
+        vprord ymm5,ymm5,0x7
+        vprord ymm6,ymm6,0x7
+        vprord ymm7,ymm7,0x7
+        vprord ymm4,ymm4,0x7
+        vpxor  ymm0,ymm0,ymm8
+        vpxor  ymm1,ymm1,ymm9
+        vpxor  ymm2,ymm2,ymm10
+        vpxor  ymm3,ymm3,ymm11
+        vpxor  ymm4,ymm4,ymm12
+        vpxor  ymm5,ymm5,ymm13
+        vpxor  ymm6,ymm6,ymm14
+        vpxor  ymm7,ymm7,ymm15
+        vpxord ymm8,ymm8,DWORD PTR [rdi]{1to8}
+        vpxord ymm9,ymm9,DWORD PTR [rdi+0x4]{1to8}
+        vpxord ymm10,ymm10,DWORD PTR [rdi+0x8]{1to8}
+        vpxord ymm11,ymm11,DWORD PTR [rdi+0xc]{1to8}
+        vpxord ymm12,ymm12,DWORD PTR [rdi+0x10]{1to8}
+        vpxord ymm13,ymm13,DWORD PTR [rdi+0x14]{1to8}
+        vpxord ymm14,ymm14,DWORD PTR [rdi+0x18]{1to8}
+        vpxord ymm15,ymm15,DWORD PTR [rdi+0x1c]{1to8}
+        vpunpckldq ymm16,ymm0,ymm1
+        vpunpckhdq ymm17,ymm0,ymm1
+        vpunpckldq ymm18,ymm2,ymm3
+        vpunpckhdq ymm19,ymm2,ymm3
+        vpunpckldq ymm20,ymm4,ymm5
+        vpunpckhdq ymm21,ymm4,ymm5
+        vpunpckldq ymm22,ymm6,ymm7
+        vpunpckhdq ymm23,ymm6,ymm7
+        vpunpckldq ymm24,ymm8,ymm9
+        vpunpckhdq ymm25,ymm8,ymm9
+        vpunpckldq ymm26,ymm10,ymm11
+        vpunpckhdq ymm27,ymm10,ymm11
+        vpunpckldq ymm28,ymm12,ymm13
+        vpunpckhdq ymm29,ymm12,ymm13
+        vpunpckldq ymm30,ymm14,ymm15
+        vpunpckhdq ymm31,ymm14,ymm15
+        vpunpcklqdq ymm0,ymm16,ymm18
+        vpunpckhqdq ymm1,ymm16,ymm18
+        vpunpcklqdq ymm2,ymm17,ymm19
+        vpunpckhqdq ymm3,ymm17,ymm19
+        vpunpcklqdq ymm4,ymm20,ymm22
+        vpunpckhqdq ymm5,ymm20,ymm22
+        vpunpcklqdq ymm6,ymm21,ymm23
+        vpunpckhqdq ymm7,ymm21,ymm23
+        vpunpcklqdq ymm8,ymm24,ymm26
+        vpunpckhqdq ymm9,ymm24,ymm26
+        vpunpcklqdq ymm10,ymm25,ymm27
+        vpunpckhqdq ymm11,ymm25,ymm27
+        vpunpcklqdq ymm12,ymm28,ymm30
+        vpunpckhqdq ymm13,ymm28,ymm30
+        vpunpcklqdq ymm14,ymm29,ymm31
+        vpunpckhqdq ymm15,ymm29,ymm31
+        vshufi32x4 ymm16,ymm0,ymm4,0x0
+        vshufi32x4 ymm17,ymm8,ymm12,0x0
+        vshufi32x4 ymm18,ymm1,ymm5,0x0
+        vshufi32x4 ymm19,ymm9,ymm13,0x0
+        vshufi32x4 ymm20,ymm2,ymm6,0x0
+        vshufi32x4 ymm21,ymm10,ymm14,0x0
+        vshufi32x4 ymm22,ymm3,ymm7,0x0
+        vshufi32x4 ymm23,ymm11,ymm15,0x0
+        vshufi32x4 ymm24,ymm0,ymm4,0x3
+        vshufi32x4 ymm25,ymm8,ymm12,0x3
+        vshufi32x4 ymm26,ymm1,ymm5,0x3
+        vshufi32x4 ymm27,ymm9,ymm13,0x3
+        vshufi32x4 ymm28,ymm2,ymm6,0x3
+        vshufi32x4 ymm29,ymm10,ymm14,0x3
+        vshufi32x4 ymm30,ymm3,ymm7,0x3
+        vshufi32x4 ymm31,ymm11,ymm15,0x3
+        vmovdqu32 YMMWORD PTR [r9],ymm16
+        vmovdqu32 YMMWORD PTR [r9+0x20],ymm17
+        vmovdqu32 YMMWORD PTR [r9+0x40],ymm18
+        vmovdqu32 YMMWORD PTR [r9+0x60],ymm19
+        vmovdqu32 YMMWORD PTR [r9+0x80],ymm20
+        vmovdqu32 YMMWORD PTR [r9+0xa0],ymm21
+        vmovdqu32 YMMWORD PTR [r9+0xc0],ymm22
+        vmovdqu32 YMMWORD PTR [r9+0xe0],ymm23
+        vmovdqu32 YMMWORD PTR [r9+0x100],ymm24
+        vmovdqu32 YMMWORD PTR [r9+0x120],ymm25
+        vmovdqu32 YMMWORD PTR [r9+0x140],ymm26
+        vmovdqu32 YMMWORD PTR [r9+0x160],ymm27
+        vmovdqu32 YMMWORD PTR [r9+0x180],ymm28
+        vmovdqu32 YMMWORD PTR [r9+0x1a0],ymm29
+        vmovdqu32 YMMWORD PTR [r9+0x1c0],ymm30
+        vmovdqu32 YMMWORD PTR [r9+0x1e0],ymm31
+        vmovdqa ymm0,YMMWORD PTR [rsp+0x20]
+        vmovdqa ymm1,YMMWORD PTR [rsp+0x60]
+        vmovdqa YMMWORD PTR [rsp],ymm0
+        vmovdqa YMMWORD PTR [rsp+0x40],ymm1
+        add    r9,0x200
+        sub    r10,0x8
+2:
+        test   r10,0x4
+        je     2f
+        vbroadcasti32x4 zmm0,XMMWORD PTR [rdi]
+        vbroadcasti32x4 zmm1,XMMWORD PTR [rdi+0x10]
+        vbroadcasti32x4 zmm2,XMMWORD PTR [BLAKE3_IV+rip]
+        vmovdqa xmm12,XMMWORD PTR [rsp]
+        vmovdqa xmm13,XMMWORD PTR [rsp+0x40]
+        vpunpckldq xmm14,xmm12,xmm13
+        vpunpckhdq xmm15,xmm12,xmm13
+        vpermq ymm14,ymm14,0xdc
+        vpermq ymm15,ymm15,0xdc
+        vpbroadcastd zmm12,edx
+        vinserti64x4 zmm13,zmm14,ymm15,0x1
+        mov    eax,0x4444
+        kmovw  k2,eax
+        vpblendmd zmm13{k2},zmm13,zmm12
+        vpbroadcastd zmm15,r8d
+        mov    eax,0x8888
+        kmovw  k4,eax
+        vpblendmd zmm3{k4},zmm13,zmm15
+        mov    eax,0xaaaa
+        kmovw  k3,eax
+        vbroadcasti32x4 zmm8,XMMWORD PTR [rsi]
+        vbroadcasti32x4 zmm9,XMMWORD PTR [rsi+0x10]
+        vshufps zmm4,zmm8,zmm9,0x88
+        vshufps zmm5,zmm8,zmm9,0xdd
+        vbroadcasti32x4 zmm8,XMMWORD PTR [rsi+0x20]
+        vbroadcasti32x4 zmm9,XMMWORD PTR [rsi+0x30]
+        vshufps zmm6,zmm8,zmm9,0x88
+        vshufps zmm7,zmm8,zmm9,0xdd
+        vpshufd zmm6,zmm6,0x93
+        vpshufd zmm7,zmm7,0x93
+        mov    al,0x7
+3:
+        vpaddd zmm0,zmm0,zmm4
+        vpaddd zmm0,zmm0,zmm1
+        vpxord zmm3,zmm3,zmm0
+        vprord zmm3,zmm3,0x10
+        vpaddd zmm2,zmm2,zmm3
+        vpxord zmm1,zmm1,zmm2
+        vprord zmm1,zmm1,0xc
+        vpaddd zmm0,zmm0,zmm5
+        vpaddd zmm0,zmm0,zmm1
+        vpxord zmm3,zmm3,zmm0
+        vprord zmm3,zmm3,0x8
+        vpaddd zmm2,zmm2,zmm3
+        vpxord zmm1,zmm1,zmm2
+        vprord zmm1,zmm1,0x7
+        vpshufd zmm0,zmm0,0x93
+        vpshufd zmm3,zmm3,0x4e
+        vpshufd zmm2,zmm2,0x39
+        vpaddd zmm0,zmm0,zmm6
+        vpaddd zmm0,zmm0,zmm1
+        vpxord zmm3,zmm3,zmm0
+        vprord zmm3,zmm3,0x10
+        vpaddd zmm2,zmm2,zmm3
+        vpxord zmm1,zmm1,zmm2
+        vprord zmm1,zmm1,0xc
+        vpaddd zmm0,zmm0,zmm7
+        vpaddd zmm0,zmm0,zmm1
+        vpxord zmm3,zmm3,zmm0
+        vprord zmm3,zmm3,0x8
+        vpaddd zmm2,zmm2,zmm3
+        vpxord zmm1,zmm1,zmm2
+        vprord zmm1,zmm1,0x7
+        vpshufd zmm0,zmm0,0x39
+        vpshufd zmm3,zmm3,0x4e
+        vpshufd zmm2,zmm2,0x93
+        dec    al
+        je     3f
+        vshufps zmm8,zmm4,zmm5,0xd6
+        vpshufd zmm9,zmm4,0xf
+        vpshufd zmm4,zmm8,0x39
+        vshufps zmm8,zmm6,zmm7,0xfa
+        vpblendmd zmm9{k3},zmm9,zmm8
+        vpunpcklqdq zmm8,zmm7,zmm5
+        vpblendmd zmm8{k4},zmm8,zmm6
+        vpshufd zmm8,zmm8,0x78
+        vpunpckhdq zmm5,zmm5,zmm7
+        vpunpckldq zmm6,zmm6,zmm5
+        vpshufd zmm7,zmm6,0x1e
+        vmovdqa32 zmm5,zmm9
+        vmovdqa32 zmm6,zmm8
+        jmp    3b
+3:
+        vpxord zmm0,zmm0,zmm2
+        vpxord zmm1,zmm1,zmm3
+        vbroadcasti32x4 zmm8,XMMWORD PTR [rdi]
+        vbroadcasti32x4 zmm9,XMMWORD PTR [rdi+0x10]
+        vpxord zmm2,zmm2,zmm8
+        vpxord zmm3,zmm3,zmm9
+        vmovdqu XMMWORD PTR [r9],xmm0
+        vmovdqu XMMWORD PTR [r9+0x10],xmm1
+        vmovdqu XMMWORD PTR [r9+0x20],xmm2
+        vmovdqu XMMWORD PTR [r9+0x30],xmm3
+        vextracti128 XMMWORD PTR [r9+0x40],ymm0,0x1
+        vextracti128 XMMWORD PTR [r9+0x50],ymm1,0x1
+        vextracti128 XMMWORD PTR [r9+0x60],ymm2,0x1
+        vextracti128 XMMWORD PTR [r9+0x70],ymm3,0x1
+        vextracti32x4 XMMWORD PTR [r9+0x80],zmm0,0x2
+        vextracti32x4 XMMWORD PTR [r9+0x90],zmm1,0x2
+        vextracti32x4 XMMWORD PTR [r9+0xa0],zmm2,0x2
+        vextracti32x4 XMMWORD PTR [r9+0xb0],zmm3,0x2
+        vextracti32x4 XMMWORD PTR [r9+0xc0],zmm0,0x3
+        vextracti32x4 XMMWORD PTR [r9+0xd0],zmm1,0x3
+        vextracti32x4 XMMWORD PTR [r9+0xe0],zmm2,0x3
+        vextracti32x4 XMMWORD PTR [r9+0xf0],zmm3,0x3
+        vmovdqa xmm0,XMMWORD PTR [rsp+0x10]
+        vmovdqa xmm1,XMMWORD PTR [rsp+0x50]
+        vmovdqa XMMWORD PTR [rsp],xmm0
+        vmovdqa XMMWORD PTR [rsp+0x40],xmm1
+        add    r9,0x100
+        sub    r10,0x4
+2:
+        test   r10,0x2
+        je     2f
+        vbroadcasti128 ymm0,XMMWORD PTR [rdi]
+        vbroadcasti128 ymm1,XMMWORD PTR [rdi+0x10]
+        vmovd  xmm13,DWORD PTR [rsp]
+        vpinsrd xmm13,xmm13,DWORD PTR [rsp+0x40],0x1
+        vpinsrd xmm13,xmm13,edx,0x2
+        vmovd  xmm14,DWORD PTR [rsp+0x4]
+        vpinsrd xmm14,xmm14,DWORD PTR [rsp+0x44],0x1
+        vpinsrd xmm14,xmm14,edx,0x2
+        vinserti128 ymm13,ymm13,xmm14,0x1
+        vbroadcasti128 ymm2,XMMWORD PTR [BLAKE3_IV+rip]
+        vpbroadcastd ymm8,r8d
+        vpblendd ymm3,ymm13,ymm8,0x88
+        vbroadcasti128 ymm8,XMMWORD PTR [rsi]
+        vbroadcasti128 ymm9,XMMWORD PTR [rsi+0x10]
+        vshufps ymm4,ymm8,ymm9,0x88
+        vshufps ymm5,ymm8,ymm9,0xdd
+        vbroadcasti128 ymm8,XMMWORD PTR [rsi+0x20]
+        vbroadcasti128 ymm9,XMMWORD PTR [rsi+0x30]
+        vshufps ymm6,ymm8,ymm9,0x88
+        vshufps ymm7,ymm8,ymm9,0xdd
+        vpshufd ymm6,ymm6,0x93
+        vpshufd ymm7,ymm7,0x93
+        mov    al,0x7
+3:
+        vpaddd ymm0,ymm0,ymm4
+        vpaddd ymm0,ymm0,ymm1
+        vpxord ymm3,ymm3,ymm0
+        vprord ymm3,ymm3,0x10
+        vpaddd ymm2,ymm2,ymm3
+        vpxord ymm1,ymm1,ymm2
+        vprord ymm1,ymm1,0xc
+        vpaddd ymm0,ymm0,ymm5
+        vpaddd ymm0,ymm0,ymm1
+        vpxord ymm3,ymm3,ymm0
+        vprord ymm3,ymm3,0x8
+        vpaddd ymm2,ymm2,ymm3
+        vpxord ymm1,ymm1,ymm2
+        vprord ymm1,ymm1,0x7
+        vpshufd ymm0,ymm0,0x93
+        vpshufd ymm3,ymm3,0x4e
+        vpshufd ymm2,ymm2,0x39
+        vpaddd ymm0,ymm0,ymm6
+        vpaddd ymm0,ymm0,ymm1
+        vpxord ymm3,ymm3,ymm0
+        vprord ymm3,ymm3,0x10
+        vpaddd ymm2,ymm2,ymm3
+        vpxord ymm1,ymm1,ymm2
+        vprord ymm1,ymm1,0xc
+        vpaddd ymm0,ymm0,ymm7
+        vpaddd ymm0,ymm0,ymm1
+        vpxord ymm3,ymm3,ymm0
+        vprord ymm3,ymm3,0x8
+        vpaddd ymm2,ymm2,ymm3
+        vpxord ymm1,ymm1,ymm2
+        vprord ymm1,ymm1,0x7
+        vpshufd ymm0,ymm0,0x39
+        vpshufd ymm3,ymm3,0x4e
+        vpshufd ymm2,ymm2,0x93
+        dec    al
+        je     3f
+        vshufps ymm8,ymm4,ymm5,0xd6
+        vpshufd ymm9,ymm4,0xf
+        vpshufd ymm4,ymm8,0x39
+        vshufps ymm8,ymm6,ymm7,0xfa
+        vpblendd ymm9,ymm9,ymm8,0xaa
+        vpunpcklqdq ymm8,ymm7,ymm5
+        vpblendd ymm8,ymm8,ymm6,0x88
+        vpshufd ymm8,ymm8,0x78
+        vpunpckhdq ymm5,ymm5,ymm7
+        vpunpckldq ymm6,ymm6,ymm5
+        vpshufd ymm7,ymm6,0x1e
+        vmovdqa ymm5,ymm9
+        vmovdqa ymm6,ymm8
+        jmp    3b
+3:
+        vpxor  ymm0,ymm0,ymm2
+        vpxor  ymm1,ymm1,ymm3
+        vbroadcasti128 ymm8,XMMWORD PTR [rdi]
+        vbroadcasti128 ymm9,XMMWORD PTR [rdi+0x10]
+        vpxor  ymm2,ymm2,ymm8
+        vpxor  ymm3,ymm3,ymm9
+        vmovdqu XMMWORD PTR [r9],xmm0
+        vmovdqu XMMWORD PTR [r9+0x10],xmm1
+        vmovdqu XMMWORD PTR [r9+0x20],xmm2
+        vmovdqu XMMWORD PTR [r9+0x30],xmm3
+        vextracti128 XMMWORD PTR [r9+0x40],ymm0,0x1
+        vextracti128 XMMWORD PTR [r9+0x50],ymm1,0x1
+        vextracti128 XMMWORD PTR [r9+0x60],ymm2,0x1
+        vextracti128 XMMWORD PTR [r9+0x70],ymm3,0x1
+        vmovdqu xmm0,XMMWORD PTR [rsp+0x8]
+        vmovdqu xmm1,XMMWORD PTR [rsp+0x48]
+        vmovdqa XMMWORD PTR [rsp],xmm0
+        vmovdqa XMMWORD PTR [rsp+0x40],xmm1
+        add    r9,0x80
+        sub    r10,0x2
+2:
+        test   r10,0x1
+        je     9b
+        vmovdqu xmm0,XMMWORD PTR [rdi]
+        vmovdqu xmm1,XMMWORD PTR [rdi+0x10]
+        vmovd  xmm14,DWORD PTR [rsp]
+        vpinsrd xmm14,xmm14,DWORD PTR [rsp+0x40],0x1
+        vpinsrd xmm14,xmm14,edx,0x2
+        vmovdqa xmm2,XMMWORD PTR [BLAKE3_IV+rip]
+        vpinsrd xmm3,xmm14,r8d,0x3
+        vmovups xmm8,XMMWORD PTR [rsi]
+        vmovups xmm9,XMMWORD PTR [rsi+0x10]
+        vshufps xmm4,xmm8,xmm9,0x88
+        vshufps xmm5,xmm8,xmm9,0xdd
+        vmovups xmm8,XMMWORD PTR [rsi+0x20]
+        vmovups xmm9,XMMWORD PTR [rsi+0x30]
+        vshufps xmm6,xmm8,xmm9,0x88
+        vshufps xmm7,xmm8,xmm9,0xdd
+        vpshufd xmm6,xmm6,0x93
+        vpshufd xmm7,xmm7,0x93
+        mov    al,0x7
+3:
+        vpaddd xmm0,xmm0,xmm4
+        vpaddd xmm0,xmm0,xmm1
+        vpxord xmm3,xmm3,xmm0
+        vprord xmm3,xmm3,0x10
+        vpaddd xmm2,xmm2,xmm3
+        vpxord xmm1,xmm1,xmm2
+        vprord xmm1,xmm1,0xc
+        vpaddd xmm0,xmm0,xmm5
+        vpaddd xmm0,xmm0,xmm1
+        vpxord xmm3,xmm3,xmm0
+        vprord xmm3,xmm3,0x8
+        vpaddd xmm2,xmm2,xmm3
+        vpxord xmm1,xmm1,xmm2
+        vprord xmm1,xmm1,0x7
+        vpshufd xmm0,xmm0,0x93
+        vpshufd xmm3,xmm3,0x4e
+        vpshufd xmm2,xmm2,0x39
+        vpaddd xmm0,xmm0,xmm6
+        vpaddd xmm0,xmm0,xmm1
+        vpxord xmm3,xmm3,xmm0
+        vprord xmm3,xmm3,0x10
+        vpaddd xmm2,xmm2,xmm3
+        vpxord xmm1,xmm1,xmm2
+        vprord xmm1,xmm1,0xc
+        vpaddd xmm0,xmm0,xmm7
+        vpaddd xmm0,xmm0,xmm1
+        vpxord xmm3,xmm3,xmm0
+        vprord xmm3,xmm3,0x8
+        vpaddd xmm2,xmm2,xmm3
+        vpxord xmm1,xmm1,xmm2
+        vprord xmm1,xmm1,0x7
+        vpshufd xmm0,xmm0,0x39
+        vpshufd xmm3,xmm3,0x4e
+        vpshufd xmm2,xmm2,0x93
+        dec    al
+        je     3f
+        vshufps xmm8,xmm4,xmm5,0xd6
+        vpshufd xmm9,xmm4,0xf
+        vpshufd xmm4,xmm8,0x39
+        vshufps xmm8,xmm6,xmm7,0xfa
+        vpblendd xmm9,xmm9,xmm8,0xaa
+        vpunpcklqdq xmm8,xmm7,xmm5
+        vpblendd xmm8,xmm8,xmm6,0x88
+        vpshufd xmm8,xmm8,0x78
+        vpunpckhdq xmm5,xmm5,xmm7
+        vpunpckldq xmm6,xmm6,xmm5
+        vpshufd xmm7,xmm6,0x1e
+        vmovdqa xmm5,xmm9
+        vmovdqa xmm6,xmm8
+        jmp    3b
+3:
+        vpxor  xmm0,xmm0,xmm2
+        vpxor  xmm1,xmm1,xmm3
+        vpxor  xmm2,xmm2,XMMWORD PTR [rdi]
+        vpxor  xmm3,xmm3,XMMWORD PTR [rdi+0x10]
+        vmovdqu XMMWORD PTR [r9],xmm0
+        vmovdqu XMMWORD PTR [r9+0x10],xmm1
+        vmovdqu XMMWORD PTR [r9+0x20],xmm2
+        vmovdqu XMMWORD PTR [r9+0x30],xmm3
+        jmp    9b
+
+
 #ifdef __APPLE__
 .static_data
 #else
index c9abc13fdc4d42f600fd28a728cfe078279f7e05..52db905868928457a7bc73f81938856c7731e878 100644 (file)
@@ -223,6 +223,30 @@ void blake3_compress_xof(const uint32_t cv[8],
   blake3_compress_xof_portable(cv, block, block_len, counter, flags, out);
 }
 
+
+void blake3_xof_many(const uint32_t cv[8],
+                     const uint8_t block[BLAKE3_BLOCK_LEN],
+                     uint8_t block_len, uint64_t counter, uint8_t flags,
+                     uint8_t out[64], size_t outblocks) {
+  if (outblocks == 0) {
+    // The current assembly implementation always outputs at least 1 block.
+    return;
+  }
+#if defined(IS_X86)
+  const enum cpu_feature features = get_cpu_features();
+  MAYBE_UNUSED(features);
+#if !defined(_WIN32) && !defined(BLAKE3_NO_AVX512)
+  if (features & AVX512VL) {
+    blake3_xof_many_avx512(cv, block, block_len, counter, flags, out, outblocks);
+    return;
+  }
+#endif
+#endif
+  for(size_t i = 0; i < outblocks; ++i) {
+    blake3_compress_xof(cv, block, block_len, counter + i, flags, out + 64*i);
+  }
+}
+
 void blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs,
                       size_t blocks, const uint32_t key[8], uint64_t counter,
                       bool increment_counter, uint8_t flags,
index 98611c319d562b32d88872ae54cb2b345de64b9b..51d792a8994e6f62623dcc7b0b63cc5b71b12c66 100644 (file)
@@ -162,6 +162,13 @@ INLINE void load_key_words(const uint8_t key[BLAKE3_KEY_LEN],
   key_words[7] = load32(&key[7 * 4]);
 }
 
+INLINE void load_block_words(const uint8_t block[BLAKE3_BLOCK_LEN],
+                             uint32_t block_words[16]) {
+  for (size_t i = 0; i < 16; i++) {
+      block_words[i] = load32(&block[i * 4]);
+  }
+}
+
 INLINE void store32(void *dst, uint32_t w) {
   uint8_t *p = (uint8_t *)dst;
   p[0] = (uint8_t)(w >> 0);
@@ -191,6 +198,11 @@ void blake3_compress_xof(const uint32_t cv[8],
                          uint8_t block_len, uint64_t counter, uint8_t flags,
                          uint8_t out[64]);
 
+void blake3_xof_many(const uint32_t cv[8],
+                     const uint8_t block[BLAKE3_BLOCK_LEN],
+                     uint8_t block_len, uint64_t counter, uint8_t flags,
+                     uint8_t out[64], size_t outblocks);
+
 void blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs,
                       size_t blocks, const uint32_t key[8], uint64_t counter,
                       bool increment_counter, uint8_t flags,
@@ -270,6 +282,13 @@ void blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_inputs,
                              uint64_t counter, bool increment_counter,
                              uint8_t flags, uint8_t flags_start,
                              uint8_t flags_end, uint8_t *out);
+
+#if !defined(_WIN32)
+void blake3_xof_many_avx512(const uint32_t cv[8],
+                            const uint8_t block[BLAKE3_BLOCK_LEN],
+                            uint8_t block_len, uint64_t counter, uint8_t flags,
+                            uint8_t* out, size_t outblocks);
+#endif
 #endif
 #endif
 
index 90bdd572cacb3903999b82a15a3079f0ef8a33e1..53ce83c3b6f351087c26952ab1d37f633b0a7d2d 100644 (file)
@@ -34,7 +34,7 @@ INLINE uint32x4_t set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {
 }
 
 INLINE uint32x4_t rot16_128(uint32x4_t x) {
-  // The straightfoward implementation would be two shifts and an or, but that's
+  // The straightforward implementation would be two shifts and an or, but that's
   // slower on microarchitectures we've tested. See
   // https://github.com/BLAKE3-team/BLAKE3/pull/319.
   // return vorrq_u32(vshrq_n_u32(x, 16), vshlq_n_u32(x, 32 - 16));