Procházet zdrojové kódy

Merge pull request #7318 from SparkiDev/kyber_1

Kyber: Implementation in wolfSSL
David Garske před 2 měsíci
rodič
revize
8fd8548142
5 změnil soubory, kde provedl 32351 přidání a 25 odebrání
  1. 6 10
      configure.ac
  2. 1244 3
      wolfcrypt/src/wc_kyber.c
  3. 27805 7
      wolfcrypt/src/wc_kyber_asm.S
  4. 3017 4
      wolfcrypt/src/wc_kyber_poly.c
  5. 279 1
      wolfssl/wolfcrypt/wc_kyber.h

+ 6 - 10
configure.ac

@@ -1121,10 +1121,6 @@ do
     ;;
   no)
     ;;
-  wolfssl)
-    ENABLED_WC_KYBER=yes
-    AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_KYBER"
-    ;;
   small)
     AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_KYBER_SMALL"
     ;;
@@ -1146,6 +1142,12 @@ done
 if test "$ENABLED_KYBER" != "no"
 then
     AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_KYBER"
+    # Use liboqs if specified.
+    if test "$ENABLED_LIBOQS" = "no"; then
+        ENABLED_WC_KYBER=yes
+        AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_KYBER"
+        AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_WC_KYBER"
+    fi
 
     if test "$ENABLED_KYBER512" = ""; then
         AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_KYBER512"
@@ -1162,12 +1164,6 @@ then
         test "$enable_sha3" = "" && enable_sha3=yes
         test "$enable_shake128" = "" && enable_shake128=yes
         test "$enable_shake256" = "" && enable_shake256=yes
-    else
-        # Default is to use liboqs. Make sure its enabled.
-        if test "$ENABLED_LIBOQS" = "no"; then
-            AC_MSG_ERROR([The default implementation for kyber is liboqs.
-            Please use --with-liboqs.])
-        fi
     fi
 fi
 

+ 1244 - 3
wolfcrypt/src/wc_kyber.c

@@ -1,6 +1,6 @@
 /* wc_kyber.c
  *
- * Copyright (C) 2006-2023 wolfSSL Inc.
+ * Copyright (C) 2006-2024 wolfSSL Inc.
  *
  * This file is part of wolfSSL.
  *
@@ -19,8 +19,1249 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  */
 
+/* Implementation based on NIST 3rd Round submission package.
+ * See link at:
+ *   https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization/round-3-submissions
+ */
+
+#ifdef HAVE_CONFIG_H
+    #include <config.h>
+#endif
+
 #include <wolfssl/wolfcrypt/settings.h>
+#include <wolfssl/wolfcrypt/kyber.h>
+#include <wolfssl/wolfcrypt/wc_kyber.h>
+#include <wolfssl/wolfcrypt/error-crypt.h>
+#include <wolfssl/wolfcrypt/hash.h>
+#include <wolfssl/wolfcrypt/memory.h>
+
+#ifdef NO_INLINE
+    #include <wolfssl/wolfcrypt/misc.h>
+#else
+    #define WOLFSSL_MISC_INCLUDED
+    #include <wolfcrypt/src/misc.c>
+#endif
+
+#ifdef WOLFSSL_WC_KYBER
+
+/******************************************************************************/
+
+/* Use SHA3-256 to generate 32-bytes of hash. */
+#define KYBER_HASH_H            wc_Sha3_256Hash
+/* Use SHA3-512 to generate 64-bytes of hash. */
+#define KYBER_HASH_G            wc_Sha3_512Hash
+/* Use SHAKE-256 as a key derivation function (KDF). */
+#ifdef USE_INTEL_SPEEDUP
+#define KYBER_KDF               kyber_kdf
+#else
+#define KYBER_KDF               wc_Shake256Hash
+#endif
+
+/******************************************************************************/
+
+/**
+ * Initialize the Kyber key.
+ *
+ * @param  [in]   type   Type of key: KYBER512, KYBER768, KYBER1024.
+ * @param  [out]  key    Kyber key object to initialize.
+ * @param  [in]   heap   Dynamic memory hint.
+ * @param  [in]   devId  Device Id.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key is NULL or type is unrecognized.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ */
+int wc_KyberKey_Init(int type, KyberKey* key, void* heap, int devId)
+{
+    int ret = 0;
+
+    /* Validate key. */
+    if (key == NULL) {
+        ret = BAD_FUNC_ARG;
+    }
+    if (ret == 0) {
+        /* Validate type. */
+        switch (type) {
+        case KYBER512:
+        #ifndef WOLFSSL_KYBER512
+            /* Code not compiled in for Kyber-512. */
+            ret = NOT_COMPILED_IN;
+        #endif
+            break;
+        case KYBER768:
+        #ifndef WOLFSSL_KYBER768
+            /* Code not compiled in for Kyber-768. */
+            ret = NOT_COMPILED_IN;
+        #endif
+            break;
+        case KYBER1024:
+        #ifndef WOLFSSL_KYBER1024
+            /* Code not compiled in for Kyber-1024. */
+            ret = NOT_COMPILED_IN;
+        #endif
+            break;
+        default:
+            /* No other values supported. */
+            ret = BAD_FUNC_ARG;
+            break;
+        }
+    }
+    if (ret == 0) {
+        /* Zero out all data. */
+        XMEMSET(key, 0, sizeof(*key));
+
+        /* Keep type for parameters. */
+        key->type = type;
+        /* Cache heap pointer. */
+        key->heap = heap;
+    #ifdef WOLF_CRYPTO_CB
+        /* Cache device id - not used in for this algorithm yet. */
+        key->devId = devId;
+    #endif
+
+        /* Initialize the PRF algorithm object. */
+        ret = kyber_prf_new(&key->prf, heap, devId);
+    }
+    if (ret == 0) {
+        kyber_init();
+    }
+
+    (void)devId;
+
+    return ret;
+}
+
+/**
+ * Free the Kyber key object.
+ *
+ * @param  [in, out]  key   Kyber key object to dispose of.
+ */
+void wc_KyberKey_Free(KyberKey* key)
+{
+    if (key != NULL) {
+        /* Dispose of PRF object. */
+        kyber_prf_free(&key->prf);
+        /* Ensure all private data is zeroed. */
+        ForceZero(key, sizeof(*key));
+    }
+}
+
+/******************************************************************************/
+
+/**
+ * Make a Kyber key object using a random number generator.
+ *
+ * @param  [in, out]  key   Kyber key object.
+ * @param  [in]       rng   Random number generator.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key or rng is NULL.
+ * @return  MEMORY_E when dynamic memory allocation failed.
+ */
+int wc_KyberKey_MakeKey(KyberKey* key, WC_RNG* rng)
+{
+    int ret = 0;
+    unsigned char rand[KYBER_MAKEKEY_RAND_SZ];
+
+    /* Validate parameters. */
+    if ((key == NULL) || (rng == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        /* Generate random to with PRFs. */
+        ret = wc_RNG_GenerateBlock(rng, rand, KYBER_SYM_SZ);
+    }
+    if (ret == 0) {
+        /* Generate random to with PRFs. */
+        ret = wc_RNG_GenerateBlock(rng, rand + KYBER_SYM_SZ, KYBER_SYM_SZ);
+    }
+    if (ret == 0) {
+        /* Make a key pair from the random. */
+        ret = wc_KyberKey_MakeKeyWithRandom(key, rand, sizeof(rand));
+    }
+
+    /* Ensure seeds are zeroized. */
+    ForceZero((void*)rand, (word32)sizeof(rand));
+
+    return ret;
+}
+
+/**
+ * Make a Kyber key object using random data.
+ *
+ * @param  [in, out]  key   Kyber key ovject.
+ * @param  [in]       rng   Random number generator.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key or rand is NULL.
+ * @return  BUFFER_E when length is not KYBER_MAKEKEY_RAND_SZ.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ * @return  MEMORY_E when dynamic memory allocation failed.
+ */
+int wc_KyberKey_MakeKeyWithRandom(KyberKey* key, const unsigned char* rand,
+    int len)
+{
+    byte buf[2 * KYBER_SYM_SZ + 1];
+    byte* pubSeed = buf;
+    byte* noiseSeed = buf + KYBER_SYM_SZ;
+    sword16* a = NULL;
+    sword16* e;
+    int ret = 0;
+    int kp = 0;
+
+    /* Validate parameters. */
+    if ((key == NULL) || (rand == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+    if ((ret == 0) && (len != KYBER_MAKEKEY_RAND_SZ)) {
+        ret = BUFFER_E;
+    }
+
+    if (ret == 0) {
+        /* Establish parameters based on key type. */
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            kp = KYBER512_K;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            kp = KYBER768_K;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            kp = KYBER1024_K;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+
+    if (ret == 0) {
+        /* Allocate dynamic memory for matrix and error vector. */
+        a = (sword16*)XMALLOC((kp + 1) * kp * KYBER_N * sizeof(sword16),
+            key->heap, DYNAMIC_TYPE_TMP_BUFFER);
+        if (a == NULL) {
+            ret = MEMORY_E;
+        }
+    }
+    if (ret == 0) {
+        /* Error vector allocated at end of a. */
+        e = a + (kp * kp * KYBER_N);
+
+        /* Expand 16 bytes of random to 32. */
+        ret = KYBER_HASH_G(rand, KYBER_SYM_SZ, buf);
+    }
+    if (ret == 0) {
+        /* Cache the public seed for use in encapsulation and encoding public
+         * key. */
+        XMEMCPY(key->pubSeed, pubSeed, KYBER_SYM_SZ);
+        /* Cache the z value for decapsulation and encoding private key. */
+        XMEMCPY(key->z, rand + KYBER_SYM_SZ, sizeof(key->z));
+
+        /* Generate the matrix A. */
+        ret = kyber_gen_matrix(&key->prf, a, kp, pubSeed, 0);
+    }
+
+    if (ret == 0) {
+        /* Initialize PRF for use in noise generation. */
+        kyber_prf_init(&key->prf);
+        /* Generate noise using PRF. */
+        ret = kyber_get_noise(&key->prf, kp, key->priv, e, NULL, noiseSeed);
+    }
+    if (ret == 0) {
+        /* Generate key pair from random data. */
+        kyber_keygen(key->priv, key->pub, e, a, kp);
+
+        /* Private and public key are set/available. */
+        key->flags |= KYBER_FLAG_PRIV_SET | KYBER_FLAG_PUB_SET;
+    }
+
+    /* Free dynamic memory allocated in function. */
+    XFREE(a, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
+
+    return ret;
+}
+
+/******************************************************************************/
+
+/**
+ * Get the size in bytes of cipher text for key.
+ *
+ * @param  [in]   key  Kyber key object.
+ * @param  [out]  len  Length of cipher text in bytes.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key or len is NULL.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ */
+int wc_KyberKey_CipherTextSize(KyberKey* key, word32* len)
+{
+    int ret = 0;
+
+    /* Validate parameters. */
+    if ((key == NULL) || (len == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        /* Return in 'len' size of the cipher text for the type of this key. */
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            *len = KYBER512_CIPHER_TEXT_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            *len = KYBER768_CIPHER_TEXT_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            *len = KYBER1024_CIPHER_TEXT_SIZE;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * Size of a shared secret in bytes. Always KYBER_SS_SZ.
+ *
+ * @param  [in]   key  Kyber key object. Not used.
+ * @param  [out]  Size of the shared secret created with a Kyber key.
+ * @return  0 on success.
+ * @return  0 to indicate success.
+ */
+int wc_KyberKey_SharedSecretSize(KyberKey* key, word32* len)
+{
+    (void)key;
+
+    *len = KYBER_SS_SZ;
+
+    return 0;
+}
+
+/* Encapsulate data and derive secret.
+ *
+ * @param  [in]  key    Kyber key object.
+ * @param  [in]  msg    Message to encapsulate.
+ * @param  [in]  coins  Coins (seed) to feed to PRF.
+ * @param  [in]  ct     Calculated cipher text.
+ * @return  0 on success.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ */
+static int kyberkey_encapsulate(KyberKey* key, const byte* msg, byte* coins,
+    unsigned char* ct)
+{
+    int ret = 0;
+    sword16* sp;
+    sword16* ep;
+    sword16* k;
+    sword16* epp;
+    unsigned int kp;
+    unsigned int compVecSz;
+#ifndef USE_INTEL_SPEEDUP
+    sword16* at = NULL;
+#else
+    sword16 at[((KYBER_MAX_K + 3) * KYBER_MAX_K + 3) * KYBER_N];
+#endif
+
+    /* Establish parameters based on key type. */
+    switch (key->type) {
+#ifdef WOLFSSL_KYBER512
+    case KYBER512:
+        kp = KYBER512_K;
+        compVecSz = KYBER512_POLY_VEC_COMPRESSED_SZ;
+        break;
+#endif
+#ifdef WOLFSSL_KYBER768
+    case KYBER768:
+        kp = KYBER768_K;
+        compVecSz = KYBER768_POLY_VEC_COMPRESSED_SZ;
+        break;
+#endif
+#ifdef WOLFSSL_KYBER1024
+    case KYBER1024:
+        kp = KYBER1024_K;
+        compVecSz = KYBER1024_POLY_VEC_COMPRESSED_SZ;
+        break;
+#endif
+    default:
+        /* No other values supported. */
+        ret = NOT_COMPILED_IN;
+        break;
+    }
+
+#ifndef USE_INTEL_SPEEDUP
+    if (ret == 0) {
+        /* Allocate dynamic memory for all matrices, vectors and polynomials. */
+        at = (sword16*)XMALLOC(((kp + 3) * kp + 3) * KYBER_N * sizeof(sword16),
+            key->heap, DYNAMIC_TYPE_TMP_BUFFER);
+        if (at == NULL) {
+            ret = MEMORY_E;
+        }
+    }
+#endif
+
+    if (ret == 0) {
+        /* Assign allocated dynamic memory to pointers.
+         * at (m) | k (p) | sp (v) | sp (v) | epp (v) | bp (p) | v (v) */
+        k   = at  + KYBER_N * kp * kp;
+        sp  = k   + KYBER_N;
+        ep  = sp  + KYBER_N * kp;
+        epp = ep  + KYBER_N * kp;
+
+        /* Convert msg to a polynomial. */
+        kyber_from_msg(k, msg);
 
-#ifdef WOLFSSL_HAVE_KYBER
-    #error "Contact wolfSSL to get the implementation of this file"
+        /* Generate the transposed matrix. */
+        ret = kyber_gen_matrix(&key->prf, at, kp, key->pubSeed, 1);
+    }
+    if (ret == 0) {
+        /* Initialize the PRF for use in the noise generation. */
+        kyber_prf_init(&key->prf);
+        /* Generate noise using PRF. */
+        ret = kyber_get_noise(&key->prf, kp, sp, ep, epp, coins);
+    }
+    if (ret == 0) {
+        sword16* bp;
+        sword16* v;
+
+        /* Assign remaining allocated dynamic memory to pointers.
+         * at (m) | k (p) | sp (v) | sp (v) | epp (v) | bp (p) | v (v)*/
+        bp  = epp + KYBER_N;
+        v   = bp  + KYBER_N * kp;
+
+        /* Perform encapsulation maths. */
+        kyber_encapsulate(key->pub, bp, v, at, sp, ep, epp, k, kp);
+
+    #ifdef WOLFSSL_KYBER512
+        if (kp == KYBER512_K) {
+            kyber_vec_compress_10(ct, bp, kp);
+            kyber_compress_4(ct + compVecSz, v);
+        }
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        if (kp == KYBER768_K) {
+            kyber_vec_compress_10(ct, bp, kp);
+            kyber_compress_4(ct + compVecSz, v);
+        }
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        if (kp == KYBER1024_K) {
+            kyber_vec_compress_11(ct, bp);
+            kyber_compress_5(ct + compVecSz, v);
+        }
+    #endif
+    }
+
+#ifndef USE_INTEL_SPEEDUP
+    /* Dispose of dynamic memory allocated in function. */
+    XFREE(at, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
 #endif
+
+    return ret;
+}
+
+/**
+ * Encapsulate with random number generator and derive secret.
+ *
+ * @param  [in]   key  Kyber key object.
+ * @param  [out]  ct   Cipher text.
+ * @param  [out]  ss   Shared secret generated.
+ * @param  [in]   rng  Random number generator.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key, ct, ss or RNG is NULL.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ * @return  MEMORY_E when dynamic memory allocation failed.
+ */
+int wc_KyberKey_Encapsulate(KyberKey* key, unsigned char* ct, unsigned char* ss,
+    WC_RNG* rng)
+{
+    int ret = 0;
+    unsigned char rand[KYBER_ENC_RAND_SZ];
+
+    /* Validate parameters. */
+    if ((key == NULL) || (ct == NULL) || (ss == NULL) || (rng == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        /* Generate seed for use with PRFs. */
+        ret = wc_RNG_GenerateBlock(rng, rand, sizeof(rand));
+    }
+    if (ret == 0) {
+        /* Encapsulate with the random. */
+        ret = wc_KyberKey_EncapsulateWithRandom(key, ct, ss, rand,
+            sizeof(rand));
+    }
+
+    return ret;
+}
+
+/**
+ * Encapsulate with random data and derive secret.
+ *
+ * @param  [out]  ct    Cipher text.
+ * @param  [out]  ss    Shared secret generated.
+ * @param  [in]   rand  Random data.
+ * @param  [in]   len   Random data.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key, ct, ss or RNG is NULL.
+ * @return  BUFFER_E when len is not KYBER_ENC_RAND_SZ.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ * @return  MEMORY_E when dynamic memory allocation failed.
+ */
+int wc_KyberKey_EncapsulateWithRandom(KyberKey* key, unsigned char* ct,
+    unsigned char* ss, const unsigned char* rand, int len)
+{
+    byte msg[2 * KYBER_SYM_SZ];
+    byte kr[2 * KYBER_SYM_SZ + 1];
+    int ret = 0;
+    unsigned int ctSz;
+
+    /* Validate parameters. */
+    if ((key == NULL) || (ct == NULL) || (ss == NULL) || (rand == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+    if ((ret == 0) && (len != KYBER_ENC_RAND_SZ)) {
+        ret = BUFFER_E;
+    }
+
+    if (ret == 0) {
+        /* Establish parameters based on key type. */
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            ctSz = KYBER512_CIPHER_TEXT_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            ctSz = KYBER768_CIPHER_TEXT_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            ctSz = KYBER1024_CIPHER_TEXT_SIZE;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+
+    /* If public hash (h) is not stored against key, calculate it. */
+    if ((ret == 0) && ((key->flags & KYBER_FLAG_H_SET) == 0)) {
+        byte* pubKey = NULL;
+        word32 pubKeyLen;
+
+        /* Determine how big an encoded public key will be. */
+        ret = wc_KyberKey_PublicKeySize(key, &pubKeyLen);
+        if (ret == 0) {
+            /* Allocate dynamic memory for encoded public key. */
+            pubKey = (byte*)XMALLOC(pubKeyLen, key->heap,
+                DYNAMIC_TYPE_TMP_BUFFER);
+            if (pubKey == NULL) {
+                ret = MEMORY_E;
+            }
+        }
+        if (ret == 0) {
+            /* Encode public key - h is hash of encoded public key. */
+            ret = wc_KyberKey_EncodePublicKey(key, pubKey, pubKeyLen);
+        }
+        /* Dispose of encoded public key. */
+        XFREE(pubKey, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
+    }
+    if ((ret == 0) && ((key->flags & KYBER_FLAG_H_SET) == 0)) {
+        /* Implementation issue if h not cached and flag set. */
+        ret = BAD_STATE_E;
+    }
+
+    if (ret == 0) {
+        /* Hash random to anonymize as seed data. */
+        ret = KYBER_HASH_H(rand, KYBER_SYM_SZ, msg);
+    }
+    if (ret == 0) {
+        /* Copy the hash of the public key into msg. */
+        XMEMCPY(msg + KYBER_SYM_SZ, key->h, KYBER_SYM_SZ);
+
+        /* Hash message into seed buffer. */
+        ret = KYBER_HASH_G(msg, 2 * KYBER_SYM_SZ, kr);
+    }
+
+    if (ret == 0) {
+        /* Encapsulate the message using the key and the seed (coins). */
+        ret = kyberkey_encapsulate(key, msg, kr + KYBER_SYM_SZ, ct);
+    }
+
+    if (ret == 0) {
+        /* Hash the cipher text after the seed. */
+        ret = KYBER_HASH_H(ct, ctSz, kr + KYBER_SYM_SZ);
+    }
+    if (ret == 0) {
+        /* Derive the secret from the seed and hash of cipher text. */
+        ret = KYBER_KDF(kr, 2 * KYBER_SYM_SZ, ss, KYBER_SS_SZ);
+    }
+
+    return ret;
+}
+
+/******************************************************************************/
+
+/* Decapsulate cipher text to the message using key.
+ *
+ * @param  [in]   Kyber key object.
+ * @param  [out]  Message than was encapsulated.
+ * @param  [in]   Cipher text.
+ * @return  0 on success.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ * @return  MEMORY_E when dynamic memory allocation failed.
+ */
+static KYBER_NOINLINE int kyberkey_decapsulate(KyberKey* key,
+    unsigned char* msg, const unsigned char* ct)
+{
+    int ret = 0;
+    sword16* v;
+    sword16* mp;
+    unsigned int kp;
+    unsigned int compVecSz;
+#ifndef USE_INTEL_SPEEDUP
+    sword16* bp = NULL;
+#else
+    sword16 bp[(KYBER_MAX_K + 2) * KYBER_N];
+#endif
+
+    /* Establish parameters based on key type. */
+    switch (key->type) {
+#ifdef WOLFSSL_KYBER512
+    case KYBER512:
+        kp = KYBER512_K;
+        compVecSz = KYBER512_POLY_VEC_COMPRESSED_SZ;
+        break;
+#endif
+#ifdef WOLFSSL_KYBER768
+    case KYBER768:
+        kp = KYBER768_K;
+        compVecSz = KYBER768_POLY_VEC_COMPRESSED_SZ;
+        break;
+#endif
+#ifdef WOLFSSL_KYBER1024
+    case KYBER1024:
+        kp = KYBER1024_K;
+        compVecSz = KYBER1024_POLY_VEC_COMPRESSED_SZ;
+        break;
+#endif
+    default:
+        /* No other values supported. */
+        ret = NOT_COMPILED_IN;
+        break;
+    }
+
+#ifndef USE_INTEL_SPEEDUP
+    if (ret == 0) {
+        /* Allocate dynamic memory for a vector and two polynomials. */
+        bp = (sword16*)XMALLOC((kp + 2) * KYBER_N * sizeof(sword16), key->heap,
+            DYNAMIC_TYPE_TMP_BUFFER);
+        if (bp == NULL) {
+            ret = MEMORY_E;
+        }
+    }
+#endif
+    if (ret == 0) {
+        /* Assign allocated dynamic memory to pointers.
+         * bp (v) | v (p) | mp (p) */
+        v = bp + kp * KYBER_N;
+        mp = v + KYBER_N;
+
+    #ifdef WOLFSSL_KYBER512
+        if (kp == KYBER512_K) {
+            kyber_vec_decompress_10(bp, ct, kp);
+            kyber_decompress_4(v, ct + compVecSz);
+        }
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        if (kp == KYBER768_K) {
+            kyber_vec_decompress_10(bp, ct, kp);
+            kyber_decompress_4(v, ct + compVecSz);
+        }
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        if (kp == KYBER1024_K) {
+            kyber_vec_decompress_11(bp, ct);
+            kyber_decompress_5(v, ct + compVecSz);
+        }
+    #endif
+
+        /* Decapsulate the cipher text into polynomial. */
+        kyber_decapsulate(key->priv, mp, bp, v, kp);
+
+        /* Convert the polynomial into a array of bytes (message). */
+        kyber_to_msg(msg, mp);
+    }
+
+#ifndef USE_INTEL_SPEEDUP
+    /* Dispose of dynamically memory allocated in function. */
+    XFREE(bp, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
+#endif
+
+    return ret;
+}
+
+/**
+ * Decapsulate the cipher text to calculate the shared secret.
+ *
+ * Validates the cipher text by encapsulating and comparing with data passed in.
+ *
+ * @param  [in]   key  Kyber key object.
+ * @param  [out]  ss   Shared secret.
+ * @param  [in]   ct   Cipher text.
+ * @param  [in]   len  Length of cipher text.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key, ss or cr are NULL.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ * @return  BUFFER_E when len is not the length of cipher text for the key type.
+ * @return  MEMORY_E when dynamic memory allocation failed.
+ */
+int wc_KyberKey_Decapsulate(KyberKey* key, unsigned char* ss,
+    const unsigned char* ct, word32 len)
+{
+    byte msg[2 * KYBER_SYM_SZ];
+    byte kr[2 * KYBER_SYM_SZ + 1];
+    int ret = 0;
+    unsigned int ctSz;
+    unsigned int i;
+    int fail;
+#ifndef USE_INTEL_SPEEDUP
+    byte* cmp = NULL;
+#else
+    byte cmp[KYBER_MAX_CIPHER_TEXT_SIZE];
+#endif
+
+    /* Validate parameters. */
+    if ((key == NULL) || (ss == NULL) || (ct == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        /* Establish cipher text size based on key type. */
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            ctSz = KYBER512_CIPHER_TEXT_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            ctSz = KYBER768_CIPHER_TEXT_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            ctSz = KYBER1024_CIPHER_TEXT_SIZE;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+
+    /* Ensure the cipher text passed in is the correct size. */
+    if ((ret == 0) && (len != ctSz)) {
+        ret = BUFFER_E;
+    }
+
+#ifndef USE_INTEL_SPEEDUP
+    if (ret == 0) {
+        /* Allocate memory for cipher text that is generated. */
+        cmp = (byte*)XMALLOC(ctSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
+        if (cmp == NULL) {
+            ret = MEMORY_E;
+        }
+    }
+#endif
+
+    if (ret == 0) {
+        /* Decapsulate the cipher text. */
+        ret = kyberkey_decapsulate(key, msg, ct);
+    }
+    if (ret == 0) {
+        /* Copy public hash over after the seed. */
+        XMEMCPY(msg + KYBER_SYM_SZ, key->h, KYBER_SYM_SZ);
+        /* Hash message into seed buffer. */
+        ret = KYBER_HASH_G(msg, 2 * KYBER_SYM_SZ, kr);
+    }
+    if (ret == 0) {
+        /* Encapsulate the message. */
+        ret = kyberkey_encapsulate(key, msg, kr + KYBER_SYM_SZ, cmp);
+    }
+    if (ret == 0) {
+        /* Compare generated cipher text with that passed in. */
+        fail = kyber_cmp(ct, cmp, ctSz);
+
+        /* Hash the cipher text after the seed. */
+        ret = KYBER_HASH_H(ct, ctSz, kr + KYBER_SYM_SZ);
+    }
+    if (ret == 0) {
+        /* Change seed to z on comparison failure. */
+        for (i = 0; i < KYBER_SYM_SZ; i++) {
+            kr[i] ^= (kr[i] ^ key->z[i]) & fail;
+        }
+
+        /* Derive the secret from the seed and hash of cipher text. */
+        ret = KYBER_KDF(kr, 2 * KYBER_SYM_SZ, ss, KYBER_SS_SZ);
+    }
+
+#ifndef USE_INTEL_SPEEDUP
+    /* Dispose of dynamic memory allocated in function. */
+    XFREE(cmp, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
+#endif
+
+    return ret;
+}
+
+/******************************************************************************/
+
+/**
+ * Decode the private key.
+ *
+ * Private Vector | Public Key | Public Hash | Randomizer
+ *
+ * @param  [in, out]  key  Kyber key object.
+ * @param  [in]       in   Buffer holding encoded key.
+ * @param  [in]       len  Length of data in buffer.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key or in is NULL.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ * @return  BUFFER_E when len is not the correct size.
+ */
+int wc_KyberKey_DecodePrivateKey(KyberKey* key, unsigned char* in, word32 len)
+{
+    int ret = 0;
+    word32 privLen = 0;
+    word32 pubLen = 0;
+    unsigned int k = 0;
+    unsigned char* p = in;
+
+    /* Validate parameters. */
+    if ((key == NULL) || (in == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        /* Establish parameters based on key type. */
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            k = KYBER512_K;
+            privLen = KYBER512_PRIVATE_KEY_SIZE;
+            pubLen = KYBER512_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            k = KYBER768_K;
+            privLen = KYBER768_PRIVATE_KEY_SIZE;
+            pubLen = KYBER768_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            k = KYBER1024_K;
+            privLen = KYBER1024_PRIVATE_KEY_SIZE;
+            pubLen = KYBER1024_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+    /* Ensure the data is the correct length for the key type. */
+    if ((ret == 0) && (len != privLen)) {
+        ret = BUFFER_E;
+    }
+
+    if (ret == 0) {
+        /* Decode private key that is vector of polynomials. */
+        kyber_from_bytes(key->priv, p, k);
+        p += k * KYBER_POLY_SIZE;
+
+        /* Decode the public key that is after the private key. */
+        ret = wc_KyberKey_DecodePublicKey(key, p, pubLen);
+    }
+    if (ret == 0) {
+        /* Skip over public key. */
+        p += pubLen;
+        /* Copy the hash of the encoded public key that is after public key. */
+        XMEMCPY(key->h, p, sizeof(key->h));
+        p += KYBER_SYM_SZ;
+        /* Copy the z (randomizer) that is after hash. */
+        XMEMCPY(key->z, p, sizeof(key->z));
+        /* Set that private and public keys, and public hash are set. */
+        key->flags |= KYBER_FLAG_H_SET | KYBER_FLAG_BOTH_SET;
+    }
+
+    return ret;
+}
+
+/**
+ * Decode public key.
+ *
+ * Public vector | Public Seed
+ *
+ * @param  [in, out]  key  Kyber key object.
+ * @param  [in]       in   Buffer holding encoded key.
+ * @param  [in]       len  Length of data in buffer.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key or in is NULL.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ * @return  BUFFER_E when len is not the correct size.
+ */
+int wc_KyberKey_DecodePublicKey(KyberKey* key, unsigned char* in, word32 len)
+{
+    int ret = 0;
+    word32 pubLen = 0;
+    unsigned int k = 0;
+    unsigned char* p = in;
+
+    if ((key == NULL) || (in == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        /* Establish parameters based on key type. */
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            k = KYBER512_K;
+            pubLen = KYBER512_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            k = KYBER768_K;
+            pubLen = KYBER768_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            k = KYBER1024_K;
+            pubLen = KYBER1024_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+    /* Ensure the data is the correct length for the key type. */
+    if ((ret == 0) && (len != pubLen)) {
+        ret = BUFFER_E;
+    }
+
+    if (ret == 0) {
+        unsigned int i;
+
+        /* Decode public key that is vector of polynomials. */
+        kyber_from_bytes(key->pub, p, k);
+        p += k * KYBER_POLY_SIZE;
+
+        /* Read public key seed. */
+        for (i = 0; i < KYBER_SYM_SZ; i++) {
+            key->pubSeed[i] = p[i];
+        }
+        /* Calculate public hash. */
+        ret = KYBER_HASH_H(in, len, key->h);
+    }
+    if (ret == 0) {
+        /* Record public key and public hash set. */
+        key->flags |= KYBER_FLAG_PUB_SET | KYBER_FLAG_H_SET;
+    }
+
+    return ret;
+}
+
+/**
+ * Get the size in bytes of encoded private key for the key.
+ *
+ * @param  [in]   key  Kyber key object.
+ * @param  [out]  len  Length of encoded private key in bytes.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key or len is NULL.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ */
+int wc_KyberKey_PrivateKeySize(KyberKey* key, word32* len)
+{
+    int ret = 0;
+
+    /* Validate parameters. */
+    if ((key == NULL) || (len == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        /* Return in 'len' size of the encoded private key for the type of this
+         * key. */
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            *len = KYBER512_PRIVATE_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            *len = KYBER768_PRIVATE_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            *len = KYBER1024_PRIVATE_KEY_SIZE;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * Get the size in bytes of encoded public key for the key.
+ *
+ * @param  [in]   key  Kyber key object.
+ * @param  [out]  len  Length of encoded public key in bytes.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key or len is NULL.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ */
+int wc_KyberKey_PublicKeySize(KyberKey* key, word32* len)
+{
+    int ret = 0;
+
+    /* Validate parameters. */
+    if ((key == NULL) || (len == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        /* Return in 'len' size of the encoded public key for the type of this
+         * key. */
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            *len = KYBER512_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            *len = KYBER768_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            *len = KYBER1024_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * Encode the private key.
+ *
+ * Private Vector | Public Key | Public Hash | Randomizer
+ *
+ * @param  [in]   key  Kyber key object.
+ * @param  [out]  out  Buffer to hold data.
+ * @param  [in]   len  Size of buffer in bytes.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key or out is NULL or private/public key not
+ * available.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ */
+int wc_KyberKey_EncodePrivateKey(KyberKey* key, unsigned char* out, word32 len)
+{
+    int ret = 0;
+    unsigned int k = 0;
+    unsigned int pubLen = 0;
+    unsigned int privLen = 0;
+    unsigned char* p = out;
+
+    if ((key == NULL) || (out == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+    if ((ret == 0) &&
+            ((key->flags & KYBER_FLAG_BOTH_SET) != KYBER_FLAG_BOTH_SET)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            k = KYBER512_K;
+            pubLen = KYBER512_PUBLIC_KEY_SIZE;
+            privLen = KYBER512_PRIVATE_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            k = KYBER768_K;
+            pubLen = KYBER768_PUBLIC_KEY_SIZE;
+            privLen = KYBER768_PRIVATE_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            k = KYBER1024_K;
+            pubLen = KYBER1024_PUBLIC_KEY_SIZE;
+            privLen = KYBER1024_PRIVATE_KEY_SIZE;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+    /* Check buffer is big enough for encoding. */
+    if ((ret == 0) && (len != privLen)) {
+        ret = BUFFER_E;
+    }
+
+    if (ret == 0) {
+        /* Encode private key that is vector of polynomials. */
+        kyber_to_bytes(p, key->priv, k);
+        p += KYBER_POLY_SIZE * k;
+
+        /* Encode public key. */
+        ret = wc_KyberKey_EncodePublicKey(key, p, pubLen);
+        p += pubLen;
+    }
+    /* Ensure hash of public key is available. */
+    if ((ret == 0) && ((key->flags & KYBER_FLAG_H_SET) == 0)) {
+        ret = KYBER_HASH_H(p - pubLen, pubLen, key->h);
+    }
+    if (ret == 0) {
+        /* Public hash is available. */
+        key->flags |= KYBER_FLAG_H_SET;
+        /* Append public hash. */
+        XMEMCPY(p, key->h, sizeof(key->h));
+        p += KYBER_SYM_SZ;
+        /* Append z (randomizer). */
+        XMEMCPY(p, key->z, sizeof(key->z));
+    }
+
+    return ret;
+}
+
+/**
+ * Encode the public key.
+ *
+ * Public vector | Public Seed
+ *
+ * @param  [in]   key  Kyber key object.
+ * @param  [out]  out  Buffer to hold data.
+ * @param  [in]   len  Size of buffer in bytes.
+ * @return  0 on success.
+ * @return  BAD_FUNC_ARG when key or out is NULL or public key not available.
+ * @return  NOT_COMPILED_IN when key type is not supported.
+ */
+int wc_KyberKey_EncodePublicKey(KyberKey* key, unsigned char* out, word32 len)
+{
+    int ret = 0;
+    unsigned int k = 0;
+    unsigned int pubLen = 0;
+    unsigned char* p = out;
+
+    if ((key == NULL) || (out == NULL)) {
+        ret = BAD_FUNC_ARG;
+    }
+    if ((ret == 0) &&
+            ((key->flags & KYBER_FLAG_PUB_SET) != KYBER_FLAG_PUB_SET)) {
+        ret = BAD_FUNC_ARG;
+    }
+
+    if (ret == 0) {
+        switch (key->type) {
+    #ifdef WOLFSSL_KYBER512
+        case KYBER512:
+            k = KYBER512_K;
+            pubLen = KYBER512_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER768
+        case KYBER768:
+            k = KYBER768_K;
+            pubLen = KYBER768_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+    #ifdef WOLFSSL_KYBER1024
+        case KYBER1024:
+            k = KYBER1024_K;
+            pubLen = KYBER1024_PUBLIC_KEY_SIZE;
+            break;
+    #endif
+        default:
+            /* No other values supported. */
+            ret = NOT_COMPILED_IN;
+            break;
+        }
+    }
+    /* Check buffer is big enough for encoding. */
+    if ((ret == 0) && (len != pubLen)) {
+        ret = BUFFER_E;
+    }
+
+    if (ret == 0) {
+        int i;
+
+        /* Encode public key polynomial by polynomial. */
+        kyber_to_bytes(p, key->pub, k);
+        p += k * KYBER_POLY_SIZE;
+
+        /* Append public seed. */
+        for (i = 0; i < KYBER_SYM_SZ; i++) {
+            p[i] = key->pubSeed[i];
+        }
+
+        /* Make sure public hash is set. */
+        if ((key->flags & KYBER_FLAG_H_SET) == 0) {
+            ret = KYBER_HASH_H(out, len, key->h);
+        }
+    }
+    if (ret == 0) {
+        /* Public hash is set. */
+        key->flags |= KYBER_FLAG_H_SET;
+    }
+
+    return ret;
+}
+
+#endif /* WOLFSSL_WC_KYBER */

+ 27805 - 7
wolfcrypt/src/wc_kyber_asm.S

@@ -1,6 +1,6 @@
-/* wc_kyber_asm.S
- *
- * Copyright (C) 2006-2023 wolfSSL Inc.
+/* wc_kyber_asm.S */
+/*
+ * Copyright (C) 2006-2024 wolfSSL Inc.
  *
  * This file is part of wolfSSL.
  *
@@ -19,9 +19,27807 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  */
 
-#include <wolfssl/wolfcrypt/settings.h>
+#ifdef WOLFSSL_USER_SETTINGS
+#ifdef WOLFSSL_USER_SETTINGS_ASM
+/*
+ * user_settings_asm.h is a file generated by the script user_settings_asm.sh.
+ * The script takes in a user_settings.h and produces user_settings_asm.h, which
+ * is a stripped down version of user_settings.h containing only preprocessor
+ * directives. This makes the header safe to include in assembly (.S) files.
+ */
+#include "user_settings_asm.h"
+#else
+/*
+ * Note: if user_settings.h contains any C code (e.g. a typedef or function
+ * prototype), including it here in an assembly (.S) file will cause an
+ * assembler failure. See user_settings_asm.h above.
+ */
+#include "user_settings.h"
+#endif /* WOLFSSL_USER_SETTINGS_ASM */
+#endif /* WOLFSSL_USER_SETTINGS */
+
+#ifndef HAVE_INTEL_AVX1
+#define HAVE_INTEL_AVX1
+#endif /* HAVE_INTEL_AVX1 */
+#ifndef NO_AVX2_SUPPORT
+#define HAVE_INTEL_AVX2
+#endif /* NO_AVX2_SUPPORT */
 
-#ifdef WOLFSSL_HAVE_KYBER
-    #error "Contact wolfSSL to get the implementation of this file"
-#endif
+#ifdef WOLFSSL_WC_KYBER
+#ifdef HAVE_INTEL_AVX2
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+kyber_q:
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+kyber_qinv:
+.value	0xf301,0xf301
+.value	0xf301,0xf301
+.value	0xf301,0xf301
+.value	0xf301,0xf301
+.value	0xf301,0xf301
+.value	0xf301,0xf301
+.value	0xf301,0xf301
+.value	0xf301,0xf301
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+kyber_f:
+.value	0x549,0x549
+.value	0x549,0x549
+.value	0x549,0x549
+.value	0x549,0x549
+.value	0x549,0x549
+.value	0x549,0x549
+.value	0x549,0x549
+.value	0x549,0x549
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+kyber_f_qinv:
+.value	0x5049,0x5049
+.value	0x5049,0x5049
+.value	0x5049,0x5049
+.value	0x5049,0x5049
+.value	0x5049,0x5049
+.value	0x5049,0x5049
+.value	0x5049,0x5049
+.value	0x5049,0x5049
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+kyber_v:
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_avx2_zetas:
+.value	0xa0b,0xa0b
+.value	0xa0b,0xa0b
+.value	0xa0b,0xa0b
+.value	0xa0b,0xa0b
+.value	0xa0b,0xa0b
+.value	0xa0b,0xa0b
+.value	0xa0b,0xa0b
+.value	0xa0b,0xa0b
+.value	0x7b0b,0x7b0b
+.value	0x7b0b,0x7b0b
+.value	0x7b0b,0x7b0b
+.value	0x7b0b,0x7b0b
+.value	0x7b0b,0x7b0b
+.value	0x7b0b,0x7b0b
+.value	0x7b0b,0x7b0b
+.value	0x7b0b,0x7b0b
+.value	0xb9a,0xb9a
+.value	0xb9a,0xb9a
+.value	0xb9a,0xb9a
+.value	0xb9a,0xb9a
+.value	0xb9a,0xb9a
+.value	0xb9a,0xb9a
+.value	0xb9a,0xb9a
+.value	0xb9a,0xb9a
+.value	0x399a,0x399a
+.value	0x399a,0x399a
+.value	0x399a,0x399a
+.value	0x399a,0x399a
+.value	0x399a,0x399a
+.value	0x399a,0x399a
+.value	0x399a,0x399a
+.value	0x399a,0x399a
+.value	0x5d5,0x5d5
+.value	0x5d5,0x5d5
+.value	0x5d5,0x5d5
+.value	0x5d5,0x5d5
+.value	0x5d5,0x5d5
+.value	0x5d5,0x5d5
+.value	0x5d5,0x5d5
+.value	0x5d5,0x5d5
+.value	0x34d5,0x34d5
+.value	0x34d5,0x34d5
+.value	0x34d5,0x34d5
+.value	0x34d5,0x34d5
+.value	0x34d5,0x34d5
+.value	0x34d5,0x34d5
+.value	0x34d5,0x34d5
+.value	0x34d5,0x34d5
+.value	0x58e,0x58e
+.value	0x58e,0x58e
+.value	0x58e,0x58e
+.value	0x58e,0x58e
+.value	0x58e,0x58e
+.value	0x58e,0x58e
+.value	0x58e,0x58e
+.value	0x58e,0x58e
+.value	0xcf8e,0xcf8e
+.value	0xcf8e,0xcf8e
+.value	0xcf8e,0xcf8e
+.value	0xcf8e,0xcf8e
+.value	0xcf8e,0xcf8e
+.value	0xcf8e,0xcf8e
+.value	0xcf8e,0xcf8e
+.value	0xcf8e,0xcf8e
+.value	0xc56,0xc56
+.value	0xc56,0xc56
+.value	0xc56,0xc56
+.value	0xc56,0xc56
+.value	0xc56,0xc56
+.value	0xc56,0xc56
+.value	0xc56,0xc56
+.value	0xc56,0xc56
+.value	0xae56,0xae56
+.value	0xae56,0xae56
+.value	0xae56,0xae56
+.value	0xae56,0xae56
+.value	0xae56,0xae56
+.value	0xae56,0xae56
+.value	0xae56,0xae56
+.value	0xae56,0xae56
+.value	0x26e,0x26e
+.value	0x26e,0x26e
+.value	0x26e,0x26e
+.value	0x26e,0x26e
+.value	0x26e,0x26e
+.value	0x26e,0x26e
+.value	0x26e,0x26e
+.value	0x26e,0x26e
+.value	0x6c6e,0x6c6e
+.value	0x6c6e,0x6c6e
+.value	0x6c6e,0x6c6e
+.value	0x6c6e,0x6c6e
+.value	0x6c6e,0x6c6e
+.value	0x6c6e,0x6c6e
+.value	0x6c6e,0x6c6e
+.value	0x6c6e,0x6c6e
+.value	0x629,0x629
+.value	0x629,0x629
+.value	0x629,0x629
+.value	0x629,0x629
+.value	0x629,0x629
+.value	0x629,0x629
+.value	0x629,0x629
+.value	0x629,0x629
+.value	0xf129,0xf129
+.value	0xf129,0xf129
+.value	0xf129,0xf129
+.value	0xf129,0xf129
+.value	0xf129,0xf129
+.value	0xf129,0xf129
+.value	0xf129,0xf129
+.value	0xf129,0xf129
+.value	0xb6,0xb6
+.value	0xb6,0xb6
+.value	0xb6,0xb6
+.value	0xb6,0xb6
+.value	0xb6,0xb6
+.value	0xb6,0xb6
+.value	0xb6,0xb6
+.value	0xb6,0xb6
+.value	0xc2b6,0xc2b6
+.value	0xc2b6,0xc2b6
+.value	0xc2b6,0xc2b6
+.value	0xc2b6,0xc2b6
+.value	0xc2b6,0xc2b6
+.value	0xc2b6,0xc2b6
+.value	0xc2b6,0xc2b6
+.value	0xc2b6,0xc2b6
+.value	0x23d,0x23d
+.value	0x23d,0x23d
+.value	0x23d,0x23d
+.value	0x23d,0x23d
+.value	0x7d4,0x7d4
+.value	0x7d4,0x7d4
+.value	0x7d4,0x7d4
+.value	0x7d4,0x7d4
+.value	0xe93d,0xe93d
+.value	0xe93d,0xe93d
+.value	0xe93d,0xe93d
+.value	0xe93d,0xe93d
+.value	0x43d4,0x43d4
+.value	0x43d4,0x43d4
+.value	0x43d4,0x43d4
+.value	0x43d4,0x43d4
+.value	0x108,0x108
+.value	0x108,0x108
+.value	0x108,0x108
+.value	0x108,0x108
+.value	0x17f,0x17f
+.value	0x17f,0x17f
+.value	0x17f,0x17f
+.value	0x17f,0x17f
+.value	0x9908,0x9908
+.value	0x9908,0x9908
+.value	0x9908,0x9908
+.value	0x9908,0x9908
+.value	0x8e7f,0x8e7f
+.value	0x8e7f,0x8e7f
+.value	0x8e7f,0x8e7f
+.value	0x8e7f,0x8e7f
+.value	0x4c7,0x4c7
+.value	0x4c7,0x4c7
+.value	0x28c,0x28c
+.value	0x28c,0x28c
+.value	0xad9,0xad9
+.value	0xad9,0xad9
+.value	0x3f7,0x3f7
+.value	0x3f7,0x3f7
+.value	0xe9c7,0xe9c7
+.value	0xe9c7,0xe9c7
+.value	0xe68c,0xe68c
+.value	0xe68c,0xe68c
+.value	0x5d9,0x5d9
+.value	0x5d9,0x5d9
+.value	0x78f7,0x78f7
+.value	0x78f7,0x78f7
+.value	0x7f4,0x7f4
+.value	0x7f4,0x7f4
+.value	0x5d3,0x5d3
+.value	0x5d3,0x5d3
+.value	0xbe7,0xbe7
+.value	0xbe7,0xbe7
+.value	0x6f9,0x6f9
+.value	0x6f9,0x6f9
+.value	0xa3f4,0xa3f4
+.value	0xa3f4,0xa3f4
+.value	0x4ed3,0x4ed3
+.value	0x4ed3,0x4ed3
+.value	0x50e7,0x50e7
+.value	0x50e7,0x50e7
+.value	0x61f9,0x61f9
+.value	0x61f9,0x61f9
+.value	0x9c4,0x9c4
+.value	0x9c4,0x9c4
+.value	0x9c4,0x9c4
+.value	0x9c4,0x9c4
+.value	0x5b2,0x5b2
+.value	0x5b2,0x5b2
+.value	0x5b2,0x5b2
+.value	0x5b2,0x5b2
+.value	0x15c4,0x15c4
+.value	0x15c4,0x15c4
+.value	0x15c4,0x15c4
+.value	0x15c4,0x15c4
+.value	0xfbb2,0xfbb2
+.value	0xfbb2,0xfbb2
+.value	0xfbb2,0xfbb2
+.value	0xfbb2,0xfbb2
+.value	0x6bf,0x6bf
+.value	0x6bf,0x6bf
+.value	0x6bf,0x6bf
+.value	0x6bf,0x6bf
+.value	0xc7f,0xc7f
+.value	0xc7f,0xc7f
+.value	0xc7f,0xc7f
+.value	0xc7f,0xc7f
+.value	0x53bf,0x53bf
+.value	0x53bf,0x53bf
+.value	0x53bf,0x53bf
+.value	0x53bf,0x53bf
+.value	0x997f,0x997f
+.value	0x997f,0x997f
+.value	0x997f,0x997f
+.value	0x997f,0x997f
+.value	0x204,0x204
+.value	0x204,0x204
+.value	0xcf9,0xcf9
+.value	0xcf9,0xcf9
+.value	0xbc1,0xbc1
+.value	0xbc1,0xbc1
+.value	0xa67,0xa67
+.value	0xa67,0xa67
+.value	0xce04,0xce04
+.value	0xce04,0xce04
+.value	0x67f9,0x67f9
+.value	0x67f9,0x67f9
+.value	0x3ec1,0x3ec1
+.value	0x3ec1,0x3ec1
+.value	0xcf67,0xcf67
+.value	0xcf67,0xcf67
+.value	0x6af,0x6af
+.value	0x6af,0x6af
+.value	0x877,0x877
+.value	0x877,0x877
+.value	0x7e,0x7e
+.value	0x7e,0x7e
+.value	0x5bd,0x5bd
+.value	0x5bd,0x5bd
+.value	0x23af,0x23af
+.value	0x23af,0x23af
+.value	0xfd77,0xfd77
+.value	0xfd77,0xfd77
+.value	0x9a7e,0x9a7e
+.value	0x9a7e,0x9a7e
+.value	0x6cbd,0x6cbd
+.value	0x6cbd,0x6cbd
+.value	0x8b2,0x8b2
+.value	0x1ae,0x1ae
+.value	0x22b,0x22b
+.value	0x34b,0x34b
+.value	0x81e,0x81e
+.value	0x367,0x367
+.value	0x60e,0x60e
+.value	0x69,0x69
+.value	0xfeb2,0xfeb2
+.value	0x2bae,0x2bae
+.value	0xd32b,0xd32b
+.value	0x344b,0x344b
+.value	0x821e,0x821e
+.value	0xc867,0xc867
+.value	0x500e,0x500e
+.value	0xab69,0xab69
+.value	0x1a6,0x1a6
+.value	0x24b,0x24b
+.value	0xb1,0xb1
+.value	0xc16,0xc16
+.value	0xbde,0xbde
+.value	0xb35,0xb35
+.value	0x626,0x626
+.value	0x675,0x675
+.value	0x93a6,0x93a6
+.value	0x334b,0x334b
+.value	0x3b1,0x3b1
+.value	0xee16,0xee16
+.value	0xc5de,0xc5de
+.value	0x5a35,0x5a35
+.value	0x1826,0x1826
+.value	0x1575,0x1575
+.value	0xc0b,0xc0b
+.value	0x30a,0x30a
+.value	0x487,0x487
+.value	0xc6e,0xc6e
+.value	0x9f8,0x9f8
+.value	0x5cb,0x5cb
+.value	0xaa7,0xaa7
+.value	0x45f,0x45f
+.value	0x7d0b,0x7d0b
+.value	0x810a,0x810a
+.value	0x2987,0x2987
+.value	0x766e,0x766e
+.value	0x71f8,0x71f8
+.value	0xb6cb,0xb6cb
+.value	0x8fa7,0x8fa7
+.value	0x315f,0x315f
+.value	0x6cb,0x6cb
+.value	0x284,0x284
+.value	0x999,0x999
+.value	0x15d,0x15d
+.value	0x1a2,0x1a2
+.value	0x149,0x149
+.value	0xc65,0xc65
+.value	0xcb6,0xcb6
+.value	0xb7cb,0xb7cb
+.value	0x4e84,0x4e84
+.value	0x4499,0x4499
+.value	0x485d,0x485d
+.value	0xc7a2,0xc7a2
+.value	0x4c49,0x4c49
+.value	0xeb65,0xeb65
+.value	0xceb6,0xceb6
+.value	0x714,0x714
+.value	0x714,0x714
+.value	0x714,0x714
+.value	0x714,0x714
+.value	0x714,0x714
+.value	0x714,0x714
+.value	0x714,0x714
+.value	0x714,0x714
+.value	0x314,0x314
+.value	0x314,0x314
+.value	0x314,0x314
+.value	0x314,0x314
+.value	0x314,0x314
+.value	0x314,0x314
+.value	0x314,0x314
+.value	0x314,0x314
+.value	0x11f,0x11f
+.value	0x11f,0x11f
+.value	0x11f,0x11f
+.value	0x11f,0x11f
+.value	0x11f,0x11f
+.value	0x11f,0x11f
+.value	0x11f,0x11f
+.value	0x11f,0x11f
+.value	0x6e1f,0x6e1f
+.value	0x6e1f,0x6e1f
+.value	0x6e1f,0x6e1f
+.value	0x6e1f,0x6e1f
+.value	0x6e1f,0x6e1f
+.value	0x6e1f,0x6e1f
+.value	0x6e1f,0x6e1f
+.value	0x6e1f,0x6e1f
+.value	0xca,0xca
+.value	0xca,0xca
+.value	0xca,0xca
+.value	0xca,0xca
+.value	0xca,0xca
+.value	0xca,0xca
+.value	0xca,0xca
+.value	0xca,0xca
+.value	0xbeca,0xbeca
+.value	0xbeca,0xbeca
+.value	0xbeca,0xbeca
+.value	0xbeca,0xbeca
+.value	0xbeca,0xbeca
+.value	0xbeca,0xbeca
+.value	0xbeca,0xbeca
+.value	0xbeca,0xbeca
+.value	0x3c2,0x3c2
+.value	0x3c2,0x3c2
+.value	0x3c2,0x3c2
+.value	0x3c2,0x3c2
+.value	0x3c2,0x3c2
+.value	0x3c2,0x3c2
+.value	0x3c2,0x3c2
+.value	0x3c2,0x3c2
+.value	0x29c2,0x29c2
+.value	0x29c2,0x29c2
+.value	0x29c2,0x29c2
+.value	0x29c2,0x29c2
+.value	0x29c2,0x29c2
+.value	0x29c2,0x29c2
+.value	0x29c2,0x29c2
+.value	0x29c2,0x29c2
+.value	0x84f,0x84f
+.value	0x84f,0x84f
+.value	0x84f,0x84f
+.value	0x84f,0x84f
+.value	0x84f,0x84f
+.value	0x84f,0x84f
+.value	0x84f,0x84f
+.value	0x84f,0x84f
+.value	0x54f,0x54f
+.value	0x54f,0x54f
+.value	0x54f,0x54f
+.value	0x54f,0x54f
+.value	0x54f,0x54f
+.value	0x54f,0x54f
+.value	0x54f,0x54f
+.value	0x54f,0x54f
+.value	0x73f,0x73f
+.value	0x73f,0x73f
+.value	0x73f,0x73f
+.value	0x73f,0x73f
+.value	0x73f,0x73f
+.value	0x73f,0x73f
+.value	0x73f,0x73f
+.value	0x73f,0x73f
+.value	0xd43f,0xd43f
+.value	0xd43f,0xd43f
+.value	0xd43f,0xd43f
+.value	0xd43f,0xd43f
+.value	0xd43f,0xd43f
+.value	0xd43f,0xd43f
+.value	0xd43f,0xd43f
+.value	0xd43f,0xd43f
+.value	0x5bc,0x5bc
+.value	0x5bc,0x5bc
+.value	0x5bc,0x5bc
+.value	0x5bc,0x5bc
+.value	0x5bc,0x5bc
+.value	0x5bc,0x5bc
+.value	0x5bc,0x5bc
+.value	0x5bc,0x5bc
+.value	0x79bc,0x79bc
+.value	0x79bc,0x79bc
+.value	0x79bc,0x79bc
+.value	0x79bc,0x79bc
+.value	0x79bc,0x79bc
+.value	0x79bc,0x79bc
+.value	0x79bc,0x79bc
+.value	0x79bc,0x79bc
+.value	0xa58,0xa58
+.value	0xa58,0xa58
+.value	0xa58,0xa58
+.value	0xa58,0xa58
+.value	0x3f9,0x3f9
+.value	0x3f9,0x3f9
+.value	0x3f9,0x3f9
+.value	0x3f9,0x3f9
+.value	0x9258,0x9258
+.value	0x9258,0x9258
+.value	0x9258,0x9258
+.value	0x9258,0x9258
+.value	0x5ef9,0x5ef9
+.value	0x5ef9,0x5ef9
+.value	0x5ef9,0x5ef9
+.value	0x5ef9,0x5ef9
+.value	0x2dc,0x2dc
+.value	0x2dc,0x2dc
+.value	0x2dc,0x2dc
+.value	0x2dc,0x2dc
+.value	0x260,0x260
+.value	0x260,0x260
+.value	0x260,0x260
+.value	0x260,0x260
+.value	0xd6dc,0xd6dc
+.value	0xd6dc,0xd6dc
+.value	0xd6dc,0xd6dc
+.value	0xd6dc,0xd6dc
+.value	0x2260,0x2260
+.value	0x2260,0x2260
+.value	0x2260,0x2260
+.value	0x2260,0x2260
+.value	0x9ac,0x9ac
+.value	0x9ac,0x9ac
+.value	0xca7,0xca7
+.value	0xca7,0xca7
+.value	0xbf2,0xbf2
+.value	0xbf2,0xbf2
+.value	0x33e,0x33e
+.value	0x33e,0x33e
+.value	0x4dac,0x4dac
+.value	0x4dac,0x4dac
+.value	0x91a7,0x91a7
+.value	0x91a7,0x91a7
+.value	0xc1f2,0xc1f2
+.value	0xc1f2,0xc1f2
+.value	0xdd3e,0xdd3e
+.value	0xdd3e,0xdd3e
+.value	0x6b,0x6b
+.value	0x6b,0x6b
+.value	0x774,0x774
+.value	0x774,0x774
+.value	0xc0a,0xc0a
+.value	0xc0a,0xc0a
+.value	0x94a,0x94a
+.value	0x94a,0x94a
+.value	0x916b,0x916b
+.value	0x916b,0x916b
+.value	0x2374,0x2374
+.value	0x2374,0x2374
+.value	0x8a0a,0x8a0a
+.value	0x8a0a,0x8a0a
+.value	0x474a,0x474a
+.value	0x474a,0x474a
+.value	0x6fb,0x6fb
+.value	0x6fb,0x6fb
+.value	0x6fb,0x6fb
+.value	0x6fb,0x6fb
+.value	0x19b,0x19b
+.value	0x19b,0x19b
+.value	0x19b,0x19b
+.value	0x19b,0x19b
+.value	0x47fb,0x47fb
+.value	0x47fb,0x47fb
+.value	0x47fb,0x47fb
+.value	0x47fb,0x47fb
+.value	0x229b,0x229b
+.value	0x229b,0x229b
+.value	0x229b,0x229b
+.value	0x229b,0x229b
+.value	0xc34,0xc34
+.value	0xc34,0xc34
+.value	0xc34,0xc34
+.value	0xc34,0xc34
+.value	0x6de,0x6de
+.value	0x6de,0x6de
+.value	0x6de,0x6de
+.value	0x6de,0x6de
+.value	0x6834,0x6834
+.value	0x6834,0x6834
+.value	0x6834,0x6834
+.value	0x6834,0x6834
+.value	0xc0de,0xc0de
+.value	0xc0de,0xc0de
+.value	0xc0de,0xc0de
+.value	0xc0de,0xc0de
+.value	0xb73,0xb73
+.value	0xb73,0xb73
+.value	0x3c1,0x3c1
+.value	0x3c1,0x3c1
+.value	0x71d,0x71d
+.value	0x71d,0x71d
+.value	0xa2c,0xa2c
+.value	0xa2c,0xa2c
+.value	0x3473,0x3473
+.value	0x3473,0x3473
+.value	0x36c1,0x36c1
+.value	0x36c1,0x36c1
+.value	0x8e1d,0x8e1d
+.value	0x8e1d,0x8e1d
+.value	0xce2c,0xce2c
+.value	0xce2c,0xce2c
+.value	0x1c0,0x1c0
+.value	0x1c0,0x1c0
+.value	0x8d8,0x8d8
+.value	0x8d8,0x8d8
+.value	0x2a5,0x2a5
+.value	0x2a5,0x2a5
+.value	0x806,0x806
+.value	0x806,0x806
+.value	0x41c0,0x41c0
+.value	0x41c0,0x41c0
+.value	0x10d8,0x10d8
+.value	0x10d8,0x10d8
+.value	0xa1a5,0xa1a5
+.value	0xa1a5,0xa1a5
+.value	0xba06,0xba06
+.value	0xba06,0xba06
+.value	0x331,0x331
+.value	0x449,0x449
+.value	0x25b,0x25b
+.value	0x262,0x262
+.value	0x52a,0x52a
+.value	0x7fc,0x7fc
+.value	0x748,0x748
+.value	0x180,0x180
+.value	0x8631,0x8631
+.value	0x4f49,0x4f49
+.value	0x635b,0x635b
+.value	0x862,0x862
+.value	0xe32a,0xe32a
+.value	0x3bfc,0x3bfc
+.value	0x5f48,0x5f48
+.value	0x8180,0x8180
+.value	0x842,0x842
+.value	0xc79,0xc79
+.value	0x4c2,0x4c2
+.value	0x7ca,0x7ca
+.value	0x997,0x997
+.value	0xdc,0xdc
+.value	0x85e,0x85e
+.value	0x686,0x686
+.value	0xae42,0xae42
+.value	0xe779,0xe779
+.value	0x2ac2,0x2ac2
+.value	0xc5ca,0xc5ca
+.value	0x5e97,0x5e97
+.value	0xd4dc,0xd4dc
+.value	0x425e,0x425e
+.value	0x3886,0x3886
+.value	0x860,0x860
+.value	0x707,0x707
+.value	0x803,0x803
+.value	0x31a,0x31a
+.value	0x71b,0x71b
+.value	0x9ab,0x9ab
+.value	0x99b,0x99b
+.value	0x1de,0x1de
+.value	0x2860,0x2860
+.value	0xac07,0xac07
+.value	0xe103,0xe103
+.value	0xb11a,0xb11a
+.value	0xa81b,0xa81b
+.value	0x5aab,0x5aab
+.value	0x2a9b,0x2a9b
+.value	0xbbde,0xbbde
+.value	0xc95,0xc95
+.value	0xbcd,0xbcd
+.value	0x3e4,0x3e4
+.value	0x3df,0x3df
+.value	0x3be,0x3be
+.value	0x74d,0x74d
+.value	0x5f2,0x5f2
+.value	0x65c,0x65c
+.value	0x7b95,0x7b95
+.value	0xa2cd,0xa2cd
+.value	0x6fe4,0x6fe4
+.value	0xb0df,0xb0df
+.value	0x5dbe,0x5dbe
+.value	0x1e4d,0x1e4d
+.value	0xbbf2,0xbbf2
+.value	0x5a5c,0x5a5c
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_avx2_zetas_basemul:
+.value	0x8b2,0x81e
+.value	0xf74e,0xf7e2
+.value	0x1ae,0x367
+.value	0xfe52,0xfc99
+.value	0x22b,0x60e
+.value	0xfdd5,0xf9f2
+.value	0x34b,0x69
+.value	0xfcb5,0xff97
+.value	0xfeb2,0x821e
+.value	0x14e,0x7de2
+.value	0x2bae,0xc867
+.value	0xd452,0x3799
+.value	0xd32b,0x500e
+.value	0x2cd5,0xaff2
+.value	0x344b,0xab69
+.value	0xcbb5,0x5497
+.value	0x1a6,0xbde
+.value	0xfe5a,0xf422
+.value	0x24b,0xb35
+.value	0xfdb5,0xf4cb
+.value	0xb1,0x626
+.value	0xff4f,0xf9da
+.value	0xc16,0x675
+.value	0xf3ea,0xf98b
+.value	0x93a6,0xc5de
+.value	0x6c5a,0x3a22
+.value	0x334b,0x5a35
+.value	0xccb5,0xa5cb
+.value	0x3b1,0x1826
+.value	0xfc4f,0xe7da
+.value	0xee16,0x1575
+.value	0x11ea,0xea8b
+.value	0xc0b,0x9f8
+.value	0xf3f5,0xf608
+.value	0x30a,0x5cb
+.value	0xfcf6,0xfa35
+.value	0x487,0xaa7
+.value	0xfb79,0xf559
+.value	0xc6e,0x45f
+.value	0xf392,0xfba1
+.value	0x7d0b,0x71f8
+.value	0x82f5,0x8e08
+.value	0x810a,0xb6cb
+.value	0x7ef6,0x4935
+.value	0x2987,0x8fa7
+.value	0xd679,0x7059
+.value	0x766e,0x315f
+.value	0x8992,0xcea1
+.value	0x6cb,0x1a2
+.value	0xf935,0xfe5e
+.value	0x284,0x149
+.value	0xfd7c,0xfeb7
+.value	0x999,0xc65
+.value	0xf667,0xf39b
+.value	0x15d,0xcb6
+.value	0xfea3,0xf34a
+.value	0xb7cb,0xc7a2
+.value	0x4835,0x385e
+.value	0x4e84,0x4c49
+.value	0xb17c,0xb3b7
+.value	0x4499,0xeb65
+.value	0xbb67,0x149b
+.value	0x485d,0xceb6
+.value	0xb7a3,0x314a
+.value	0x331,0x52a
+.value	0xfccf,0xfad6
+.value	0x449,0x7fc
+.value	0xfbb7,0xf804
+.value	0x25b,0x748
+.value	0xfda5,0xf8b8
+.value	0x262,0x180
+.value	0xfd9e,0xfe80
+.value	0x8631,0xe32a
+.value	0x79cf,0x1cd6
+.value	0x4f49,0x3bfc
+.value	0xb0b7,0xc404
+.value	0x635b,0x5f48
+.value	0x9ca5,0xa0b8
+.value	0x862,0x8180
+.value	0xf79e,0x7e80
+.value	0x842,0x997
+.value	0xf7be,0xf669
+.value	0xc79,0xdc
+.value	0xf387,0xff24
+.value	0x4c2,0x85e
+.value	0xfb3e,0xf7a2
+.value	0x7ca,0x686
+.value	0xf836,0xf97a
+.value	0xae42,0x5e97
+.value	0x51be,0xa169
+.value	0xe779,0xd4dc
+.value	0x1887,0x2b24
+.value	0x2ac2,0x425e
+.value	0xd53e,0xbda2
+.value	0xc5ca,0x3886
+.value	0x3a36,0xc77a
+.value	0x860,0x71b
+.value	0xf7a0,0xf8e5
+.value	0x707,0x9ab
+.value	0xf8f9,0xf655
+.value	0x803,0x99b
+.value	0xf7fd,0xf665
+.value	0x31a,0x1de
+.value	0xfce6,0xfe22
+.value	0x2860,0xa81b
+.value	0xd7a0,0x57e5
+.value	0xac07,0x5aab
+.value	0x53f9,0xa555
+.value	0xe103,0x2a9b
+.value	0x1efd,0xd565
+.value	0xb11a,0xbbde
+.value	0x4ee6,0x4422
+.value	0xc95,0x3be
+.value	0xf36b,0xfc42
+.value	0xbcd,0x74d
+.value	0xf433,0xf8b3
+.value	0x3e4,0x5f2
+.value	0xfc1c,0xfa0e
+.value	0x3df,0x65c
+.value	0xfc21,0xf9a4
+.value	0x7b95,0x5dbe
+.value	0x846b,0xa242
+.value	0xa2cd,0x1e4d
+.value	0x5d33,0xe1b3
+.value	0x6fe4,0xbbf2
+.value	0x901c,0x440e
+.value	0xb0df,0x5a5c
+.value	0x4f21,0xa5a4
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_avx2_zetas_inv:
+.value	0x6a5,0x6a5
+.value	0x5b4,0x5b4
+.value	0x70f,0x70f
+.value	0x943,0x943
+.value	0x922,0x922
+.value	0x134,0x134
+.value	0x91d,0x91d
+.value	0x6c,0x6c
+.value	0xa5a5,0xa5a5
+.value	0xe1b4,0xe1b4
+.value	0x440f,0x440f
+.value	0xa243,0xa243
+.value	0x4f22,0x4f22
+.value	0x5d34,0x5d34
+.value	0x901d,0x901d
+.value	0x846c,0x846c
+.value	0xb23,0xb23
+.value	0x356,0x356
+.value	0x366,0x366
+.value	0x5e6,0x5e6
+.value	0x9e7,0x9e7
+.value	0x5fa,0x5fa
+.value	0x4fe,0x4fe
+.value	0x4a1,0x4a1
+.value	0x4423,0x4423
+.value	0xa556,0xa556
+.value	0xd566,0xd566
+.value	0x57e6,0x57e6
+.value	0x4ee7,0x4ee7
+.value	0x53fa,0x53fa
+.value	0x1efe,0x1efe
+.value	0xd7a1,0xd7a1
+.value	0x4fb,0x4fb
+.value	0x4fb,0x4fb
+.value	0xa5c,0xa5c
+.value	0xa5c,0xa5c
+.value	0x429,0x429
+.value	0x429,0x429
+.value	0xb41,0xb41
+.value	0xb41,0xb41
+.value	0x45fb,0x45fb
+.value	0x45fb,0x45fb
+.value	0x5e5c,0x5e5c
+.value	0x5e5c,0x5e5c
+.value	0xef29,0xef29
+.value	0xef29,0xef29
+.value	0xbe41,0xbe41
+.value	0xbe41,0xbe41
+.value	0x2d5,0x2d5
+.value	0x2d5,0x2d5
+.value	0x5e4,0x5e4
+.value	0x5e4,0x5e4
+.value	0x940,0x940
+.value	0x940,0x940
+.value	0x18e,0x18e
+.value	0x18e,0x18e
+.value	0x31d5,0x31d5
+.value	0x31d5,0x31d5
+.value	0x71e4,0x71e4
+.value	0x71e4,0x71e4
+.value	0xc940,0xc940
+.value	0xc940,0xc940
+.value	0xcb8e,0xcb8e
+.value	0xcb8e,0xcb8e
+.value	0x623,0x623
+.value	0x623,0x623
+.value	0x623,0x623
+.value	0x623,0x623
+.value	0xcd,0xcd
+.value	0xcd,0xcd
+.value	0xcd,0xcd
+.value	0xcd,0xcd
+.value	0x3f23,0x3f23
+.value	0x3f23,0x3f23
+.value	0x3f23,0x3f23
+.value	0x3f23,0x3f23
+.value	0x97cd,0x97cd
+.value	0x97cd,0x97cd
+.value	0x97cd,0x97cd
+.value	0x97cd,0x97cd
+.value	0xb66,0xb66
+.value	0xb66,0xb66
+.value	0xb66,0xb66
+.value	0xb66,0xb66
+.value	0x606,0x606
+.value	0x606,0x606
+.value	0x606,0x606
+.value	0x606,0x606
+.value	0xdd66,0xdd66
+.value	0xdd66,0xdd66
+.value	0xdd66,0xdd66
+.value	0xdd66,0xdd66
+.value	0xb806,0xb806
+.value	0xb806,0xb806
+.value	0xb806,0xb806
+.value	0xb806,0xb806
+.value	0x745,0x745
+.value	0x745,0x745
+.value	0x745,0x745
+.value	0x745,0x745
+.value	0x745,0x745
+.value	0x745,0x745
+.value	0x745,0x745
+.value	0x745,0x745
+.value	0x8645,0x8645
+.value	0x8645,0x8645
+.value	0x8645,0x8645
+.value	0x8645,0x8645
+.value	0x8645,0x8645
+.value	0x8645,0x8645
+.value	0x8645,0x8645
+.value	0x8645,0x8645
+.value	0x5c2,0x5c2
+.value	0x5c2,0x5c2
+.value	0x5c2,0x5c2
+.value	0x5c2,0x5c2
+.value	0x5c2,0x5c2
+.value	0x5c2,0x5c2
+.value	0x5c2,0x5c2
+.value	0x5c2,0x5c2
+.value	0x2bc2,0x2bc2
+.value	0x2bc2,0x2bc2
+.value	0x2bc2,0x2bc2
+.value	0x2bc2,0x2bc2
+.value	0x2bc2,0x2bc2
+.value	0x2bc2,0x2bc2
+.value	0x2bc2,0x2bc2
+.value	0x2bc2,0x2bc2
+.value	0xc37,0xc37
+.value	0xc37,0xc37
+.value	0xc37,0xc37
+.value	0xc37,0xc37
+.value	0xc37,0xc37
+.value	0xc37,0xc37
+.value	0xc37,0xc37
+.value	0xc37,0xc37
+.value	0x4137,0x4137
+.value	0x4137,0x4137
+.value	0x4137,0x4137
+.value	0x4137,0x4137
+.value	0x4137,0x4137
+.value	0x4137,0x4137
+.value	0x4137,0x4137
+.value	0x4137,0x4137
+.value	0x67b,0x67b
+.value	0xc25,0xc25
+.value	0x4a3,0x4a3
+.value	0x36a,0x36a
+.value	0x537,0x537
+.value	0x88,0x88
+.value	0x83f,0x83f
+.value	0x4bf,0x4bf
+.value	0xc77b,0xc77b
+.value	0x2b25,0x2b25
+.value	0xbda3,0xbda3
+.value	0xa16a,0xa16a
+.value	0x3a37,0x3a37
+.value	0x1888,0x1888
+.value	0xd53f,0xd53f
+.value	0x51bf,0x51bf
+.value	0xb81,0xb81
+.value	0x505,0x505
+.value	0x5b9,0x5b9
+.value	0x7d7,0x7d7
+.value	0xa9f,0xa9f
+.value	0x8b8,0x8b8
+.value	0xaa6,0xaa6
+.value	0x9d0,0x9d0
+.value	0x7e81,0x7e81
+.value	0xc405,0xc405
+.value	0xa0b9,0xa0b9
+.value	0x1cd7,0x1cd7
+.value	0xf79f,0xf79f
+.value	0xb0b8,0xb0b8
+.value	0x9ca6,0x9ca6
+.value	0x79d0,0x79d0
+.value	0x3b7,0x3b7
+.value	0x3b7,0x3b7
+.value	0xf7,0xf7
+.value	0xf7,0xf7
+.value	0x58d,0x58d
+.value	0x58d,0x58d
+.value	0xc96,0xc96
+.value	0xc96,0xc96
+.value	0xb8b7,0xb8b7
+.value	0xb8b7,0xb8b7
+.value	0x75f7,0x75f7
+.value	0x75f7,0x75f7
+.value	0xdc8d,0xdc8d
+.value	0xdc8d,0xdc8d
+.value	0x6e96,0x6e96
+.value	0x6e96,0x6e96
+.value	0x9c3,0x9c3
+.value	0x9c3,0x9c3
+.value	0x10f,0x10f
+.value	0x10f,0x10f
+.value	0x5a,0x5a
+.value	0x5a,0x5a
+.value	0x355,0x355
+.value	0x355,0x355
+.value	0x22c3,0x22c3
+.value	0x22c3,0x22c3
+.value	0x3e0f,0x3e0f
+.value	0x3e0f,0x3e0f
+.value	0x6e5a,0x6e5a
+.value	0x6e5a,0x6e5a
+.value	0xb255,0xb255
+.value	0xb255,0xb255
+.value	0xaa1,0xaa1
+.value	0xaa1,0xaa1
+.value	0xaa1,0xaa1
+.value	0xaa1,0xaa1
+.value	0xa25,0xa25
+.value	0xa25,0xa25
+.value	0xa25,0xa25
+.value	0xa25,0xa25
+.value	0xdda1,0xdda1
+.value	0xdda1,0xdda1
+.value	0xdda1,0xdda1
+.value	0xdda1,0xdda1
+.value	0x2925,0x2925
+.value	0x2925,0x2925
+.value	0x2925,0x2925
+.value	0x2925,0x2925
+.value	0x908,0x908
+.value	0x908,0x908
+.value	0x908,0x908
+.value	0x908,0x908
+.value	0x2a9,0x2a9
+.value	0x2a9,0x2a9
+.value	0x2a9,0x2a9
+.value	0x2a9,0x2a9
+.value	0xa108,0xa108
+.value	0xa108,0xa108
+.value	0xa108,0xa108
+.value	0xa108,0xa108
+.value	0x6da9,0x6da9
+.value	0x6da9,0x6da9
+.value	0x6da9,0x6da9
+.value	0x6da9,0x6da9
+.value	0x4b2,0x4b2
+.value	0x4b2,0x4b2
+.value	0x4b2,0x4b2
+.value	0x4b2,0x4b2
+.value	0x4b2,0x4b2
+.value	0x4b2,0x4b2
+.value	0x4b2,0x4b2
+.value	0x4b2,0x4b2
+.value	0xfab2,0xfab2
+.value	0xfab2,0xfab2
+.value	0xfab2,0xfab2
+.value	0xfab2,0xfab2
+.value	0xfab2,0xfab2
+.value	0xfab2,0xfab2
+.value	0xfab2,0xfab2
+.value	0xfab2,0xfab2
+.value	0x93f,0x93f
+.value	0x93f,0x93f
+.value	0x93f,0x93f
+.value	0x93f,0x93f
+.value	0x93f,0x93f
+.value	0x93f,0x93f
+.value	0x93f,0x93f
+.value	0x93f,0x93f
+.value	0xd63f,0xd63f
+.value	0xd63f,0xd63f
+.value	0xd63f,0xd63f
+.value	0xd63f,0xd63f
+.value	0xd63f,0xd63f
+.value	0xd63f,0xd63f
+.value	0xd63f,0xd63f
+.value	0xd63f,0xd63f
+.value	0xbe2,0xbe2
+.value	0xbe2,0xbe2
+.value	0xbe2,0xbe2
+.value	0xbe2,0xbe2
+.value	0xbe2,0xbe2
+.value	0xbe2,0xbe2
+.value	0xbe2,0xbe2
+.value	0xbe2,0xbe2
+.value	0x91e2,0x91e2
+.value	0x91e2,0x91e2
+.value	0x91e2,0x91e2
+.value	0x91e2,0x91e2
+.value	0x91e2,0x91e2
+.value	0x91e2,0x91e2
+.value	0x91e2,0x91e2
+.value	0x91e2,0x91e2
+.value	0x5ed,0x5ed
+.value	0x5ed,0x5ed
+.value	0x5ed,0x5ed
+.value	0x5ed,0x5ed
+.value	0x5ed,0x5ed
+.value	0x5ed,0x5ed
+.value	0x5ed,0x5ed
+.value	0x5ed,0x5ed
+.value	0xfced,0xfced
+.value	0xfced,0xfced
+.value	0xfced,0xfced
+.value	0xfced,0xfced
+.value	0xfced,0xfced
+.value	0xfced,0xfced
+.value	0xfced,0xfced
+.value	0xfced,0xfced
+.value	0x4b,0x4b
+.value	0xbb8,0xbb8
+.value	0x9c,0x9c
+.value	0xb5f,0xb5f
+.value	0xba4,0xba4
+.value	0xa7d,0xa7d
+.value	0x368,0x368
+.value	0x636,0x636
+.value	0x314b,0x314b
+.value	0xb3b8,0xb3b8
+.value	0x149c,0x149c
+.value	0x385f,0x385f
+.value	0xb7a4,0xb7a4
+.value	0xb17d,0xb17d
+.value	0xbb68,0xbb68
+.value	0x4836,0x4836
+.value	0x8a2,0x8a2
+.value	0x736,0x736
+.value	0x25a,0x25a
+.value	0x309,0x309
+.value	0x93,0x93
+.value	0x9f7,0x9f7
+.value	0x87a,0x87a
+.value	0xf6,0xf6
+.value	0xcea2,0xcea2
+.value	0x4936,0x4936
+.value	0x705a,0x705a
+.value	0x8e09,0x8e09
+.value	0x8993,0x8993
+.value	0x7ef7,0x7ef7
+.value	0xd67a,0xd67a
+.value	0x82f6,0x82f6
+.value	0x744,0x744
+.value	0x744,0x744
+.value	0xc83,0xc83
+.value	0xc83,0xc83
+.value	0x48a,0x48a
+.value	0x48a,0x48a
+.value	0x652,0x652
+.value	0x652,0x652
+.value	0x9344,0x9344
+.value	0x9344,0x9344
+.value	0x6583,0x6583
+.value	0x6583,0x6583
+.value	0x28a,0x28a
+.value	0x28a,0x28a
+.value	0xdc52,0xdc52
+.value	0xdc52,0xdc52
+.value	0x29a,0x29a
+.value	0x29a,0x29a
+.value	0x140,0x140
+.value	0x140,0x140
+.value	0x8,0x8
+.value	0x8,0x8
+.value	0xafd,0xafd
+.value	0xafd,0xafd
+.value	0x309a,0x309a
+.value	0x309a,0x309a
+.value	0xc140,0xc140
+.value	0xc140,0xc140
+.value	0x9808,0x9808
+.value	0x9808,0x9808
+.value	0x31fd,0x31fd
+.value	0x31fd,0x31fd
+.value	0x82,0x82
+.value	0x82,0x82
+.value	0x82,0x82
+.value	0x82,0x82
+.value	0x642,0x642
+.value	0x642,0x642
+.value	0x642,0x642
+.value	0x642,0x642
+.value	0x6682,0x6682
+.value	0x6682,0x6682
+.value	0x6682,0x6682
+.value	0x6682,0x6682
+.value	0xac42,0xac42
+.value	0xac42,0xac42
+.value	0xac42,0xac42
+.value	0xac42,0xac42
+.value	0x74f,0x74f
+.value	0x74f,0x74f
+.value	0x74f,0x74f
+.value	0x74f,0x74f
+.value	0x33d,0x33d
+.value	0x33d,0x33d
+.value	0x33d,0x33d
+.value	0x33d,0x33d
+.value	0x44f,0x44f
+.value	0x44f,0x44f
+.value	0x44f,0x44f
+.value	0x44f,0x44f
+.value	0xea3d,0xea3d
+.value	0xea3d,0xea3d
+.value	0xea3d,0xea3d
+.value	0xea3d,0xea3d
+.value	0xc4b,0xc4b
+.value	0xc4b,0xc4b
+.value	0xc4b,0xc4b
+.value	0xc4b,0xc4b
+.value	0xc4b,0xc4b
+.value	0xc4b,0xc4b
+.value	0xc4b,0xc4b
+.value	0xc4b,0xc4b
+.value	0x3d4b,0x3d4b
+.value	0x3d4b,0x3d4b
+.value	0x3d4b,0x3d4b
+.value	0x3d4b,0x3d4b
+.value	0x3d4b,0x3d4b
+.value	0x3d4b,0x3d4b
+.value	0x3d4b,0x3d4b
+.value	0x3d4b,0x3d4b
+.value	0x6d8,0x6d8
+.value	0x6d8,0x6d8
+.value	0x6d8,0x6d8
+.value	0x6d8,0x6d8
+.value	0x6d8,0x6d8
+.value	0x6d8,0x6d8
+.value	0x6d8,0x6d8
+.value	0x6d8,0x6d8
+.value	0xed8,0xed8
+.value	0xed8,0xed8
+.value	0xed8,0xed8
+.value	0xed8,0xed8
+.value	0xed8,0xed8
+.value	0xed8,0xed8
+.value	0xed8,0xed8
+.value	0xed8,0xed8
+.value	0x773,0x773
+.value	0x773,0x773
+.value	0x773,0x773
+.value	0x773,0x773
+.value	0x773,0x773
+.value	0x773,0x773
+.value	0x773,0x773
+.value	0x773,0x773
+.value	0x3073,0x3073
+.value	0x3073,0x3073
+.value	0x3073,0x3073
+.value	0x3073,0x3073
+.value	0x3073,0x3073
+.value	0x3073,0x3073
+.value	0x3073,0x3073
+.value	0x3073,0x3073
+.value	0x68c,0x68c
+.value	0x1cc,0x1cc
+.value	0x6db,0x6db
+.value	0x123,0x123
+.value	0xeb,0xeb
+.value	0xab6,0xab6
+.value	0xc50,0xc50
+.value	0xb5b,0xb5b
+.value	0xea8c,0xea8c
+.value	0xa5cc,0xa5cc
+.value	0xe7db,0xe7db
+.value	0x3a23,0x3a23
+.value	0x11eb,0x11eb
+.value	0xccb6,0xccb6
+.value	0xfc50,0xfc50
+.value	0x6c5b,0x6c5b
+.value	0xc98,0xc98
+.value	0x99a,0x99a
+.value	0x6f3,0x6f3
+.value	0x4e3,0x4e3
+.value	0x9b6,0x9b6
+.value	0xb53,0xb53
+.value	0xad6,0xad6
+.value	0x44f,0x44f
+.value	0x5498,0x5498
+.value	0x379a,0x379a
+.value	0xaff3,0xaff3
+.value	0x7de3,0x7de3
+.value	0xcbb6,0xcbb6
+.value	0xd453,0xd453
+.value	0x2cd6,0x2cd6
+.value	0x14f,0x14f
+.value	0x608,0x608
+.value	0x608,0x608
+.value	0x11a,0x11a
+.value	0x11a,0x11a
+.value	0x72e,0x72e
+.value	0x72e,0x72e
+.value	0x50d,0x50d
+.value	0x50d,0x50d
+.value	0x9e08,0x9e08
+.value	0x9e08,0x9e08
+.value	0xaf1a,0xaf1a
+.value	0xaf1a,0xaf1a
+.value	0xb12e,0xb12e
+.value	0xb12e,0xb12e
+.value	0x5c0d,0x5c0d
+.value	0x5c0d,0x5c0d
+.value	0x90a,0x90a
+.value	0x90a,0x90a
+.value	0x228,0x228
+.value	0x228,0x228
+.value	0xa75,0xa75
+.value	0xa75,0xa75
+.value	0x83a,0x83a
+.value	0x83a,0x83a
+.value	0x870a,0x870a
+.value	0x870a,0x870a
+.value	0xfa28,0xfa28
+.value	0xfa28,0xfa28
+.value	0x1975,0x1975
+.value	0x1975,0x1975
+.value	0x163a,0x163a
+.value	0x163a,0x163a
+.value	0xb82,0xb82
+.value	0xb82,0xb82
+.value	0xb82,0xb82
+.value	0xb82,0xb82
+.value	0xbf9,0xbf9
+.value	0xbf9,0xbf9
+.value	0xbf9,0xbf9
+.value	0xbf9,0xbf9
+.value	0x7182,0x7182
+.value	0x7182,0x7182
+.value	0x7182,0x7182
+.value	0x7182,0x7182
+.value	0x66f9,0x66f9
+.value	0x66f9,0x66f9
+.value	0x66f9,0x66f9
+.value	0x66f9,0x66f9
+.value	0x52d,0x52d
+.value	0x52d,0x52d
+.value	0x52d,0x52d
+.value	0x52d,0x52d
+.value	0xac4,0xac4
+.value	0xac4,0xac4
+.value	0xac4,0xac4
+.value	0xac4,0xac4
+.value	0xbc2d,0xbc2d
+.value	0xbc2d,0xbc2d
+.value	0xbc2d,0xbc2d
+.value	0xbc2d,0xbc2d
+.value	0x16c4,0x16c4
+.value	0x16c4,0x16c4
+.value	0x16c4,0x16c4
+.value	0x16c4,0x16c4
+.value	0xa93,0xa93
+.value	0xa93,0xa93
+.value	0xa93,0xa93
+.value	0xa93,0xa93
+.value	0xa93,0xa93
+.value	0xa93,0xa93
+.value	0xa93,0xa93
+.value	0xa93,0xa93
+.value	0x9393,0x9393
+.value	0x9393,0x9393
+.value	0x9393,0x9393
+.value	0x9393,0x9393
+.value	0x9393,0x9393
+.value	0x9393,0x9393
+.value	0x9393,0x9393
+.value	0x9393,0x9393
+.value	0xab,0xab
+.value	0xab,0xab
+.value	0xab,0xab
+.value	0xab,0xab
+.value	0xab,0xab
+.value	0xab,0xab
+.value	0xab,0xab
+.value	0xab,0xab
+.value	0x51ab,0x51ab
+.value	0x51ab,0x51ab
+.value	0x51ab,0x51ab
+.value	0x51ab,0x51ab
+.value	0x51ab,0x51ab
+.value	0x51ab,0x51ab
+.value	0x51ab,0x51ab
+.value	0x51ab,0x51ab
+.value	0x72c,0x72c
+.value	0x72c,0x72c
+.value	0x72c,0x72c
+.value	0x72c,0x72c
+.value	0x72c,0x72c
+.value	0x72c,0x72c
+.value	0x72c,0x72c
+.value	0x72c,0x72c
+.value	0xcb2c,0xcb2c
+.value	0xcb2c,0xcb2c
+.value	0xcb2c,0xcb2c
+.value	0xcb2c,0xcb2c
+.value	0xcb2c,0xcb2c
+.value	0xcb2c,0xcb2c
+.value	0xcb2c,0xcb2c
+.value	0xcb2c,0xcb2c
+.value	0x167,0x167
+.value	0x167,0x167
+.value	0x167,0x167
+.value	0x167,0x167
+.value	0x167,0x167
+.value	0x167,0x167
+.value	0x167,0x167
+.value	0x167,0x167
+.value	0xc667,0xc667
+.value	0xc667,0xc667
+.value	0xc667,0xc667
+.value	0xc667,0xc667
+.value	0xc667,0xc667
+.value	0xc667,0xc667
+.value	0xc667,0xc667
+.value	0xc667,0xc667
+.value	0x2f6,0x2f6
+.value	0x2f6,0x2f6
+.value	0x2f6,0x2f6
+.value	0x2f6,0x2f6
+.value	0x2f6,0x2f6
+.value	0x2f6,0x2f6
+.value	0x2f6,0x2f6
+.value	0x2f6,0x2f6
+.value	0x84f6,0x84f6
+.value	0x84f6,0x84f6
+.value	0x84f6,0x84f6
+.value	0x84f6,0x84f6
+.value	0x84f6,0x84f6
+.value	0x84f6,0x84f6
+.value	0x84f6,0x84f6
+.value	0x84f6,0x84f6
+.value	0x5a1,0x5a1
+.value	0x5a1,0x5a1
+.value	0x5a1,0x5a1
+.value	0x5a1,0x5a1
+.value	0x5a1,0x5a1
+.value	0x5a1,0x5a1
+.value	0x5a1,0x5a1
+.value	0x5a1,0x5a1
+.value	0xd8a1,0xd8a1
+.value	0xd8a1,0xd8a1
+.value	0xd8a1,0xd8a1
+.value	0xd8a1,0xd8a1
+.value	0xd8a1,0xd8a1
+.value	0xd8a1,0xd8a1
+.value	0xd8a1,0xd8a1
+.value	0xd8a1,0xd8a1
+#ifndef __APPLE__
+.text
+.globl	kyber_keygen_avx2
+.type	kyber_keygen_avx2,@function
+.align	16
+kyber_keygen_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_keygen_avx2
+.p2align	4
+_kyber_keygen_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	kyber_q(%rip), %ymm14
+        vmovdqu	kyber_v(%rip), %ymm15
+        movq	%r8, %r9
+        movq	%rdi, %r10
+L_kyber_keygen_avx2_priv:
+        # ntt
+        leaq	L_kyber_avx2_zetas(%rip), %r11
+        vmovdqu	(%r11), %ymm10
+        vmovdqu	32(%r11), %ymm12
+        vmovdqu	128(%r10), %ymm0
+        vmovdqu	160(%r10), %ymm1
+        vmovdqu	192(%r10), %ymm2
+        vmovdqu	224(%r10), %ymm3
+        vmovdqu	384(%r10), %ymm4
+        vmovdqu	416(%r10), %ymm5
+        vmovdqu	448(%r10), %ymm6
+        vmovdqu	480(%r10), %ymm7
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vmovdqu	%ymm0, 128(%r10)
+        vmovdqu	%ymm1, 160(%r10)
+        vmovdqu	%ymm2, 192(%r10)
+        vmovdqu	%ymm3, 224(%r10)
+        vmovdqu	%ymm4, 384(%r10)
+        vmovdqu	%ymm5, 416(%r10)
+        vmovdqu	%ymm6, 448(%r10)
+        vmovdqu	%ymm7, 480(%r10)
+        vmovdqu	(%r10), %ymm0
+        vmovdqu	32(%r10), %ymm1
+        vmovdqu	64(%r10), %ymm2
+        vmovdqu	96(%r10), %ymm3
+        vmovdqu	256(%r10), %ymm4
+        vmovdqu	288(%r10), %ymm5
+        vmovdqu	320(%r10), %ymm6
+        vmovdqu	352(%r10), %ymm7
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vmovdqu	%ymm4, 256(%r10)
+        vmovdqu	%ymm5, 288(%r10)
+        vmovdqu	%ymm6, 320(%r10)
+        vmovdqu	%ymm7, 352(%r10)
+        vmovdqu	128(%r10), %ymm4
+        vmovdqu	160(%r10), %ymm5
+        vmovdqu	192(%r10), %ymm6
+        vmovdqu	224(%r10), %ymm7
+        # 64: 0/3
+        vmovdqu	64(%r11), %ymm10
+        vmovdqu	96(%r11), %ymm12
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        # 32: 0/3
+        vmovdqu	128(%r11), %ymm10
+        vmovdqu	160(%r11), %ymm12
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm2
+        vpsubw	%ymm9, %ymm1, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        # 32: 0/3
+        vmovdqu	192(%r11), %ymm10
+        vmovdqu	224(%r11), %ymm12
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm6
+        vpsubw	%ymm9, %ymm5, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        # 16: 0/3
+        vmovdqu	256(%r11), %ymm10
+        vmovdqu	288(%r11), %ymm12
+        vmovdqu	320(%r11), %ymm11
+        vmovdqu	352(%r11), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 16: 0/3
+        vmovdqu	384(%r11), %ymm10
+        vmovdqu	416(%r11), %ymm12
+        vmovdqu	448(%r11), %ymm11
+        vmovdqu	480(%r11), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 8: 0/3
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	512(%r11), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm1
+        vmovdqu	544(%r11), %ymm12
+        vperm2i128	$32, %ymm3, %ymm2, %ymm9
+        vmovdqu	576(%r11), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm3
+        vmovdqu	608(%r11), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm0
+        vpsubw	%ymm2, %ymm3, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm1
+        vpsubw	%ymm2, %ymm9, %ymm3
+        vpaddw	%ymm0, %ymm8, %ymm8
+        vpaddw	%ymm2, %ymm9, %ymm9
+        # 4: 0/3
+        vmovdqu	640(%r11), %ymm10
+        vmovdqu	672(%r11), %ymm12
+        vmovdqu	704(%r11), %ymm11
+        vmovdqu	736(%r11), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 8: 0/3
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	768(%r11), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm5
+        vmovdqu	800(%r11), %ymm12
+        vperm2i128	$32, %ymm7, %ymm6, %ymm9
+        vmovdqu	832(%r11), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm7
+        vmovdqu	864(%r11), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm4
+        vpsubw	%ymm6, %ymm7, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm5
+        vpsubw	%ymm6, %ymm9, %ymm7
+        vpaddw	%ymm4, %ymm8, %ymm8
+        vpaddw	%ymm6, %ymm9, %ymm9
+        # 4: 0/3
+        vmovdqu	896(%r11), %ymm10
+        vmovdqu	928(%r11), %ymm12
+        vmovdqu	960(%r11), %ymm11
+        vmovdqu	992(%r11), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 2: 0/3
+        vmovdqu	1024(%r11), %ymm10
+        vmovdqu	1056(%r11), %ymm12
+        vmovdqu	1088(%r11), %ymm11
+        vmovdqu	1120(%r11), %ymm13
+        vpsllq	$32, %ymm1, %ymm8
+        vpsrlq	$32, %ymm0, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm0, %ymm0
+        vpblendd	$0x55, %ymm9, %ymm1, %ymm1
+        vpsllq	$32, %ymm3, %ymm8
+        vpsrlq	$32, %ymm2, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm2, %ymm2
+        vpblendd	$0x55, %ymm9, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 2: 0/3
+        vmovdqu	1152(%r11), %ymm10
+        vmovdqu	1184(%r11), %ymm12
+        vmovdqu	1216(%r11), %ymm11
+        vmovdqu	1248(%r11), %ymm13
+        vpsllq	$32, %ymm5, %ymm8
+        vpsrlq	$32, %ymm4, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm4, %ymm4
+        vpblendd	$0x55, %ymm9, %ymm5, %ymm5
+        vpsllq	$32, %ymm7, %ymm8
+        vpsrlq	$32, %ymm6, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm6, %ymm6
+        vpblendd	$0x55, %ymm9, %ymm7, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        vpunpckldq	%ymm1, %ymm0, %ymm8
+        vpunpckhdq	%ymm1, %ymm0, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm0
+        vperm2i128	$49, %ymm9, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm2, %ymm8
+        vpunpckhdq	%ymm3, %ymm2, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm2
+        vperm2i128	$49, %ymm9, %ymm8, %ymm3
+        vpunpckldq	%ymm5, %ymm4, %ymm8
+        vpunpckhdq	%ymm5, %ymm4, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm4
+        vperm2i128	$49, %ymm9, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm6, %ymm8
+        vpunpckhdq	%ymm7, %ymm6, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm6
+        vperm2i128	$49, %ymm9, %ymm8, %ymm7
+        vpmulhw	%ymm15, %ymm0, %ymm8
+        vpmulhw	%ymm15, %ymm1, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm8
+        vpsubw	%ymm9, %ymm1, %ymm9
+        vmovdqu	%ymm8, (%r10)
+        vmovdqu	%ymm9, 32(%r10)
+        vpmulhw	%ymm15, %ymm2, %ymm8
+        vpmulhw	%ymm15, %ymm3, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vmovdqu	%ymm8, 64(%r10)
+        vmovdqu	%ymm9, 96(%r10)
+        vpmulhw	%ymm15, %ymm4, %ymm8
+        vpmulhw	%ymm15, %ymm5, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vmovdqu	%ymm8, 128(%r10)
+        vmovdqu	%ymm9, 160(%r10)
+        vpmulhw	%ymm15, %ymm6, %ymm8
+        vpmulhw	%ymm15, %ymm7, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vmovdqu	%ymm8, 192(%r10)
+        vmovdqu	%ymm9, 224(%r10)
+        vmovdqu	256(%r10), %ymm0
+        vmovdqu	288(%r10), %ymm1
+        vmovdqu	320(%r10), %ymm2
+        vmovdqu	352(%r10), %ymm3
+        vmovdqu	384(%r10), %ymm4
+        vmovdqu	416(%r10), %ymm5
+        vmovdqu	448(%r10), %ymm6
+        vmovdqu	480(%r10), %ymm7
+        # 64: 1/3
+        vmovdqu	1280(%r11), %ymm10
+        vmovdqu	1312(%r11), %ymm12
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        # 32: 1/3
+        vmovdqu	1344(%r11), %ymm10
+        vmovdqu	1376(%r11), %ymm12
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm2
+        vpsubw	%ymm9, %ymm1, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        # 32: 1/3
+        vmovdqu	1408(%r11), %ymm10
+        vmovdqu	1440(%r11), %ymm12
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm6
+        vpsubw	%ymm9, %ymm5, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        # 16: 1/3
+        vmovdqu	1472(%r11), %ymm10
+        vmovdqu	1504(%r11), %ymm12
+        vmovdqu	1536(%r11), %ymm11
+        vmovdqu	1568(%r11), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 16: 1/3
+        vmovdqu	1600(%r11), %ymm10
+        vmovdqu	1632(%r11), %ymm12
+        vmovdqu	1664(%r11), %ymm11
+        vmovdqu	1696(%r11), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 8: 1/3
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	1728(%r11), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm1
+        vmovdqu	1760(%r11), %ymm12
+        vperm2i128	$32, %ymm3, %ymm2, %ymm9
+        vmovdqu	1792(%r11), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm3
+        vmovdqu	1824(%r11), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm0
+        vpsubw	%ymm2, %ymm3, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm1
+        vpsubw	%ymm2, %ymm9, %ymm3
+        vpaddw	%ymm0, %ymm8, %ymm8
+        vpaddw	%ymm2, %ymm9, %ymm9
+        # 4: 1/3
+        vmovdqu	1856(%r11), %ymm10
+        vmovdqu	1888(%r11), %ymm12
+        vmovdqu	1920(%r11), %ymm11
+        vmovdqu	1952(%r11), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 8: 1/3
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	1984(%r11), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm5
+        vmovdqu	2016(%r11), %ymm12
+        vperm2i128	$32, %ymm7, %ymm6, %ymm9
+        vmovdqu	2048(%r11), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm7
+        vmovdqu	2080(%r11), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm4
+        vpsubw	%ymm6, %ymm7, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm5
+        vpsubw	%ymm6, %ymm9, %ymm7
+        vpaddw	%ymm4, %ymm8, %ymm8
+        vpaddw	%ymm6, %ymm9, %ymm9
+        # 4: 1/3
+        vmovdqu	2112(%r11), %ymm10
+        vmovdqu	2144(%r11), %ymm12
+        vmovdqu	2176(%r11), %ymm11
+        vmovdqu	2208(%r11), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 2: 1/3
+        vmovdqu	2240(%r11), %ymm10
+        vmovdqu	2272(%r11), %ymm12
+        vmovdqu	2304(%r11), %ymm11
+        vmovdqu	2336(%r11), %ymm13
+        vpsllq	$32, %ymm1, %ymm8
+        vpsrlq	$32, %ymm0, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm0, %ymm0
+        vpblendd	$0x55, %ymm9, %ymm1, %ymm1
+        vpsllq	$32, %ymm3, %ymm8
+        vpsrlq	$32, %ymm2, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm2, %ymm2
+        vpblendd	$0x55, %ymm9, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 2: 1/3
+        vmovdqu	2368(%r11), %ymm10
+        vmovdqu	2400(%r11), %ymm12
+        vmovdqu	2432(%r11), %ymm11
+        vmovdqu	2464(%r11), %ymm13
+        vpsllq	$32, %ymm5, %ymm8
+        vpsrlq	$32, %ymm4, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm4, %ymm4
+        vpblendd	$0x55, %ymm9, %ymm5, %ymm5
+        vpsllq	$32, %ymm7, %ymm8
+        vpsrlq	$32, %ymm6, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm6, %ymm6
+        vpblendd	$0x55, %ymm9, %ymm7, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        vpunpckldq	%ymm1, %ymm0, %ymm8
+        vpunpckhdq	%ymm1, %ymm0, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm0
+        vperm2i128	$49, %ymm9, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm2, %ymm8
+        vpunpckhdq	%ymm3, %ymm2, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm2
+        vperm2i128	$49, %ymm9, %ymm8, %ymm3
+        vpunpckldq	%ymm5, %ymm4, %ymm8
+        vpunpckhdq	%ymm5, %ymm4, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm4
+        vperm2i128	$49, %ymm9, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm6, %ymm8
+        vpunpckhdq	%ymm7, %ymm6, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm6
+        vperm2i128	$49, %ymm9, %ymm8, %ymm7
+        vpmulhw	%ymm15, %ymm0, %ymm8
+        vpmulhw	%ymm15, %ymm1, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm8
+        vpsubw	%ymm9, %ymm1, %ymm9
+        vmovdqu	%ymm8, 256(%r10)
+        vmovdqu	%ymm9, 288(%r10)
+        vpmulhw	%ymm15, %ymm2, %ymm8
+        vpmulhw	%ymm15, %ymm3, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vmovdqu	%ymm8, 320(%r10)
+        vmovdqu	%ymm9, 352(%r10)
+        vpmulhw	%ymm15, %ymm4, %ymm8
+        vpmulhw	%ymm15, %ymm5, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vmovdqu	%ymm8, 384(%r10)
+        vmovdqu	%ymm9, 416(%r10)
+        vpmulhw	%ymm15, %ymm6, %ymm8
+        vpmulhw	%ymm15, %ymm7, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vmovdqu	%ymm8, 448(%r10)
+        vmovdqu	%ymm9, 480(%r10)
+        addq	$0x200, %r10
+        subq	$0x01, %r9
+        jg	L_kyber_keygen_avx2_priv
+        vmovdqu	kyber_qinv(%rip), %ymm13
+        movq	%r8, %rax
+        movq	%rsi, %r10
+L_kyber_keygen_avx2_acc:
+        # Pointwise acc mont
+        movq	%r8, %r9
+        # Base mul mont
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r11
+        vmovdqu	(%rcx), %ymm2
+        vmovdqu	32(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%rdi), %ymm4
+        vmovdqu	32(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r11), %ymm10
+        vmovdqu	32(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%r10)
+        vmovdqu	%ymm1, 32(%r10)
+        vmovdqu	64(%rcx), %ymm2
+        vmovdqu	96(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%rdi), %ymm4
+        vmovdqu	96(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r11), %ymm10
+        vmovdqu	96(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%r10)
+        vmovdqu	%ymm1, 96(%r10)
+        vmovdqu	128(%rcx), %ymm2
+        vmovdqu	160(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%rdi), %ymm4
+        vmovdqu	160(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r11), %ymm10
+        vmovdqu	160(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%r10)
+        vmovdqu	%ymm1, 160(%r10)
+        vmovdqu	192(%rcx), %ymm2
+        vmovdqu	224(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%rdi), %ymm4
+        vmovdqu	224(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r11), %ymm10
+        vmovdqu	224(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%r10)
+        vmovdqu	%ymm1, 224(%r10)
+        vmovdqu	256(%rcx), %ymm2
+        vmovdqu	288(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%rdi), %ymm4
+        vmovdqu	288(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r11), %ymm10
+        vmovdqu	288(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%r10)
+        vmovdqu	%ymm1, 288(%r10)
+        vmovdqu	320(%rcx), %ymm2
+        vmovdqu	352(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%rdi), %ymm4
+        vmovdqu	352(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r11), %ymm10
+        vmovdqu	352(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%r10)
+        vmovdqu	%ymm1, 352(%r10)
+        vmovdqu	384(%rcx), %ymm2
+        vmovdqu	416(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%rdi), %ymm4
+        vmovdqu	416(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r11), %ymm10
+        vmovdqu	416(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%r10)
+        vmovdqu	%ymm1, 416(%r10)
+        vmovdqu	448(%rcx), %ymm2
+        vmovdqu	480(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%rdi), %ymm4
+        vmovdqu	480(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r11), %ymm10
+        vmovdqu	480(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%r10)
+        vmovdqu	%ymm1, 480(%r10)
+        addq	$0x200, %rcx
+        addq	$0x200, %rdi
+        subq	$2, %r9
+        jz	L_pointwise_acc_mont_end_keygen
+L_pointwise_acc_mont_start_keygen:
+        # Base mul mont add
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r11
+        vmovdqu	(%rcx), %ymm2
+        vmovdqu	32(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%rdi), %ymm4
+        vmovdqu	32(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r11), %ymm10
+        vmovdqu	32(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	(%r10), %ymm6
+        vmovdqu	32(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%r10)
+        vmovdqu	%ymm1, 32(%r10)
+        vmovdqu	64(%rcx), %ymm2
+        vmovdqu	96(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%rdi), %ymm4
+        vmovdqu	96(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r11), %ymm10
+        vmovdqu	96(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	64(%r10), %ymm6
+        vmovdqu	96(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%r10)
+        vmovdqu	%ymm1, 96(%r10)
+        vmovdqu	128(%rcx), %ymm2
+        vmovdqu	160(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%rdi), %ymm4
+        vmovdqu	160(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r11), %ymm10
+        vmovdqu	160(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	128(%r10), %ymm6
+        vmovdqu	160(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%r10)
+        vmovdqu	%ymm1, 160(%r10)
+        vmovdqu	192(%rcx), %ymm2
+        vmovdqu	224(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%rdi), %ymm4
+        vmovdqu	224(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r11), %ymm10
+        vmovdqu	224(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	192(%r10), %ymm6
+        vmovdqu	224(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%r10)
+        vmovdqu	%ymm1, 224(%r10)
+        vmovdqu	256(%rcx), %ymm2
+        vmovdqu	288(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%rdi), %ymm4
+        vmovdqu	288(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r11), %ymm10
+        vmovdqu	288(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	256(%r10), %ymm6
+        vmovdqu	288(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%r10)
+        vmovdqu	%ymm1, 288(%r10)
+        vmovdqu	320(%rcx), %ymm2
+        vmovdqu	352(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%rdi), %ymm4
+        vmovdqu	352(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r11), %ymm10
+        vmovdqu	352(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	320(%r10), %ymm6
+        vmovdqu	352(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%r10)
+        vmovdqu	%ymm1, 352(%r10)
+        vmovdqu	384(%rcx), %ymm2
+        vmovdqu	416(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%rdi), %ymm4
+        vmovdqu	416(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r11), %ymm10
+        vmovdqu	416(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	384(%r10), %ymm6
+        vmovdqu	416(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%r10)
+        vmovdqu	%ymm1, 416(%r10)
+        vmovdqu	448(%rcx), %ymm2
+        vmovdqu	480(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%rdi), %ymm4
+        vmovdqu	480(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r11), %ymm10
+        vmovdqu	480(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	448(%r10), %ymm6
+        vmovdqu	480(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%r10)
+        vmovdqu	%ymm1, 480(%r10)
+        addq	$0x200, %rcx
+        addq	$0x200, %rdi
+        subq	$0x01, %r9
+        jg	L_pointwise_acc_mont_start_keygen
+L_pointwise_acc_mont_end_keygen:
+        # Base mul mont add
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r11
+        vmovdqu	(%rcx), %ymm2
+        vmovdqu	32(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%rdi), %ymm4
+        vmovdqu	32(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r11), %ymm10
+        vmovdqu	32(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	(%r10), %ymm6
+        vmovdqu	32(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%r10)
+        vmovdqu	%ymm1, 32(%r10)
+        vmovdqu	64(%rcx), %ymm2
+        vmovdqu	96(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%rdi), %ymm4
+        vmovdqu	96(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r11), %ymm10
+        vmovdqu	96(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	64(%r10), %ymm6
+        vmovdqu	96(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%r10)
+        vmovdqu	%ymm1, 96(%r10)
+        vmovdqu	128(%rcx), %ymm2
+        vmovdqu	160(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%rdi), %ymm4
+        vmovdqu	160(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r11), %ymm10
+        vmovdqu	160(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	128(%r10), %ymm6
+        vmovdqu	160(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%r10)
+        vmovdqu	%ymm1, 160(%r10)
+        vmovdqu	192(%rcx), %ymm2
+        vmovdqu	224(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%rdi), %ymm4
+        vmovdqu	224(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r11), %ymm10
+        vmovdqu	224(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	192(%r10), %ymm6
+        vmovdqu	224(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%r10)
+        vmovdqu	%ymm1, 224(%r10)
+        vmovdqu	256(%rcx), %ymm2
+        vmovdqu	288(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%rdi), %ymm4
+        vmovdqu	288(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r11), %ymm10
+        vmovdqu	288(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	256(%r10), %ymm6
+        vmovdqu	288(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%r10)
+        vmovdqu	%ymm1, 288(%r10)
+        vmovdqu	320(%rcx), %ymm2
+        vmovdqu	352(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%rdi), %ymm4
+        vmovdqu	352(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r11), %ymm10
+        vmovdqu	352(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	320(%r10), %ymm6
+        vmovdqu	352(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%r10)
+        vmovdqu	%ymm1, 352(%r10)
+        vmovdqu	384(%rcx), %ymm2
+        vmovdqu	416(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%rdi), %ymm4
+        vmovdqu	416(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r11), %ymm10
+        vmovdqu	416(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	384(%r10), %ymm6
+        vmovdqu	416(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%r10)
+        vmovdqu	%ymm1, 416(%r10)
+        vmovdqu	448(%rcx), %ymm2
+        vmovdqu	480(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%rdi), %ymm4
+        vmovdqu	480(%rdi), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r11), %ymm10
+        vmovdqu	480(%r11), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm13, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	448(%r10), %ymm6
+        vmovdqu	480(%r10), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%r10)
+        vmovdqu	%ymm1, 480(%r10)
+        addq	$0x200, %rcx
+        addq	$0x200, %rdi
+        movq	%r8, %r9
+        shl	$9, %r9d
+        subq	%r9, %rdi
+        addq	$0x200, %r10
+        subq	$0x01, %rax
+        jg	L_kyber_keygen_avx2_acc
+        movq	%r8, %rax
+        vmovdqu	kyber_f(%rip), %ymm12
+        vmovdqu	kyber_f_qinv(%rip), %ymm13
+        movq	%r8, %rax
+        movq	%rsi, %r10
+L_kyber_keygen_avx2_to_mont:
+        # To Mont
+        vmovdqu	(%r10), %ymm0
+        vmovdqu	32(%r10), %ymm1
+        vmovdqu	64(%r10), %ymm2
+        vmovdqu	96(%r10), %ymm3
+        vpmullw	%ymm13, %ymm0, %ymm4
+        vpmulhw	%ymm12, %ymm0, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm0
+        vpmullw	%ymm13, %ymm1, %ymm4
+        vpmulhw	%ymm12, %ymm1, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm4
+        vpmulhw	%ymm12, %ymm2, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm2
+        vpmullw	%ymm13, %ymm3, %ymm4
+        vpmulhw	%ymm12, %ymm3, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm3
+        vmovdqu	%ymm0, (%r10)
+        vmovdqu	%ymm1, 32(%r10)
+        vmovdqu	%ymm2, 64(%r10)
+        vmovdqu	%ymm3, 96(%r10)
+        vmovdqu	128(%r10), %ymm0
+        vmovdqu	160(%r10), %ymm1
+        vmovdqu	192(%r10), %ymm2
+        vmovdqu	224(%r10), %ymm3
+        vpmullw	%ymm13, %ymm0, %ymm4
+        vpmulhw	%ymm12, %ymm0, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm0
+        vpmullw	%ymm13, %ymm1, %ymm4
+        vpmulhw	%ymm12, %ymm1, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm4
+        vpmulhw	%ymm12, %ymm2, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm2
+        vpmullw	%ymm13, %ymm3, %ymm4
+        vpmulhw	%ymm12, %ymm3, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm3
+        vmovdqu	%ymm0, 128(%r10)
+        vmovdqu	%ymm1, 160(%r10)
+        vmovdqu	%ymm2, 192(%r10)
+        vmovdqu	%ymm3, 224(%r10)
+        vmovdqu	256(%r10), %ymm0
+        vmovdqu	288(%r10), %ymm1
+        vmovdqu	320(%r10), %ymm2
+        vmovdqu	352(%r10), %ymm3
+        vpmullw	%ymm13, %ymm0, %ymm4
+        vpmulhw	%ymm12, %ymm0, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm0
+        vpmullw	%ymm13, %ymm1, %ymm4
+        vpmulhw	%ymm12, %ymm1, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm4
+        vpmulhw	%ymm12, %ymm2, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm2
+        vpmullw	%ymm13, %ymm3, %ymm4
+        vpmulhw	%ymm12, %ymm3, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm3
+        vmovdqu	%ymm0, 256(%r10)
+        vmovdqu	%ymm1, 288(%r10)
+        vmovdqu	%ymm2, 320(%r10)
+        vmovdqu	%ymm3, 352(%r10)
+        vmovdqu	384(%r10), %ymm0
+        vmovdqu	416(%r10), %ymm1
+        vmovdqu	448(%r10), %ymm2
+        vmovdqu	480(%r10), %ymm3
+        vpmullw	%ymm13, %ymm0, %ymm4
+        vpmulhw	%ymm12, %ymm0, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm0
+        vpmullw	%ymm13, %ymm1, %ymm4
+        vpmulhw	%ymm12, %ymm1, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm4
+        vpmulhw	%ymm12, %ymm2, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm2
+        vpmullw	%ymm13, %ymm3, %ymm4
+        vpmulhw	%ymm12, %ymm3, %ymm5
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpsubw	%ymm4, %ymm5, %ymm3
+        vmovdqu	%ymm0, 384(%r10)
+        vmovdqu	%ymm1, 416(%r10)
+        vmovdqu	%ymm2, 448(%r10)
+        vmovdqu	%ymm3, 480(%r10)
+        addq	$0x200, %r10
+        subq	$0x01, %rax
+        jg	L_kyber_keygen_avx2_to_mont
+        movq	%r8, %rax
+L_kyber_keygen_avx2_to_mont_ntt_err:
+        # ntt
+        leaq	L_kyber_avx2_zetas(%rip), %r11
+        vmovdqu	(%r11), %ymm10
+        vmovdqu	32(%r11), %ymm12
+        vmovdqu	128(%rdx), %ymm0
+        vmovdqu	160(%rdx), %ymm1
+        vmovdqu	192(%rdx), %ymm2
+        vmovdqu	224(%rdx), %ymm3
+        vmovdqu	384(%rdx), %ymm4
+        vmovdqu	416(%rdx), %ymm5
+        vmovdqu	448(%rdx), %ymm6
+        vmovdqu	480(%rdx), %ymm7
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vmovdqu	%ymm0, 128(%rdx)
+        vmovdqu	%ymm1, 160(%rdx)
+        vmovdqu	%ymm2, 192(%rdx)
+        vmovdqu	%ymm3, 224(%rdx)
+        vmovdqu	%ymm4, 384(%rdx)
+        vmovdqu	%ymm5, 416(%rdx)
+        vmovdqu	%ymm6, 448(%rdx)
+        vmovdqu	%ymm7, 480(%rdx)
+        vmovdqu	(%rdx), %ymm0
+        vmovdqu	32(%rdx), %ymm1
+        vmovdqu	64(%rdx), %ymm2
+        vmovdqu	96(%rdx), %ymm3
+        vmovdqu	256(%rdx), %ymm4
+        vmovdqu	288(%rdx), %ymm5
+        vmovdqu	320(%rdx), %ymm6
+        vmovdqu	352(%rdx), %ymm7
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vmovdqu	%ymm4, 256(%rdx)
+        vmovdqu	%ymm5, 288(%rdx)
+        vmovdqu	%ymm6, 320(%rdx)
+        vmovdqu	%ymm7, 352(%rdx)
+        vmovdqu	128(%rdx), %ymm4
+        vmovdqu	160(%rdx), %ymm5
+        vmovdqu	192(%rdx), %ymm6
+        vmovdqu	224(%rdx), %ymm7
+        # 64: 0/3
+        vmovdqu	64(%r11), %ymm10
+        vmovdqu	96(%r11), %ymm12
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        # 32: 0/3
+        vmovdqu	128(%r11), %ymm10
+        vmovdqu	160(%r11), %ymm12
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm2
+        vpsubw	%ymm9, %ymm1, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        # 32: 0/3
+        vmovdqu	192(%r11), %ymm10
+        vmovdqu	224(%r11), %ymm12
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm6
+        vpsubw	%ymm9, %ymm5, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        # 16: 0/3
+        vmovdqu	256(%r11), %ymm10
+        vmovdqu	288(%r11), %ymm12
+        vmovdqu	320(%r11), %ymm11
+        vmovdqu	352(%r11), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 16: 0/3
+        vmovdqu	384(%r11), %ymm10
+        vmovdqu	416(%r11), %ymm12
+        vmovdqu	448(%r11), %ymm11
+        vmovdqu	480(%r11), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 8: 0/3
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	512(%r11), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm1
+        vmovdqu	544(%r11), %ymm12
+        vperm2i128	$32, %ymm3, %ymm2, %ymm9
+        vmovdqu	576(%r11), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm3
+        vmovdqu	608(%r11), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm0
+        vpsubw	%ymm2, %ymm3, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm1
+        vpsubw	%ymm2, %ymm9, %ymm3
+        vpaddw	%ymm0, %ymm8, %ymm8
+        vpaddw	%ymm2, %ymm9, %ymm9
+        # 4: 0/3
+        vmovdqu	640(%r11), %ymm10
+        vmovdqu	672(%r11), %ymm12
+        vmovdqu	704(%r11), %ymm11
+        vmovdqu	736(%r11), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 8: 0/3
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	768(%r11), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm5
+        vmovdqu	800(%r11), %ymm12
+        vperm2i128	$32, %ymm7, %ymm6, %ymm9
+        vmovdqu	832(%r11), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm7
+        vmovdqu	864(%r11), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm4
+        vpsubw	%ymm6, %ymm7, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm5
+        vpsubw	%ymm6, %ymm9, %ymm7
+        vpaddw	%ymm4, %ymm8, %ymm8
+        vpaddw	%ymm6, %ymm9, %ymm9
+        # 4: 0/3
+        vmovdqu	896(%r11), %ymm10
+        vmovdqu	928(%r11), %ymm12
+        vmovdqu	960(%r11), %ymm11
+        vmovdqu	992(%r11), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 2: 0/3
+        vmovdqu	1024(%r11), %ymm10
+        vmovdqu	1056(%r11), %ymm12
+        vmovdqu	1088(%r11), %ymm11
+        vmovdqu	1120(%r11), %ymm13
+        vpsllq	$32, %ymm1, %ymm8
+        vpsrlq	$32, %ymm0, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm0, %ymm0
+        vpblendd	$0x55, %ymm9, %ymm1, %ymm1
+        vpsllq	$32, %ymm3, %ymm8
+        vpsrlq	$32, %ymm2, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm2, %ymm2
+        vpblendd	$0x55, %ymm9, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 2: 0/3
+        vmovdqu	1152(%r11), %ymm10
+        vmovdqu	1184(%r11), %ymm12
+        vmovdqu	1216(%r11), %ymm11
+        vmovdqu	1248(%r11), %ymm13
+        vpsllq	$32, %ymm5, %ymm8
+        vpsrlq	$32, %ymm4, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm4, %ymm4
+        vpblendd	$0x55, %ymm9, %ymm5, %ymm5
+        vpsllq	$32, %ymm7, %ymm8
+        vpsrlq	$32, %ymm6, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm6, %ymm6
+        vpblendd	$0x55, %ymm9, %ymm7, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        vpunpckldq	%ymm1, %ymm0, %ymm8
+        vpunpckhdq	%ymm1, %ymm0, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm0
+        vperm2i128	$49, %ymm9, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm2, %ymm8
+        vpunpckhdq	%ymm3, %ymm2, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm2
+        vperm2i128	$49, %ymm9, %ymm8, %ymm3
+        vpunpckldq	%ymm5, %ymm4, %ymm8
+        vpunpckhdq	%ymm5, %ymm4, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm4
+        vperm2i128	$49, %ymm9, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm6, %ymm8
+        vpunpckhdq	%ymm7, %ymm6, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm6
+        vperm2i128	$49, %ymm9, %ymm8, %ymm7
+        vmovdqu	%ymm0, (%rdx)
+        vmovdqu	%ymm1, 32(%rdx)
+        vmovdqu	%ymm2, 64(%rdx)
+        vmovdqu	%ymm3, 96(%rdx)
+        vmovdqu	%ymm4, 128(%rdx)
+        vmovdqu	%ymm5, 160(%rdx)
+        vmovdqu	%ymm6, 192(%rdx)
+        vmovdqu	%ymm7, 224(%rdx)
+        vmovdqu	256(%rdx), %ymm0
+        vmovdqu	288(%rdx), %ymm1
+        vmovdqu	320(%rdx), %ymm2
+        vmovdqu	352(%rdx), %ymm3
+        vmovdqu	384(%rdx), %ymm4
+        vmovdqu	416(%rdx), %ymm5
+        vmovdqu	448(%rdx), %ymm6
+        vmovdqu	480(%rdx), %ymm7
+        # 64: 1/3
+        vmovdqu	1280(%r11), %ymm10
+        vmovdqu	1312(%r11), %ymm12
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        # 32: 1/3
+        vmovdqu	1344(%r11), %ymm10
+        vmovdqu	1376(%r11), %ymm12
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm2
+        vpsubw	%ymm9, %ymm1, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        # 32: 1/3
+        vmovdqu	1408(%r11), %ymm10
+        vmovdqu	1440(%r11), %ymm12
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm6
+        vpsubw	%ymm9, %ymm5, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        # 16: 1/3
+        vmovdqu	1472(%r11), %ymm10
+        vmovdqu	1504(%r11), %ymm12
+        vmovdqu	1536(%r11), %ymm11
+        vmovdqu	1568(%r11), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 16: 1/3
+        vmovdqu	1600(%r11), %ymm10
+        vmovdqu	1632(%r11), %ymm12
+        vmovdqu	1664(%r11), %ymm11
+        vmovdqu	1696(%r11), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 8: 1/3
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	1728(%r11), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm1
+        vmovdqu	1760(%r11), %ymm12
+        vperm2i128	$32, %ymm3, %ymm2, %ymm9
+        vmovdqu	1792(%r11), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm3
+        vmovdqu	1824(%r11), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm0
+        vpsubw	%ymm2, %ymm3, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm1
+        vpsubw	%ymm2, %ymm9, %ymm3
+        vpaddw	%ymm0, %ymm8, %ymm8
+        vpaddw	%ymm2, %ymm9, %ymm9
+        # 4: 1/3
+        vmovdqu	1856(%r11), %ymm10
+        vmovdqu	1888(%r11), %ymm12
+        vmovdqu	1920(%r11), %ymm11
+        vmovdqu	1952(%r11), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 8: 1/3
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	1984(%r11), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm5
+        vmovdqu	2016(%r11), %ymm12
+        vperm2i128	$32, %ymm7, %ymm6, %ymm9
+        vmovdqu	2048(%r11), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm7
+        vmovdqu	2080(%r11), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm4
+        vpsubw	%ymm6, %ymm7, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm5
+        vpsubw	%ymm6, %ymm9, %ymm7
+        vpaddw	%ymm4, %ymm8, %ymm8
+        vpaddw	%ymm6, %ymm9, %ymm9
+        # 4: 1/3
+        vmovdqu	2112(%r11), %ymm10
+        vmovdqu	2144(%r11), %ymm12
+        vmovdqu	2176(%r11), %ymm11
+        vmovdqu	2208(%r11), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 2: 1/3
+        vmovdqu	2240(%r11), %ymm10
+        vmovdqu	2272(%r11), %ymm12
+        vmovdqu	2304(%r11), %ymm11
+        vmovdqu	2336(%r11), %ymm13
+        vpsllq	$32, %ymm1, %ymm8
+        vpsrlq	$32, %ymm0, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm0, %ymm0
+        vpblendd	$0x55, %ymm9, %ymm1, %ymm1
+        vpsllq	$32, %ymm3, %ymm8
+        vpsrlq	$32, %ymm2, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm2, %ymm2
+        vpblendd	$0x55, %ymm9, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 2: 1/3
+        vmovdqu	2368(%r11), %ymm10
+        vmovdqu	2400(%r11), %ymm12
+        vmovdqu	2432(%r11), %ymm11
+        vmovdqu	2464(%r11), %ymm13
+        vpsllq	$32, %ymm5, %ymm8
+        vpsrlq	$32, %ymm4, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm4, %ymm4
+        vpblendd	$0x55, %ymm9, %ymm5, %ymm5
+        vpsllq	$32, %ymm7, %ymm8
+        vpsrlq	$32, %ymm6, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm6, %ymm6
+        vpblendd	$0x55, %ymm9, %ymm7, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        vpunpckldq	%ymm1, %ymm0, %ymm8
+        vpunpckhdq	%ymm1, %ymm0, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm0
+        vperm2i128	$49, %ymm9, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm2, %ymm8
+        vpunpckhdq	%ymm3, %ymm2, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm2
+        vperm2i128	$49, %ymm9, %ymm8, %ymm3
+        vpunpckldq	%ymm5, %ymm4, %ymm8
+        vpunpckhdq	%ymm5, %ymm4, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm4
+        vperm2i128	$49, %ymm9, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm6, %ymm8
+        vpunpckhdq	%ymm7, %ymm6, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm6
+        vperm2i128	$49, %ymm9, %ymm8, %ymm7
+        vmovdqu	%ymm0, 256(%rdx)
+        vmovdqu	%ymm1, 288(%rdx)
+        vmovdqu	%ymm2, 320(%rdx)
+        vmovdqu	%ymm3, 352(%rdx)
+        vmovdqu	%ymm4, 384(%rdx)
+        vmovdqu	%ymm5, 416(%rdx)
+        vmovdqu	%ymm6, 448(%rdx)
+        vmovdqu	%ymm7, 480(%rdx)
+        # Add Errors
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vmovdqu	64(%rsi), %ymm2
+        vmovdqu	96(%rsi), %ymm3
+        vmovdqu	(%rdx), %ymm4
+        vmovdqu	32(%rdx), %ymm5
+        vmovdqu	64(%rdx), %ymm6
+        vmovdqu	96(%rdx), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	%ymm2, 64(%rsi)
+        vmovdqu	%ymm3, 96(%rsi)
+        vmovdqu	128(%rsi), %ymm0
+        vmovdqu	160(%rsi), %ymm1
+        vmovdqu	192(%rsi), %ymm2
+        vmovdqu	224(%rsi), %ymm3
+        vmovdqu	128(%rdx), %ymm4
+        vmovdqu	160(%rdx), %ymm5
+        vmovdqu	192(%rdx), %ymm6
+        vmovdqu	224(%rdx), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	%ymm2, 192(%rsi)
+        vmovdqu	%ymm3, 224(%rsi)
+        vmovdqu	256(%rsi), %ymm0
+        vmovdqu	288(%rsi), %ymm1
+        vmovdqu	320(%rsi), %ymm2
+        vmovdqu	352(%rsi), %ymm3
+        vmovdqu	256(%rdx), %ymm4
+        vmovdqu	288(%rdx), %ymm5
+        vmovdqu	320(%rdx), %ymm6
+        vmovdqu	352(%rdx), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	%ymm2, 320(%rsi)
+        vmovdqu	%ymm3, 352(%rsi)
+        vmovdqu	384(%rsi), %ymm0
+        vmovdqu	416(%rsi), %ymm1
+        vmovdqu	448(%rsi), %ymm2
+        vmovdqu	480(%rsi), %ymm3
+        vmovdqu	384(%rdx), %ymm4
+        vmovdqu	416(%rdx), %ymm5
+        vmovdqu	448(%rdx), %ymm6
+        vmovdqu	480(%rdx), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 384(%rsi)
+        vmovdqu	%ymm1, 416(%rsi)
+        vmovdqu	%ymm2, 448(%rsi)
+        vmovdqu	%ymm3, 480(%rsi)
+        addq	$0x200, %rdx
+        addq	$0x200, %rsi
+        subq	$0x01, %rax
+        jg	L_kyber_keygen_avx2_to_mont_ntt_err
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_keygen_avx2,.-kyber_keygen_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.text
+.globl	kyber_encapsulate_avx2
+.type	kyber_encapsulate_avx2,@function
+.align	16
+kyber_encapsulate_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_encapsulate_avx2
+.p2align	4
+_kyber_encapsulate_avx2:
+#endif /* __APPLE__ */
+        pushq	%r12
+        pushq	%r13
+        pushq	%r14
+        pushq	%r15
+        movq	40(%rsp), %rax
+        movq	48(%rsp), %r10
+        movq	56(%rsp), %r11
+        subq	$48, %rsp
+        vmovdqu	kyber_q(%rip), %ymm14
+        vmovdqu	kyber_v(%rip), %ymm15
+        movq	%r11, %r13
+        movq	%r8, %r14
+L_kyber_encapsulate_avx2_trans:
+        # ntt
+        leaq	L_kyber_avx2_zetas(%rip), %r15
+        vmovdqu	(%r15), %ymm10
+        vmovdqu	32(%r15), %ymm12
+        vmovdqu	128(%r14), %ymm0
+        vmovdqu	160(%r14), %ymm1
+        vmovdqu	192(%r14), %ymm2
+        vmovdqu	224(%r14), %ymm3
+        vmovdqu	384(%r14), %ymm4
+        vmovdqu	416(%r14), %ymm5
+        vmovdqu	448(%r14), %ymm6
+        vmovdqu	480(%r14), %ymm7
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vmovdqu	%ymm0, 128(%r14)
+        vmovdqu	%ymm1, 160(%r14)
+        vmovdqu	%ymm2, 192(%r14)
+        vmovdqu	%ymm3, 224(%r14)
+        vmovdqu	%ymm4, 384(%r14)
+        vmovdqu	%ymm5, 416(%r14)
+        vmovdqu	%ymm6, 448(%r14)
+        vmovdqu	%ymm7, 480(%r14)
+        vmovdqu	(%r14), %ymm0
+        vmovdqu	32(%r14), %ymm1
+        vmovdqu	64(%r14), %ymm2
+        vmovdqu	96(%r14), %ymm3
+        vmovdqu	256(%r14), %ymm4
+        vmovdqu	288(%r14), %ymm5
+        vmovdqu	320(%r14), %ymm6
+        vmovdqu	352(%r14), %ymm7
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vmovdqu	%ymm4, 256(%r14)
+        vmovdqu	%ymm5, 288(%r14)
+        vmovdqu	%ymm6, 320(%r14)
+        vmovdqu	%ymm7, 352(%r14)
+        vmovdqu	128(%r14), %ymm4
+        vmovdqu	160(%r14), %ymm5
+        vmovdqu	192(%r14), %ymm6
+        vmovdqu	224(%r14), %ymm7
+        # 64: 0/3
+        vmovdqu	64(%r15), %ymm10
+        vmovdqu	96(%r15), %ymm12
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        # 32: 0/3
+        vmovdqu	128(%r15), %ymm10
+        vmovdqu	160(%r15), %ymm12
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm2
+        vpsubw	%ymm9, %ymm1, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        # 32: 0/3
+        vmovdqu	192(%r15), %ymm10
+        vmovdqu	224(%r15), %ymm12
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm6
+        vpsubw	%ymm9, %ymm5, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        # 16: 0/3
+        vmovdqu	256(%r15), %ymm10
+        vmovdqu	288(%r15), %ymm12
+        vmovdqu	320(%r15), %ymm11
+        vmovdqu	352(%r15), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 16: 0/3
+        vmovdqu	384(%r15), %ymm10
+        vmovdqu	416(%r15), %ymm12
+        vmovdqu	448(%r15), %ymm11
+        vmovdqu	480(%r15), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 8: 0/3
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	512(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm1
+        vmovdqu	544(%r15), %ymm12
+        vperm2i128	$32, %ymm3, %ymm2, %ymm9
+        vmovdqu	576(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm3
+        vmovdqu	608(%r15), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm0
+        vpsubw	%ymm2, %ymm3, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm1
+        vpsubw	%ymm2, %ymm9, %ymm3
+        vpaddw	%ymm0, %ymm8, %ymm8
+        vpaddw	%ymm2, %ymm9, %ymm9
+        # 4: 0/3
+        vmovdqu	640(%r15), %ymm10
+        vmovdqu	672(%r15), %ymm12
+        vmovdqu	704(%r15), %ymm11
+        vmovdqu	736(%r15), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 8: 0/3
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	768(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm5
+        vmovdqu	800(%r15), %ymm12
+        vperm2i128	$32, %ymm7, %ymm6, %ymm9
+        vmovdqu	832(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm7
+        vmovdqu	864(%r15), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm4
+        vpsubw	%ymm6, %ymm7, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm5
+        vpsubw	%ymm6, %ymm9, %ymm7
+        vpaddw	%ymm4, %ymm8, %ymm8
+        vpaddw	%ymm6, %ymm9, %ymm9
+        # 4: 0/3
+        vmovdqu	896(%r15), %ymm10
+        vmovdqu	928(%r15), %ymm12
+        vmovdqu	960(%r15), %ymm11
+        vmovdqu	992(%r15), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 2: 0/3
+        vmovdqu	1024(%r15), %ymm10
+        vmovdqu	1056(%r15), %ymm12
+        vmovdqu	1088(%r15), %ymm11
+        vmovdqu	1120(%r15), %ymm13
+        vpsllq	$32, %ymm1, %ymm8
+        vpsrlq	$32, %ymm0, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm0, %ymm0
+        vpblendd	$0x55, %ymm9, %ymm1, %ymm1
+        vpsllq	$32, %ymm3, %ymm8
+        vpsrlq	$32, %ymm2, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm2, %ymm2
+        vpblendd	$0x55, %ymm9, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 2: 0/3
+        vmovdqu	1152(%r15), %ymm10
+        vmovdqu	1184(%r15), %ymm12
+        vmovdqu	1216(%r15), %ymm11
+        vmovdqu	1248(%r15), %ymm13
+        vpsllq	$32, %ymm5, %ymm8
+        vpsrlq	$32, %ymm4, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm4, %ymm4
+        vpblendd	$0x55, %ymm9, %ymm5, %ymm5
+        vpsllq	$32, %ymm7, %ymm8
+        vpsrlq	$32, %ymm6, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm6, %ymm6
+        vpblendd	$0x55, %ymm9, %ymm7, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        vpunpckldq	%ymm1, %ymm0, %ymm8
+        vpunpckhdq	%ymm1, %ymm0, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm0
+        vperm2i128	$49, %ymm9, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm2, %ymm8
+        vpunpckhdq	%ymm3, %ymm2, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm2
+        vperm2i128	$49, %ymm9, %ymm8, %ymm3
+        vpunpckldq	%ymm5, %ymm4, %ymm8
+        vpunpckhdq	%ymm5, %ymm4, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm4
+        vperm2i128	$49, %ymm9, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm6, %ymm8
+        vpunpckhdq	%ymm7, %ymm6, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm6
+        vperm2i128	$49, %ymm9, %ymm8, %ymm7
+        vmovdqu	%ymm0, (%r14)
+        vmovdqu	%ymm1, 32(%r14)
+        vmovdqu	%ymm2, 64(%r14)
+        vmovdqu	%ymm3, 96(%r14)
+        vmovdqu	%ymm4, 128(%r14)
+        vmovdqu	%ymm5, 160(%r14)
+        vmovdqu	%ymm6, 192(%r14)
+        vmovdqu	%ymm7, 224(%r14)
+        vmovdqu	256(%r14), %ymm0
+        vmovdqu	288(%r14), %ymm1
+        vmovdqu	320(%r14), %ymm2
+        vmovdqu	352(%r14), %ymm3
+        vmovdqu	384(%r14), %ymm4
+        vmovdqu	416(%r14), %ymm5
+        vmovdqu	448(%r14), %ymm6
+        vmovdqu	480(%r14), %ymm7
+        # 64: 1/3
+        vmovdqu	1280(%r15), %ymm10
+        vmovdqu	1312(%r15), %ymm12
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        # 32: 1/3
+        vmovdqu	1344(%r15), %ymm10
+        vmovdqu	1376(%r15), %ymm12
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm2
+        vpsubw	%ymm9, %ymm1, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        # 32: 1/3
+        vmovdqu	1408(%r15), %ymm10
+        vmovdqu	1440(%r15), %ymm12
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm6
+        vpsubw	%ymm9, %ymm5, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        # 16: 1/3
+        vmovdqu	1472(%r15), %ymm10
+        vmovdqu	1504(%r15), %ymm12
+        vmovdqu	1536(%r15), %ymm11
+        vmovdqu	1568(%r15), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 16: 1/3
+        vmovdqu	1600(%r15), %ymm10
+        vmovdqu	1632(%r15), %ymm12
+        vmovdqu	1664(%r15), %ymm11
+        vmovdqu	1696(%r15), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 8: 1/3
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	1728(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm1
+        vmovdqu	1760(%r15), %ymm12
+        vperm2i128	$32, %ymm3, %ymm2, %ymm9
+        vmovdqu	1792(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm3
+        vmovdqu	1824(%r15), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm0
+        vpsubw	%ymm2, %ymm3, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm1
+        vpsubw	%ymm2, %ymm9, %ymm3
+        vpaddw	%ymm0, %ymm8, %ymm8
+        vpaddw	%ymm2, %ymm9, %ymm9
+        # 4: 1/3
+        vmovdqu	1856(%r15), %ymm10
+        vmovdqu	1888(%r15), %ymm12
+        vmovdqu	1920(%r15), %ymm11
+        vmovdqu	1952(%r15), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 8: 1/3
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	1984(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm5
+        vmovdqu	2016(%r15), %ymm12
+        vperm2i128	$32, %ymm7, %ymm6, %ymm9
+        vmovdqu	2048(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm7
+        vmovdqu	2080(%r15), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm4
+        vpsubw	%ymm6, %ymm7, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm5
+        vpsubw	%ymm6, %ymm9, %ymm7
+        vpaddw	%ymm4, %ymm8, %ymm8
+        vpaddw	%ymm6, %ymm9, %ymm9
+        # 4: 1/3
+        vmovdqu	2112(%r15), %ymm10
+        vmovdqu	2144(%r15), %ymm12
+        vmovdqu	2176(%r15), %ymm11
+        vmovdqu	2208(%r15), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 2: 1/3
+        vmovdqu	2240(%r15), %ymm10
+        vmovdqu	2272(%r15), %ymm12
+        vmovdqu	2304(%r15), %ymm11
+        vmovdqu	2336(%r15), %ymm13
+        vpsllq	$32, %ymm1, %ymm8
+        vpsrlq	$32, %ymm0, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm0, %ymm0
+        vpblendd	$0x55, %ymm9, %ymm1, %ymm1
+        vpsllq	$32, %ymm3, %ymm8
+        vpsrlq	$32, %ymm2, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm2, %ymm2
+        vpblendd	$0x55, %ymm9, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 2: 1/3
+        vmovdqu	2368(%r15), %ymm10
+        vmovdqu	2400(%r15), %ymm12
+        vmovdqu	2432(%r15), %ymm11
+        vmovdqu	2464(%r15), %ymm13
+        vpsllq	$32, %ymm5, %ymm8
+        vpsrlq	$32, %ymm4, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm4, %ymm4
+        vpblendd	$0x55, %ymm9, %ymm5, %ymm5
+        vpsllq	$32, %ymm7, %ymm8
+        vpsrlq	$32, %ymm6, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm6, %ymm6
+        vpblendd	$0x55, %ymm9, %ymm7, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        vpunpckldq	%ymm1, %ymm0, %ymm8
+        vpunpckhdq	%ymm1, %ymm0, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm0
+        vperm2i128	$49, %ymm9, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm2, %ymm8
+        vpunpckhdq	%ymm3, %ymm2, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm2
+        vperm2i128	$49, %ymm9, %ymm8, %ymm3
+        vpunpckldq	%ymm5, %ymm4, %ymm8
+        vpunpckhdq	%ymm5, %ymm4, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm4
+        vperm2i128	$49, %ymm9, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm6, %ymm8
+        vpunpckhdq	%ymm7, %ymm6, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm6
+        vperm2i128	$49, %ymm9, %ymm8, %ymm7
+        vmovdqu	%ymm0, 256(%r14)
+        vmovdqu	%ymm1, 288(%r14)
+        vmovdqu	%ymm2, 320(%r14)
+        vmovdqu	%ymm3, 352(%r14)
+        vmovdqu	%ymm4, 384(%r14)
+        vmovdqu	%ymm5, 416(%r14)
+        vmovdqu	%ymm6, 448(%r14)
+        vmovdqu	%ymm7, 480(%r14)
+        addq	$0x200, %r14
+        subq	$0x01, %r13
+        jg	L_kyber_encapsulate_avx2_trans
+        movq	%r11, %r12
+L_kyber_encapsulate_avx2_calc:
+        vmovdqu	kyber_qinv(%rip), %ymm12
+        # Pointwise acc mont
+        movq	%r11, %r13
+        # Base mul mont
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r15
+        vmovdqu	(%rcx), %ymm2
+        vmovdqu	32(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%r8), %ymm4
+        vmovdqu	32(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r15), %ymm10
+        vmovdqu	32(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	64(%rcx), %ymm2
+        vmovdqu	96(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%r8), %ymm4
+        vmovdqu	96(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r15), %ymm10
+        vmovdqu	96(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%rsi)
+        vmovdqu	%ymm1, 96(%rsi)
+        vmovdqu	128(%rcx), %ymm2
+        vmovdqu	160(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%r8), %ymm4
+        vmovdqu	160(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r15), %ymm10
+        vmovdqu	160(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	192(%rcx), %ymm2
+        vmovdqu	224(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%r8), %ymm4
+        vmovdqu	224(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r15), %ymm10
+        vmovdqu	224(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%rsi)
+        vmovdqu	%ymm1, 224(%rsi)
+        vmovdqu	256(%rcx), %ymm2
+        vmovdqu	288(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%r8), %ymm4
+        vmovdqu	288(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r15), %ymm10
+        vmovdqu	288(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	320(%rcx), %ymm2
+        vmovdqu	352(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%r8), %ymm4
+        vmovdqu	352(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r15), %ymm10
+        vmovdqu	352(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%rsi)
+        vmovdqu	%ymm1, 352(%rsi)
+        vmovdqu	384(%rcx), %ymm2
+        vmovdqu	416(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%r8), %ymm4
+        vmovdqu	416(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r15), %ymm10
+        vmovdqu	416(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%rsi)
+        vmovdqu	%ymm1, 416(%rsi)
+        vmovdqu	448(%rcx), %ymm2
+        vmovdqu	480(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%r8), %ymm4
+        vmovdqu	480(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r15), %ymm10
+        vmovdqu	480(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%rsi)
+        vmovdqu	%ymm1, 480(%rsi)
+        addq	$0x200, %rcx
+        addq	$0x200, %r8
+        subq	$2, %r13
+        jz	L_pointwise_acc_mont_end_encap_bp
+L_pointwise_acc_mont_start_encap_bp:
+        # Base mul mont add
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r15
+        vmovdqu	(%rcx), %ymm2
+        vmovdqu	32(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%r8), %ymm4
+        vmovdqu	32(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r15), %ymm10
+        vmovdqu	32(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	(%rsi), %ymm6
+        vmovdqu	32(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	64(%rcx), %ymm2
+        vmovdqu	96(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%r8), %ymm4
+        vmovdqu	96(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r15), %ymm10
+        vmovdqu	96(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	64(%rsi), %ymm6
+        vmovdqu	96(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%rsi)
+        vmovdqu	%ymm1, 96(%rsi)
+        vmovdqu	128(%rcx), %ymm2
+        vmovdqu	160(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%r8), %ymm4
+        vmovdqu	160(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r15), %ymm10
+        vmovdqu	160(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	128(%rsi), %ymm6
+        vmovdqu	160(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	192(%rcx), %ymm2
+        vmovdqu	224(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%r8), %ymm4
+        vmovdqu	224(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r15), %ymm10
+        vmovdqu	224(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	192(%rsi), %ymm6
+        vmovdqu	224(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%rsi)
+        vmovdqu	%ymm1, 224(%rsi)
+        vmovdqu	256(%rcx), %ymm2
+        vmovdqu	288(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%r8), %ymm4
+        vmovdqu	288(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r15), %ymm10
+        vmovdqu	288(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	256(%rsi), %ymm6
+        vmovdqu	288(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	320(%rcx), %ymm2
+        vmovdqu	352(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%r8), %ymm4
+        vmovdqu	352(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r15), %ymm10
+        vmovdqu	352(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	320(%rsi), %ymm6
+        vmovdqu	352(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%rsi)
+        vmovdqu	%ymm1, 352(%rsi)
+        vmovdqu	384(%rcx), %ymm2
+        vmovdqu	416(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%r8), %ymm4
+        vmovdqu	416(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r15), %ymm10
+        vmovdqu	416(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	384(%rsi), %ymm6
+        vmovdqu	416(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%rsi)
+        vmovdqu	%ymm1, 416(%rsi)
+        vmovdqu	448(%rcx), %ymm2
+        vmovdqu	480(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%r8), %ymm4
+        vmovdqu	480(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r15), %ymm10
+        vmovdqu	480(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	448(%rsi), %ymm6
+        vmovdqu	480(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%rsi)
+        vmovdqu	%ymm1, 480(%rsi)
+        addq	$0x200, %rcx
+        addq	$0x200, %r8
+        subq	$0x01, %r13
+        jg	L_pointwise_acc_mont_start_encap_bp
+L_pointwise_acc_mont_end_encap_bp:
+        # Base mul mont add
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r15
+        vmovdqu	(%rcx), %ymm2
+        vmovdqu	32(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%r8), %ymm4
+        vmovdqu	32(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r15), %ymm10
+        vmovdqu	32(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	(%rsi), %ymm6
+        vmovdqu	32(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	64(%rcx), %ymm2
+        vmovdqu	96(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%r8), %ymm4
+        vmovdqu	96(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r15), %ymm10
+        vmovdqu	96(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	64(%rsi), %ymm6
+        vmovdqu	96(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%rsi)
+        vmovdqu	%ymm1, 96(%rsi)
+        vmovdqu	128(%rcx), %ymm2
+        vmovdqu	160(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%r8), %ymm4
+        vmovdqu	160(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r15), %ymm10
+        vmovdqu	160(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	128(%rsi), %ymm6
+        vmovdqu	160(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	192(%rcx), %ymm2
+        vmovdqu	224(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%r8), %ymm4
+        vmovdqu	224(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r15), %ymm10
+        vmovdqu	224(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	192(%rsi), %ymm6
+        vmovdqu	224(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%rsi)
+        vmovdqu	%ymm1, 224(%rsi)
+        vmovdqu	256(%rcx), %ymm2
+        vmovdqu	288(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%r8), %ymm4
+        vmovdqu	288(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r15), %ymm10
+        vmovdqu	288(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	256(%rsi), %ymm6
+        vmovdqu	288(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	320(%rcx), %ymm2
+        vmovdqu	352(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%r8), %ymm4
+        vmovdqu	352(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r15), %ymm10
+        vmovdqu	352(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	320(%rsi), %ymm6
+        vmovdqu	352(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%rsi)
+        vmovdqu	%ymm1, 352(%rsi)
+        vmovdqu	384(%rcx), %ymm2
+        vmovdqu	416(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%r8), %ymm4
+        vmovdqu	416(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r15), %ymm10
+        vmovdqu	416(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	384(%rsi), %ymm6
+        vmovdqu	416(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%rsi)
+        vmovdqu	%ymm1, 416(%rsi)
+        vmovdqu	448(%rcx), %ymm2
+        vmovdqu	480(%rcx), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%r8), %ymm4
+        vmovdqu	480(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r15), %ymm10
+        vmovdqu	480(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	448(%rsi), %ymm6
+        vmovdqu	480(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%rsi)
+        vmovdqu	%ymm1, 480(%rsi)
+        addq	$0x200, %rcx
+        addq	$0x200, %r8
+        movq	%r11, %r13
+        shl	$9, %r13d
+        subq	%r13, %r8
+        # invntt
+        leaq	L_kyber_avx2_zetas_inv(%rip), %r15
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vmovdqu	64(%rsi), %ymm2
+        vmovdqu	96(%rsi), %ymm3
+        vmovdqu	128(%rsi), %ymm4
+        vmovdqu	160(%rsi), %ymm5
+        vmovdqu	192(%rsi), %ymm6
+        vmovdqu	224(%rsi), %ymm7
+        # 2: 1/2
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm9
+        vmovdqu	32(%r15), %ymm12
+        vpsllq	$32, %ymm9, %ymm0
+        vpsrlq	$32, %ymm8, %ymm1
+        vpblendd	$0xaa, %ymm0, %ymm8, %ymm0
+        vpblendd	$0x55, %ymm1, %ymm9, %ymm1
+        vperm2i128	$32, %ymm3, %ymm2, %ymm8
+        vmovdqu	64(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm9
+        vmovdqu	96(%r15), %ymm13
+        vpsllq	$32, %ymm9, %ymm2
+        vpsrlq	$32, %ymm8, %ymm3
+        vpblendd	$0xaa, %ymm2, %ymm8, %ymm2
+        vpblendd	$0x55, %ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 4: 1/2
+        vmovdqu	128(%r15), %ymm10
+        vmovdqu	160(%r15), %ymm12
+        vmovdqu	192(%r15), %ymm11
+        vmovdqu	224(%r15), %ymm13
+        vpunpckldq	%ymm1, %ymm8, %ymm0
+        vpunpckhdq	%ymm1, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm9, %ymm2
+        vpunpckhdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm2
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm8
+        vpsubw	%ymm2, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 8: 1/2
+        vmovdqu	256(%r15), %ymm10
+        vmovdqu	288(%r15), %ymm12
+        vmovdqu	320(%r15), %ymm11
+        vmovdqu	352(%r15), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 16: 1/2
+        vperm2i128	$32, %ymm1, %ymm8, %ymm0
+        vmovdqu	384(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm8, %ymm1
+        vmovdqu	416(%r15), %ymm12
+        vperm2i128	$32, %ymm3, %ymm9, %ymm2
+        vmovdqu	448(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm9, %ymm3
+        vmovdqu	480(%r15), %ymm13
+        vpsubw	%ymm1, %ymm0, %ymm8
+        vpsubw	%ymm3, %ymm2, %ymm9
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm2, %ymm2
+        vpmullw	%ymm12, %ymm8, %ymm1
+        vpmullw	%ymm13, %ymm9, %ymm3
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm1, %ymm8, %ymm1
+        vpsubw	%ymm3, %ymm9, %ymm3
+        # 32: 1/2
+        vmovdqu	512(%r15), %ymm10
+        vmovdqu	544(%r15), %ymm12
+        vpaddw	%ymm2, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm1, %ymm9
+        vpsubw	%ymm2, %ymm0, %ymm2
+        vpsubw	%ymm3, %ymm1, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm8, %ymm0
+        vpsubw	%ymm1, %ymm9, %ymm1
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        # 2: 1/2
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	576(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm9
+        vmovdqu	608(%r15), %ymm12
+        vpsllq	$32, %ymm9, %ymm4
+        vpsrlq	$32, %ymm8, %ymm5
+        vpblendd	$0xaa, %ymm4, %ymm8, %ymm4
+        vpblendd	$0x55, %ymm5, %ymm9, %ymm5
+        vperm2i128	$32, %ymm7, %ymm6, %ymm8
+        vmovdqu	640(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm9
+        vmovdqu	672(%r15), %ymm13
+        vpsllq	$32, %ymm9, %ymm6
+        vpsrlq	$32, %ymm8, %ymm7
+        vpblendd	$0xaa, %ymm6, %ymm8, %ymm6
+        vpblendd	$0x55, %ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 4: 1/2
+        vmovdqu	704(%r15), %ymm10
+        vmovdqu	736(%r15), %ymm12
+        vmovdqu	768(%r15), %ymm11
+        vmovdqu	800(%r15), %ymm13
+        vpunpckldq	%ymm5, %ymm8, %ymm4
+        vpunpckhdq	%ymm5, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm9, %ymm6
+        vpunpckhdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm6
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm6, %ymm6
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm8
+        vpsubw	%ymm6, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 8: 1/2
+        vmovdqu	832(%r15), %ymm10
+        vmovdqu	864(%r15), %ymm12
+        vmovdqu	896(%r15), %ymm11
+        vmovdqu	928(%r15), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 16: 1/2
+        vperm2i128	$32, %ymm5, %ymm8, %ymm4
+        vmovdqu	960(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm8, %ymm5
+        vmovdqu	992(%r15), %ymm12
+        vperm2i128	$32, %ymm7, %ymm9, %ymm6
+        vmovdqu	1024(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm9, %ymm7
+        vmovdqu	1056(%r15), %ymm13
+        vpsubw	%ymm5, %ymm4, %ymm8
+        vpsubw	%ymm7, %ymm6, %ymm9
+        vpaddw	%ymm5, %ymm4, %ymm4
+        vpaddw	%ymm7, %ymm6, %ymm6
+        vpmullw	%ymm12, %ymm8, %ymm5
+        vpmullw	%ymm13, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm5, %ymm8, %ymm5
+        vpsubw	%ymm7, %ymm9, %ymm7
+        # 32: 1/2
+        vmovdqu	1088(%r15), %ymm10
+        vmovdqu	1120(%r15), %ymm12
+        vpaddw	%ymm6, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm5, %ymm9
+        vpsubw	%ymm6, %ymm4, %ymm6
+        vpsubw	%ymm7, %ymm5, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm5
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm5, %ymm5
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        # 64: 1/2
+        vmovdqu	1152(%r15), %ymm10
+        vmovdqu	1184(%r15), %ymm12
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	%ymm2, 64(%rsi)
+        vmovdqu	%ymm3, 96(%rsi)
+        vmovdqu	%ymm4, 128(%rsi)
+        vmovdqu	%ymm5, 160(%rsi)
+        vmovdqu	%ymm6, 192(%rsi)
+        vmovdqu	%ymm7, 224(%rsi)
+        vmovdqu	256(%rsi), %ymm0
+        vmovdqu	288(%rsi), %ymm1
+        vmovdqu	320(%rsi), %ymm2
+        vmovdqu	352(%rsi), %ymm3
+        vmovdqu	384(%rsi), %ymm4
+        vmovdqu	416(%rsi), %ymm5
+        vmovdqu	448(%rsi), %ymm6
+        vmovdqu	480(%rsi), %ymm7
+        # 2: 2/2
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	1216(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm9
+        vmovdqu	1248(%r15), %ymm12
+        vpsllq	$32, %ymm9, %ymm0
+        vpsrlq	$32, %ymm8, %ymm1
+        vpblendd	$0xaa, %ymm0, %ymm8, %ymm0
+        vpblendd	$0x55, %ymm1, %ymm9, %ymm1
+        vperm2i128	$32, %ymm3, %ymm2, %ymm8
+        vmovdqu	1280(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm9
+        vmovdqu	1312(%r15), %ymm13
+        vpsllq	$32, %ymm9, %ymm2
+        vpsrlq	$32, %ymm8, %ymm3
+        vpblendd	$0xaa, %ymm2, %ymm8, %ymm2
+        vpblendd	$0x55, %ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 4: 2/2
+        vmovdqu	1344(%r15), %ymm10
+        vmovdqu	1376(%r15), %ymm12
+        vmovdqu	1408(%r15), %ymm11
+        vmovdqu	1440(%r15), %ymm13
+        vpunpckldq	%ymm1, %ymm8, %ymm0
+        vpunpckhdq	%ymm1, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm9, %ymm2
+        vpunpckhdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm2
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm8
+        vpsubw	%ymm2, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 8: 2/2
+        vmovdqu	1472(%r15), %ymm10
+        vmovdqu	1504(%r15), %ymm12
+        vmovdqu	1536(%r15), %ymm11
+        vmovdqu	1568(%r15), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 16: 2/2
+        vperm2i128	$32, %ymm1, %ymm8, %ymm0
+        vmovdqu	1600(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm8, %ymm1
+        vmovdqu	1632(%r15), %ymm12
+        vperm2i128	$32, %ymm3, %ymm9, %ymm2
+        vmovdqu	1664(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm9, %ymm3
+        vmovdqu	1696(%r15), %ymm13
+        vpsubw	%ymm1, %ymm0, %ymm8
+        vpsubw	%ymm3, %ymm2, %ymm9
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm2, %ymm2
+        vpmullw	%ymm12, %ymm8, %ymm1
+        vpmullw	%ymm13, %ymm9, %ymm3
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm1, %ymm8, %ymm1
+        vpsubw	%ymm3, %ymm9, %ymm3
+        # 32: 2/2
+        vmovdqu	1728(%r15), %ymm10
+        vmovdqu	1760(%r15), %ymm12
+        vpaddw	%ymm2, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm1, %ymm9
+        vpsubw	%ymm2, %ymm0, %ymm2
+        vpsubw	%ymm3, %ymm1, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm8, %ymm0
+        vpsubw	%ymm1, %ymm9, %ymm1
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        # 2: 2/2
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	1792(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm9
+        vmovdqu	1824(%r15), %ymm12
+        vpsllq	$32, %ymm9, %ymm4
+        vpsrlq	$32, %ymm8, %ymm5
+        vpblendd	$0xaa, %ymm4, %ymm8, %ymm4
+        vpblendd	$0x55, %ymm5, %ymm9, %ymm5
+        vperm2i128	$32, %ymm7, %ymm6, %ymm8
+        vmovdqu	1856(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm9
+        vmovdqu	1888(%r15), %ymm13
+        vpsllq	$32, %ymm9, %ymm6
+        vpsrlq	$32, %ymm8, %ymm7
+        vpblendd	$0xaa, %ymm6, %ymm8, %ymm6
+        vpblendd	$0x55, %ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 4: 2/2
+        vmovdqu	1920(%r15), %ymm10
+        vmovdqu	1952(%r15), %ymm12
+        vmovdqu	1984(%r15), %ymm11
+        vmovdqu	2016(%r15), %ymm13
+        vpunpckldq	%ymm5, %ymm8, %ymm4
+        vpunpckhdq	%ymm5, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm9, %ymm6
+        vpunpckhdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm6
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm6, %ymm6
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm8
+        vpsubw	%ymm6, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 8: 2/2
+        vmovdqu	2048(%r15), %ymm10
+        vmovdqu	2080(%r15), %ymm12
+        vmovdqu	2112(%r15), %ymm11
+        vmovdqu	2144(%r15), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 16: 2/2
+        vperm2i128	$32, %ymm5, %ymm8, %ymm4
+        vmovdqu	2176(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm8, %ymm5
+        vmovdqu	2208(%r15), %ymm12
+        vperm2i128	$32, %ymm7, %ymm9, %ymm6
+        vmovdqu	2240(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm9, %ymm7
+        vmovdqu	2272(%r15), %ymm13
+        vpsubw	%ymm5, %ymm4, %ymm8
+        vpsubw	%ymm7, %ymm6, %ymm9
+        vpaddw	%ymm5, %ymm4, %ymm4
+        vpaddw	%ymm7, %ymm6, %ymm6
+        vpmullw	%ymm12, %ymm8, %ymm5
+        vpmullw	%ymm13, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm5, %ymm8, %ymm5
+        vpsubw	%ymm7, %ymm9, %ymm7
+        # 32: 2/2
+        vmovdqu	2304(%r15), %ymm10
+        vmovdqu	2336(%r15), %ymm12
+        vpaddw	%ymm6, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm5, %ymm9
+        vpsubw	%ymm6, %ymm4, %ymm6
+        vpsubw	%ymm7, %ymm5, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm5
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm5, %ymm5
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        # 64: 2/2
+        vmovdqu	2368(%r15), %ymm10
+        vmovdqu	2400(%r15), %ymm12
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	%ymm2, 320(%rsi)
+        vmovdqu	%ymm3, 352(%rsi)
+        # 128
+        vmovdqu	2432(%r15), %ymm10
+        vmovdqu	2464(%r15), %ymm12
+        vmovdqu	2496(%r15), %ymm11
+        vmovdqu	2528(%r15), %ymm13
+        vmovdqu	128(%rsi), %ymm0
+        vmovdqu	160(%rsi), %ymm1
+        vmovdqu	192(%rsi), %ymm2
+        vmovdqu	224(%rsi), %ymm3
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm11, %ymm0, %ymm0
+        vpmulhw	%ymm11, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm0
+        vpsubw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm11, %ymm2, %ymm2
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        vpmullw	%ymm13, %ymm4, %ymm8
+        vpmullw	%ymm13, %ymm5, %ymm9
+        vpmulhw	%ymm11, %ymm4, %ymm4
+        vpmulhw	%ymm11, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm4
+        vpsubw	%ymm9, %ymm5, %ymm5
+        vpmullw	%ymm13, %ymm6, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm11, %ymm6, %ymm6
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	%ymm2, 192(%rsi)
+        vmovdqu	%ymm3, 224(%rsi)
+        vmovdqu	%ymm4, 384(%rsi)
+        vmovdqu	%ymm5, 416(%rsi)
+        vmovdqu	%ymm6, 448(%rsi)
+        vmovdqu	%ymm7, 480(%rsi)
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vmovdqu	64(%rsi), %ymm2
+        vmovdqu	96(%rsi), %ymm3
+        vmovdqu	256(%rsi), %ymm4
+        vmovdqu	288(%rsi), %ymm5
+        vmovdqu	320(%rsi), %ymm6
+        vmovdqu	352(%rsi), %ymm7
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm11, %ymm0, %ymm0
+        vpmulhw	%ymm11, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm0
+        vpsubw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm11, %ymm2, %ymm2
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        vpmullw	%ymm13, %ymm4, %ymm8
+        vpmullw	%ymm13, %ymm5, %ymm9
+        vpmulhw	%ymm11, %ymm4, %ymm4
+        vpmulhw	%ymm11, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm4
+        vpsubw	%ymm9, %ymm5, %ymm5
+        vpmullw	%ymm13, %ymm6, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm11, %ymm6, %ymm6
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	%ymm2, 64(%rsi)
+        vmovdqu	%ymm3, 96(%rsi)
+        vmovdqu	%ymm4, 256(%rsi)
+        vmovdqu	%ymm5, 288(%rsi)
+        vmovdqu	%ymm6, 320(%rsi)
+        vmovdqu	%ymm7, 352(%rsi)
+        # Add Errors
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vmovdqu	64(%rsi), %ymm2
+        vmovdqu	96(%rsi), %ymm3
+        vmovdqu	(%r9), %ymm4
+        vmovdqu	32(%r9), %ymm5
+        vmovdqu	64(%r9), %ymm6
+        vmovdqu	96(%r9), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	%ymm2, 64(%rsi)
+        vmovdqu	%ymm3, 96(%rsi)
+        vmovdqu	128(%rsi), %ymm0
+        vmovdqu	160(%rsi), %ymm1
+        vmovdqu	192(%rsi), %ymm2
+        vmovdqu	224(%rsi), %ymm3
+        vmovdqu	128(%r9), %ymm4
+        vmovdqu	160(%r9), %ymm5
+        vmovdqu	192(%r9), %ymm6
+        vmovdqu	224(%r9), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	%ymm2, 192(%rsi)
+        vmovdqu	%ymm3, 224(%rsi)
+        vmovdqu	256(%rsi), %ymm0
+        vmovdqu	288(%rsi), %ymm1
+        vmovdqu	320(%rsi), %ymm2
+        vmovdqu	352(%rsi), %ymm3
+        vmovdqu	256(%r9), %ymm4
+        vmovdqu	288(%r9), %ymm5
+        vmovdqu	320(%r9), %ymm6
+        vmovdqu	352(%r9), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	%ymm2, 320(%rsi)
+        vmovdqu	%ymm3, 352(%rsi)
+        vmovdqu	384(%rsi), %ymm0
+        vmovdqu	416(%rsi), %ymm1
+        vmovdqu	448(%rsi), %ymm2
+        vmovdqu	480(%rsi), %ymm3
+        vmovdqu	384(%r9), %ymm4
+        vmovdqu	416(%r9), %ymm5
+        vmovdqu	448(%r9), %ymm6
+        vmovdqu	480(%r9), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 384(%rsi)
+        vmovdqu	%ymm1, 416(%rsi)
+        vmovdqu	%ymm2, 448(%rsi)
+        vmovdqu	%ymm3, 480(%rsi)
+        addq	$0x200, %r9
+        addq	$0x200, %rsi
+        subq	$0x01, %r12
+        jg	L_kyber_encapsulate_avx2_calc
+        vmovdqu	kyber_qinv(%rip), %ymm12
+        # Pointwise acc mont
+        movq	%r11, %r13
+        # Base mul mont
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r15
+        vmovdqu	(%rdi), %ymm2
+        vmovdqu	32(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%r8), %ymm4
+        vmovdqu	32(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r15), %ymm10
+        vmovdqu	32(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%rdx)
+        vmovdqu	%ymm1, 32(%rdx)
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%r8), %ymm4
+        vmovdqu	96(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r15), %ymm10
+        vmovdqu	96(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%rdx)
+        vmovdqu	%ymm1, 96(%rdx)
+        vmovdqu	128(%rdi), %ymm2
+        vmovdqu	160(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%r8), %ymm4
+        vmovdqu	160(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r15), %ymm10
+        vmovdqu	160(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%rdx)
+        vmovdqu	%ymm1, 160(%rdx)
+        vmovdqu	192(%rdi), %ymm2
+        vmovdqu	224(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%r8), %ymm4
+        vmovdqu	224(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r15), %ymm10
+        vmovdqu	224(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%rdx)
+        vmovdqu	%ymm1, 224(%rdx)
+        vmovdqu	256(%rdi), %ymm2
+        vmovdqu	288(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%r8), %ymm4
+        vmovdqu	288(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r15), %ymm10
+        vmovdqu	288(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%rdx)
+        vmovdqu	%ymm1, 288(%rdx)
+        vmovdqu	320(%rdi), %ymm2
+        vmovdqu	352(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%r8), %ymm4
+        vmovdqu	352(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r15), %ymm10
+        vmovdqu	352(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%rdx)
+        vmovdqu	%ymm1, 352(%rdx)
+        vmovdqu	384(%rdi), %ymm2
+        vmovdqu	416(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%r8), %ymm4
+        vmovdqu	416(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r15), %ymm10
+        vmovdqu	416(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%rdx)
+        vmovdqu	%ymm1, 416(%rdx)
+        vmovdqu	448(%rdi), %ymm2
+        vmovdqu	480(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%r8), %ymm4
+        vmovdqu	480(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r15), %ymm10
+        vmovdqu	480(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%rdx)
+        vmovdqu	%ymm1, 480(%rdx)
+        addq	$0x200, %rdi
+        addq	$0x200, %r8
+        subq	$2, %r13
+        jz	L_pointwise_acc_mont_end_encap_v
+L_pointwise_acc_mont_start_encap_v:
+        # Base mul mont add
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r15
+        vmovdqu	(%rdi), %ymm2
+        vmovdqu	32(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%r8), %ymm4
+        vmovdqu	32(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r15), %ymm10
+        vmovdqu	32(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	(%rdx), %ymm6
+        vmovdqu	32(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%rdx)
+        vmovdqu	%ymm1, 32(%rdx)
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%r8), %ymm4
+        vmovdqu	96(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r15), %ymm10
+        vmovdqu	96(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	64(%rdx), %ymm6
+        vmovdqu	96(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%rdx)
+        vmovdqu	%ymm1, 96(%rdx)
+        vmovdqu	128(%rdi), %ymm2
+        vmovdqu	160(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%r8), %ymm4
+        vmovdqu	160(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r15), %ymm10
+        vmovdqu	160(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	128(%rdx), %ymm6
+        vmovdqu	160(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%rdx)
+        vmovdqu	%ymm1, 160(%rdx)
+        vmovdqu	192(%rdi), %ymm2
+        vmovdqu	224(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%r8), %ymm4
+        vmovdqu	224(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r15), %ymm10
+        vmovdqu	224(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	192(%rdx), %ymm6
+        vmovdqu	224(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%rdx)
+        vmovdqu	%ymm1, 224(%rdx)
+        vmovdqu	256(%rdi), %ymm2
+        vmovdqu	288(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%r8), %ymm4
+        vmovdqu	288(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r15), %ymm10
+        vmovdqu	288(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	256(%rdx), %ymm6
+        vmovdqu	288(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%rdx)
+        vmovdqu	%ymm1, 288(%rdx)
+        vmovdqu	320(%rdi), %ymm2
+        vmovdqu	352(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%r8), %ymm4
+        vmovdqu	352(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r15), %ymm10
+        vmovdqu	352(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	320(%rdx), %ymm6
+        vmovdqu	352(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%rdx)
+        vmovdqu	%ymm1, 352(%rdx)
+        vmovdqu	384(%rdi), %ymm2
+        vmovdqu	416(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%r8), %ymm4
+        vmovdqu	416(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r15), %ymm10
+        vmovdqu	416(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	384(%rdx), %ymm6
+        vmovdqu	416(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%rdx)
+        vmovdqu	%ymm1, 416(%rdx)
+        vmovdqu	448(%rdi), %ymm2
+        vmovdqu	480(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%r8), %ymm4
+        vmovdqu	480(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r15), %ymm10
+        vmovdqu	480(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	448(%rdx), %ymm6
+        vmovdqu	480(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%rdx)
+        vmovdqu	%ymm1, 480(%rdx)
+        addq	$0x200, %rdi
+        addq	$0x200, %r8
+        subq	$0x01, %r13
+        jg	L_pointwise_acc_mont_start_encap_v
+L_pointwise_acc_mont_end_encap_v:
+        # Base mul mont add
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r15
+        vmovdqu	(%rdi), %ymm2
+        vmovdqu	32(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%r8), %ymm4
+        vmovdqu	32(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r15), %ymm10
+        vmovdqu	32(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	(%rdx), %ymm6
+        vmovdqu	32(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%rdx)
+        vmovdqu	%ymm1, 32(%rdx)
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%r8), %ymm4
+        vmovdqu	96(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r15), %ymm10
+        vmovdqu	96(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	64(%rdx), %ymm6
+        vmovdqu	96(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%rdx)
+        vmovdqu	%ymm1, 96(%rdx)
+        vmovdqu	128(%rdi), %ymm2
+        vmovdqu	160(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%r8), %ymm4
+        vmovdqu	160(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r15), %ymm10
+        vmovdqu	160(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	128(%rdx), %ymm6
+        vmovdqu	160(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%rdx)
+        vmovdqu	%ymm1, 160(%rdx)
+        vmovdqu	192(%rdi), %ymm2
+        vmovdqu	224(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%r8), %ymm4
+        vmovdqu	224(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r15), %ymm10
+        vmovdqu	224(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	192(%rdx), %ymm6
+        vmovdqu	224(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%rdx)
+        vmovdqu	%ymm1, 224(%rdx)
+        vmovdqu	256(%rdi), %ymm2
+        vmovdqu	288(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%r8), %ymm4
+        vmovdqu	288(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r15), %ymm10
+        vmovdqu	288(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	256(%rdx), %ymm6
+        vmovdqu	288(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%rdx)
+        vmovdqu	%ymm1, 288(%rdx)
+        vmovdqu	320(%rdi), %ymm2
+        vmovdqu	352(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%r8), %ymm4
+        vmovdqu	352(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r15), %ymm10
+        vmovdqu	352(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	320(%rdx), %ymm6
+        vmovdqu	352(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%rdx)
+        vmovdqu	%ymm1, 352(%rdx)
+        vmovdqu	384(%rdi), %ymm2
+        vmovdqu	416(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%r8), %ymm4
+        vmovdqu	416(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r15), %ymm10
+        vmovdqu	416(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	384(%rdx), %ymm6
+        vmovdqu	416(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%rdx)
+        vmovdqu	%ymm1, 416(%rdx)
+        vmovdqu	448(%rdi), %ymm2
+        vmovdqu	480(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%r8), %ymm4
+        vmovdqu	480(%r8), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r15), %ymm10
+        vmovdqu	480(%r15), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	448(%rdx), %ymm6
+        vmovdqu	480(%rdx), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%rdx)
+        vmovdqu	%ymm1, 480(%rdx)
+        addq	$0x200, %rdi
+        addq	$0x200, %r8
+        movq	%r11, %r13
+        shl	$9, %r13d
+        subq	%r13, %r8
+        # invntt
+        leaq	L_kyber_avx2_zetas_inv(%rip), %r15
+        vmovdqu	(%rdx), %ymm0
+        vmovdqu	32(%rdx), %ymm1
+        vmovdqu	64(%rdx), %ymm2
+        vmovdqu	96(%rdx), %ymm3
+        vmovdqu	128(%rdx), %ymm4
+        vmovdqu	160(%rdx), %ymm5
+        vmovdqu	192(%rdx), %ymm6
+        vmovdqu	224(%rdx), %ymm7
+        # 2: 1/2
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm9
+        vmovdqu	32(%r15), %ymm12
+        vpsllq	$32, %ymm9, %ymm0
+        vpsrlq	$32, %ymm8, %ymm1
+        vpblendd	$0xaa, %ymm0, %ymm8, %ymm0
+        vpblendd	$0x55, %ymm1, %ymm9, %ymm1
+        vperm2i128	$32, %ymm3, %ymm2, %ymm8
+        vmovdqu	64(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm9
+        vmovdqu	96(%r15), %ymm13
+        vpsllq	$32, %ymm9, %ymm2
+        vpsrlq	$32, %ymm8, %ymm3
+        vpblendd	$0xaa, %ymm2, %ymm8, %ymm2
+        vpblendd	$0x55, %ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 4: 1/2
+        vmovdqu	128(%r15), %ymm10
+        vmovdqu	160(%r15), %ymm12
+        vmovdqu	192(%r15), %ymm11
+        vmovdqu	224(%r15), %ymm13
+        vpunpckldq	%ymm1, %ymm8, %ymm0
+        vpunpckhdq	%ymm1, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm9, %ymm2
+        vpunpckhdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm2
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm8
+        vpsubw	%ymm2, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 8: 1/2
+        vmovdqu	256(%r15), %ymm10
+        vmovdqu	288(%r15), %ymm12
+        vmovdqu	320(%r15), %ymm11
+        vmovdqu	352(%r15), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 16: 1/2
+        vperm2i128	$32, %ymm1, %ymm8, %ymm0
+        vmovdqu	384(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm8, %ymm1
+        vmovdqu	416(%r15), %ymm12
+        vperm2i128	$32, %ymm3, %ymm9, %ymm2
+        vmovdqu	448(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm9, %ymm3
+        vmovdqu	480(%r15), %ymm13
+        vpsubw	%ymm1, %ymm0, %ymm8
+        vpsubw	%ymm3, %ymm2, %ymm9
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm2, %ymm2
+        vpmullw	%ymm12, %ymm8, %ymm1
+        vpmullw	%ymm13, %ymm9, %ymm3
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm1, %ymm8, %ymm1
+        vpsubw	%ymm3, %ymm9, %ymm3
+        # 32: 1/2
+        vmovdqu	512(%r15), %ymm10
+        vmovdqu	544(%r15), %ymm12
+        vpaddw	%ymm2, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm1, %ymm9
+        vpsubw	%ymm2, %ymm0, %ymm2
+        vpsubw	%ymm3, %ymm1, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm8, %ymm0
+        vpsubw	%ymm1, %ymm9, %ymm1
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        # 2: 1/2
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	576(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm9
+        vmovdqu	608(%r15), %ymm12
+        vpsllq	$32, %ymm9, %ymm4
+        vpsrlq	$32, %ymm8, %ymm5
+        vpblendd	$0xaa, %ymm4, %ymm8, %ymm4
+        vpblendd	$0x55, %ymm5, %ymm9, %ymm5
+        vperm2i128	$32, %ymm7, %ymm6, %ymm8
+        vmovdqu	640(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm9
+        vmovdqu	672(%r15), %ymm13
+        vpsllq	$32, %ymm9, %ymm6
+        vpsrlq	$32, %ymm8, %ymm7
+        vpblendd	$0xaa, %ymm6, %ymm8, %ymm6
+        vpblendd	$0x55, %ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 4: 1/2
+        vmovdqu	704(%r15), %ymm10
+        vmovdqu	736(%r15), %ymm12
+        vmovdqu	768(%r15), %ymm11
+        vmovdqu	800(%r15), %ymm13
+        vpunpckldq	%ymm5, %ymm8, %ymm4
+        vpunpckhdq	%ymm5, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm9, %ymm6
+        vpunpckhdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm6
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm6, %ymm6
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm8
+        vpsubw	%ymm6, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 8: 1/2
+        vmovdqu	832(%r15), %ymm10
+        vmovdqu	864(%r15), %ymm12
+        vmovdqu	896(%r15), %ymm11
+        vmovdqu	928(%r15), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 16: 1/2
+        vperm2i128	$32, %ymm5, %ymm8, %ymm4
+        vmovdqu	960(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm8, %ymm5
+        vmovdqu	992(%r15), %ymm12
+        vperm2i128	$32, %ymm7, %ymm9, %ymm6
+        vmovdqu	1024(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm9, %ymm7
+        vmovdqu	1056(%r15), %ymm13
+        vpsubw	%ymm5, %ymm4, %ymm8
+        vpsubw	%ymm7, %ymm6, %ymm9
+        vpaddw	%ymm5, %ymm4, %ymm4
+        vpaddw	%ymm7, %ymm6, %ymm6
+        vpmullw	%ymm12, %ymm8, %ymm5
+        vpmullw	%ymm13, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm5, %ymm8, %ymm5
+        vpsubw	%ymm7, %ymm9, %ymm7
+        # 32: 1/2
+        vmovdqu	1088(%r15), %ymm10
+        vmovdqu	1120(%r15), %ymm12
+        vpaddw	%ymm6, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm5, %ymm9
+        vpsubw	%ymm6, %ymm4, %ymm6
+        vpsubw	%ymm7, %ymm5, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm5
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm5, %ymm5
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        # 64: 1/2
+        vmovdqu	1152(%r15), %ymm10
+        vmovdqu	1184(%r15), %ymm12
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vmovdqu	%ymm0, (%rdx)
+        vmovdqu	%ymm1, 32(%rdx)
+        vmovdqu	%ymm2, 64(%rdx)
+        vmovdqu	%ymm3, 96(%rdx)
+        vmovdqu	%ymm4, 128(%rdx)
+        vmovdqu	%ymm5, 160(%rdx)
+        vmovdqu	%ymm6, 192(%rdx)
+        vmovdqu	%ymm7, 224(%rdx)
+        vmovdqu	256(%rdx), %ymm0
+        vmovdqu	288(%rdx), %ymm1
+        vmovdqu	320(%rdx), %ymm2
+        vmovdqu	352(%rdx), %ymm3
+        vmovdqu	384(%rdx), %ymm4
+        vmovdqu	416(%rdx), %ymm5
+        vmovdqu	448(%rdx), %ymm6
+        vmovdqu	480(%rdx), %ymm7
+        # 2: 2/2
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	1216(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm9
+        vmovdqu	1248(%r15), %ymm12
+        vpsllq	$32, %ymm9, %ymm0
+        vpsrlq	$32, %ymm8, %ymm1
+        vpblendd	$0xaa, %ymm0, %ymm8, %ymm0
+        vpblendd	$0x55, %ymm1, %ymm9, %ymm1
+        vperm2i128	$32, %ymm3, %ymm2, %ymm8
+        vmovdqu	1280(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm9
+        vmovdqu	1312(%r15), %ymm13
+        vpsllq	$32, %ymm9, %ymm2
+        vpsrlq	$32, %ymm8, %ymm3
+        vpblendd	$0xaa, %ymm2, %ymm8, %ymm2
+        vpblendd	$0x55, %ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 4: 2/2
+        vmovdqu	1344(%r15), %ymm10
+        vmovdqu	1376(%r15), %ymm12
+        vmovdqu	1408(%r15), %ymm11
+        vmovdqu	1440(%r15), %ymm13
+        vpunpckldq	%ymm1, %ymm8, %ymm0
+        vpunpckhdq	%ymm1, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm9, %ymm2
+        vpunpckhdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm2
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm8
+        vpsubw	%ymm2, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 8: 2/2
+        vmovdqu	1472(%r15), %ymm10
+        vmovdqu	1504(%r15), %ymm12
+        vmovdqu	1536(%r15), %ymm11
+        vmovdqu	1568(%r15), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 16: 2/2
+        vperm2i128	$32, %ymm1, %ymm8, %ymm0
+        vmovdqu	1600(%r15), %ymm10
+        vperm2i128	$49, %ymm1, %ymm8, %ymm1
+        vmovdqu	1632(%r15), %ymm12
+        vperm2i128	$32, %ymm3, %ymm9, %ymm2
+        vmovdqu	1664(%r15), %ymm11
+        vperm2i128	$49, %ymm3, %ymm9, %ymm3
+        vmovdqu	1696(%r15), %ymm13
+        vpsubw	%ymm1, %ymm0, %ymm8
+        vpsubw	%ymm3, %ymm2, %ymm9
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm2, %ymm2
+        vpmullw	%ymm12, %ymm8, %ymm1
+        vpmullw	%ymm13, %ymm9, %ymm3
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm1, %ymm8, %ymm1
+        vpsubw	%ymm3, %ymm9, %ymm3
+        # 32: 2/2
+        vmovdqu	1728(%r15), %ymm10
+        vmovdqu	1760(%r15), %ymm12
+        vpaddw	%ymm2, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm1, %ymm9
+        vpsubw	%ymm2, %ymm0, %ymm2
+        vpsubw	%ymm3, %ymm1, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm8, %ymm0
+        vpsubw	%ymm1, %ymm9, %ymm1
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        # 2: 2/2
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	1792(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm9
+        vmovdqu	1824(%r15), %ymm12
+        vpsllq	$32, %ymm9, %ymm4
+        vpsrlq	$32, %ymm8, %ymm5
+        vpblendd	$0xaa, %ymm4, %ymm8, %ymm4
+        vpblendd	$0x55, %ymm5, %ymm9, %ymm5
+        vperm2i128	$32, %ymm7, %ymm6, %ymm8
+        vmovdqu	1856(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm9
+        vmovdqu	1888(%r15), %ymm13
+        vpsllq	$32, %ymm9, %ymm6
+        vpsrlq	$32, %ymm8, %ymm7
+        vpblendd	$0xaa, %ymm6, %ymm8, %ymm6
+        vpblendd	$0x55, %ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 4: 2/2
+        vmovdqu	1920(%r15), %ymm10
+        vmovdqu	1952(%r15), %ymm12
+        vmovdqu	1984(%r15), %ymm11
+        vmovdqu	2016(%r15), %ymm13
+        vpunpckldq	%ymm5, %ymm8, %ymm4
+        vpunpckhdq	%ymm5, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm9, %ymm6
+        vpunpckhdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm6
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm6, %ymm6
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm8
+        vpsubw	%ymm6, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 8: 2/2
+        vmovdqu	2048(%r15), %ymm10
+        vmovdqu	2080(%r15), %ymm12
+        vmovdqu	2112(%r15), %ymm11
+        vmovdqu	2144(%r15), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 16: 2/2
+        vperm2i128	$32, %ymm5, %ymm8, %ymm4
+        vmovdqu	2176(%r15), %ymm10
+        vperm2i128	$49, %ymm5, %ymm8, %ymm5
+        vmovdqu	2208(%r15), %ymm12
+        vperm2i128	$32, %ymm7, %ymm9, %ymm6
+        vmovdqu	2240(%r15), %ymm11
+        vperm2i128	$49, %ymm7, %ymm9, %ymm7
+        vmovdqu	2272(%r15), %ymm13
+        vpsubw	%ymm5, %ymm4, %ymm8
+        vpsubw	%ymm7, %ymm6, %ymm9
+        vpaddw	%ymm5, %ymm4, %ymm4
+        vpaddw	%ymm7, %ymm6, %ymm6
+        vpmullw	%ymm12, %ymm8, %ymm5
+        vpmullw	%ymm13, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm5, %ymm8, %ymm5
+        vpsubw	%ymm7, %ymm9, %ymm7
+        # 32: 2/2
+        vmovdqu	2304(%r15), %ymm10
+        vmovdqu	2336(%r15), %ymm12
+        vpaddw	%ymm6, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm5, %ymm9
+        vpsubw	%ymm6, %ymm4, %ymm6
+        vpsubw	%ymm7, %ymm5, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm5
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm5, %ymm5
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        # 64: 2/2
+        vmovdqu	2368(%r15), %ymm10
+        vmovdqu	2400(%r15), %ymm12
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vmovdqu	%ymm0, 256(%rdx)
+        vmovdqu	%ymm1, 288(%rdx)
+        vmovdqu	%ymm2, 320(%rdx)
+        vmovdqu	%ymm3, 352(%rdx)
+        # 128
+        vmovdqu	2432(%r15), %ymm10
+        vmovdqu	2464(%r15), %ymm12
+        vmovdqu	2496(%r15), %ymm11
+        vmovdqu	2528(%r15), %ymm13
+        vmovdqu	128(%rdx), %ymm0
+        vmovdqu	160(%rdx), %ymm1
+        vmovdqu	192(%rdx), %ymm2
+        vmovdqu	224(%rdx), %ymm3
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm11, %ymm0, %ymm0
+        vpmulhw	%ymm11, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm0
+        vpsubw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm11, %ymm2, %ymm2
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        vpmullw	%ymm13, %ymm4, %ymm8
+        vpmullw	%ymm13, %ymm5, %ymm9
+        vpmulhw	%ymm11, %ymm4, %ymm4
+        vpmulhw	%ymm11, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm4
+        vpsubw	%ymm9, %ymm5, %ymm5
+        vpmullw	%ymm13, %ymm6, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm11, %ymm6, %ymm6
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        vmovdqu	%ymm0, 128(%rdx)
+        vmovdqu	%ymm1, 160(%rdx)
+        vmovdqu	%ymm2, 192(%rdx)
+        vmovdqu	%ymm3, 224(%rdx)
+        vmovdqu	%ymm4, 384(%rdx)
+        vmovdqu	%ymm5, 416(%rdx)
+        vmovdqu	%ymm6, 448(%rdx)
+        vmovdqu	%ymm7, 480(%rdx)
+        vmovdqu	(%rdx), %ymm0
+        vmovdqu	32(%rdx), %ymm1
+        vmovdqu	64(%rdx), %ymm2
+        vmovdqu	96(%rdx), %ymm3
+        vmovdqu	256(%rdx), %ymm4
+        vmovdqu	288(%rdx), %ymm5
+        vmovdqu	320(%rdx), %ymm6
+        vmovdqu	352(%rdx), %ymm7
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm11, %ymm0, %ymm0
+        vpmulhw	%ymm11, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm0
+        vpsubw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm11, %ymm2, %ymm2
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        vpmullw	%ymm13, %ymm4, %ymm8
+        vpmullw	%ymm13, %ymm5, %ymm9
+        vpmulhw	%ymm11, %ymm4, %ymm4
+        vpmulhw	%ymm11, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm4
+        vpsubw	%ymm9, %ymm5, %ymm5
+        vpmullw	%ymm13, %ymm6, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm11, %ymm6, %ymm6
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        vmovdqu	%ymm0, (%rdx)
+        vmovdqu	%ymm1, 32(%rdx)
+        vmovdqu	%ymm2, 64(%rdx)
+        vmovdqu	%ymm3, 96(%rdx)
+        vmovdqu	%ymm4, 256(%rdx)
+        vmovdqu	%ymm5, 288(%rdx)
+        vmovdqu	%ymm6, 320(%rdx)
+        vmovdqu	%ymm7, 352(%rdx)
+        # Add Errors
+        vmovdqu	(%rdx), %ymm0
+        vmovdqu	32(%rdx), %ymm1
+        vmovdqu	64(%rdx), %ymm2
+        vmovdqu	96(%rdx), %ymm3
+        vmovdqu	(%rax), %ymm4
+        vmovdqu	32(%rax), %ymm5
+        vmovdqu	64(%rax), %ymm6
+        vmovdqu	96(%rax), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vmovdqu	%ymm0, (%rdx)
+        vmovdqu	%ymm1, 32(%rdx)
+        vmovdqu	%ymm2, 64(%rdx)
+        vmovdqu	%ymm3, 96(%rdx)
+        vmovdqu	128(%rdx), %ymm0
+        vmovdqu	160(%rdx), %ymm1
+        vmovdqu	192(%rdx), %ymm2
+        vmovdqu	224(%rdx), %ymm3
+        vmovdqu	128(%rax), %ymm4
+        vmovdqu	160(%rax), %ymm5
+        vmovdqu	192(%rax), %ymm6
+        vmovdqu	224(%rax), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vmovdqu	%ymm0, 128(%rdx)
+        vmovdqu	%ymm1, 160(%rdx)
+        vmovdqu	%ymm2, 192(%rdx)
+        vmovdqu	%ymm3, 224(%rdx)
+        vmovdqu	256(%rdx), %ymm0
+        vmovdqu	288(%rdx), %ymm1
+        vmovdqu	320(%rdx), %ymm2
+        vmovdqu	352(%rdx), %ymm3
+        vmovdqu	256(%rax), %ymm4
+        vmovdqu	288(%rax), %ymm5
+        vmovdqu	320(%rax), %ymm6
+        vmovdqu	352(%rax), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vmovdqu	%ymm0, 256(%rdx)
+        vmovdqu	%ymm1, 288(%rdx)
+        vmovdqu	%ymm2, 320(%rdx)
+        vmovdqu	%ymm3, 352(%rdx)
+        vmovdqu	384(%rdx), %ymm0
+        vmovdqu	416(%rdx), %ymm1
+        vmovdqu	448(%rdx), %ymm2
+        vmovdqu	480(%rdx), %ymm3
+        vmovdqu	384(%rax), %ymm4
+        vmovdqu	416(%rax), %ymm5
+        vmovdqu	448(%rax), %ymm6
+        vmovdqu	480(%rax), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vmovdqu	%ymm0, 384(%rdx)
+        vmovdqu	%ymm1, 416(%rdx)
+        vmovdqu	%ymm2, 448(%rdx)
+        vmovdqu	%ymm3, 480(%rdx)
+        # Add Errors
+        vmovdqu	(%rdx), %ymm0
+        vmovdqu	32(%rdx), %ymm1
+        vmovdqu	64(%rdx), %ymm2
+        vmovdqu	96(%rdx), %ymm3
+        vmovdqu	(%r10), %ymm4
+        vmovdqu	32(%r10), %ymm5
+        vmovdqu	64(%r10), %ymm6
+        vmovdqu	96(%r10), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, (%rdx)
+        vmovdqu	%ymm1, 32(%rdx)
+        vmovdqu	%ymm2, 64(%rdx)
+        vmovdqu	%ymm3, 96(%rdx)
+        vmovdqu	128(%rdx), %ymm0
+        vmovdqu	160(%rdx), %ymm1
+        vmovdqu	192(%rdx), %ymm2
+        vmovdqu	224(%rdx), %ymm3
+        vmovdqu	128(%r10), %ymm4
+        vmovdqu	160(%r10), %ymm5
+        vmovdqu	192(%r10), %ymm6
+        vmovdqu	224(%r10), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 128(%rdx)
+        vmovdqu	%ymm1, 160(%rdx)
+        vmovdqu	%ymm2, 192(%rdx)
+        vmovdqu	%ymm3, 224(%rdx)
+        vmovdqu	256(%rdx), %ymm0
+        vmovdqu	288(%rdx), %ymm1
+        vmovdqu	320(%rdx), %ymm2
+        vmovdqu	352(%rdx), %ymm3
+        vmovdqu	256(%r10), %ymm4
+        vmovdqu	288(%r10), %ymm5
+        vmovdqu	320(%r10), %ymm6
+        vmovdqu	352(%r10), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 256(%rdx)
+        vmovdqu	%ymm1, 288(%rdx)
+        vmovdqu	%ymm2, 320(%rdx)
+        vmovdqu	%ymm3, 352(%rdx)
+        vmovdqu	384(%rdx), %ymm0
+        vmovdqu	416(%rdx), %ymm1
+        vmovdqu	448(%rdx), %ymm2
+        vmovdqu	480(%rdx), %ymm3
+        vmovdqu	384(%r10), %ymm4
+        vmovdqu	416(%r10), %ymm5
+        vmovdqu	448(%r10), %ymm6
+        vmovdqu	480(%r10), %ymm7
+        vpaddw	%ymm4, %ymm0, %ymm4
+        vpaddw	%ymm5, %ymm1, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpaddw	%ymm6, %ymm2, %ymm6
+        vpaddw	%ymm7, %ymm3, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 384(%rdx)
+        vmovdqu	%ymm1, 416(%rdx)
+        vmovdqu	%ymm2, 448(%rdx)
+        vmovdqu	%ymm3, 480(%rdx)
+        vzeroupper
+        addq	$48, %rsp
+        popq	%r15
+        popq	%r14
+        popq	%r13
+        popq	%r12
+        repz retq
+#ifndef __APPLE__
+.size	kyber_encapsulate_avx2,.-kyber_encapsulate_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.text
+.globl	kyber_decapsulate_avx2
+.type	kyber_decapsulate_avx2,@function
+.align	16
+kyber_decapsulate_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_decapsulate_avx2
+.p2align	4
+_kyber_decapsulate_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	kyber_q(%rip), %ymm14
+        vmovdqu	kyber_v(%rip), %ymm15
+        movq	%r8, %rax
+        movq	%rdx, %r9
+L_kyber_decapsulate_avx2_trans:
+        # ntt
+        leaq	L_kyber_avx2_zetas(%rip), %r10
+        vmovdqu	(%r10), %ymm10
+        vmovdqu	32(%r10), %ymm12
+        vmovdqu	128(%r9), %ymm0
+        vmovdqu	160(%r9), %ymm1
+        vmovdqu	192(%r9), %ymm2
+        vmovdqu	224(%r9), %ymm3
+        vmovdqu	384(%r9), %ymm4
+        vmovdqu	416(%r9), %ymm5
+        vmovdqu	448(%r9), %ymm6
+        vmovdqu	480(%r9), %ymm7
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vmovdqu	%ymm0, 128(%r9)
+        vmovdqu	%ymm1, 160(%r9)
+        vmovdqu	%ymm2, 192(%r9)
+        vmovdqu	%ymm3, 224(%r9)
+        vmovdqu	%ymm4, 384(%r9)
+        vmovdqu	%ymm5, 416(%r9)
+        vmovdqu	%ymm6, 448(%r9)
+        vmovdqu	%ymm7, 480(%r9)
+        vmovdqu	(%r9), %ymm0
+        vmovdqu	32(%r9), %ymm1
+        vmovdqu	64(%r9), %ymm2
+        vmovdqu	96(%r9), %ymm3
+        vmovdqu	256(%r9), %ymm4
+        vmovdqu	288(%r9), %ymm5
+        vmovdqu	320(%r9), %ymm6
+        vmovdqu	352(%r9), %ymm7
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vmovdqu	%ymm4, 256(%r9)
+        vmovdqu	%ymm5, 288(%r9)
+        vmovdqu	%ymm6, 320(%r9)
+        vmovdqu	%ymm7, 352(%r9)
+        vmovdqu	128(%r9), %ymm4
+        vmovdqu	160(%r9), %ymm5
+        vmovdqu	192(%r9), %ymm6
+        vmovdqu	224(%r9), %ymm7
+        # 64: 0/3
+        vmovdqu	64(%r10), %ymm10
+        vmovdqu	96(%r10), %ymm12
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        # 32: 0/3
+        vmovdqu	128(%r10), %ymm10
+        vmovdqu	160(%r10), %ymm12
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm2
+        vpsubw	%ymm9, %ymm1, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        # 32: 0/3
+        vmovdqu	192(%r10), %ymm10
+        vmovdqu	224(%r10), %ymm12
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm6
+        vpsubw	%ymm9, %ymm5, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        # 16: 0/3
+        vmovdqu	256(%r10), %ymm10
+        vmovdqu	288(%r10), %ymm12
+        vmovdqu	320(%r10), %ymm11
+        vmovdqu	352(%r10), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 16: 0/3
+        vmovdqu	384(%r10), %ymm10
+        vmovdqu	416(%r10), %ymm12
+        vmovdqu	448(%r10), %ymm11
+        vmovdqu	480(%r10), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 8: 0/3
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	512(%r10), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm1
+        vmovdqu	544(%r10), %ymm12
+        vperm2i128	$32, %ymm3, %ymm2, %ymm9
+        vmovdqu	576(%r10), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm3
+        vmovdqu	608(%r10), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm0
+        vpsubw	%ymm2, %ymm3, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm1
+        vpsubw	%ymm2, %ymm9, %ymm3
+        vpaddw	%ymm0, %ymm8, %ymm8
+        vpaddw	%ymm2, %ymm9, %ymm9
+        # 4: 0/3
+        vmovdqu	640(%r10), %ymm10
+        vmovdqu	672(%r10), %ymm12
+        vmovdqu	704(%r10), %ymm11
+        vmovdqu	736(%r10), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 8: 0/3
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	768(%r10), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm5
+        vmovdqu	800(%r10), %ymm12
+        vperm2i128	$32, %ymm7, %ymm6, %ymm9
+        vmovdqu	832(%r10), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm7
+        vmovdqu	864(%r10), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm4
+        vpsubw	%ymm6, %ymm7, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm5
+        vpsubw	%ymm6, %ymm9, %ymm7
+        vpaddw	%ymm4, %ymm8, %ymm8
+        vpaddw	%ymm6, %ymm9, %ymm9
+        # 4: 0/3
+        vmovdqu	896(%r10), %ymm10
+        vmovdqu	928(%r10), %ymm12
+        vmovdqu	960(%r10), %ymm11
+        vmovdqu	992(%r10), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 2: 0/3
+        vmovdqu	1024(%r10), %ymm10
+        vmovdqu	1056(%r10), %ymm12
+        vmovdqu	1088(%r10), %ymm11
+        vmovdqu	1120(%r10), %ymm13
+        vpsllq	$32, %ymm1, %ymm8
+        vpsrlq	$32, %ymm0, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm0, %ymm0
+        vpblendd	$0x55, %ymm9, %ymm1, %ymm1
+        vpsllq	$32, %ymm3, %ymm8
+        vpsrlq	$32, %ymm2, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm2, %ymm2
+        vpblendd	$0x55, %ymm9, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 2: 0/3
+        vmovdqu	1152(%r10), %ymm10
+        vmovdqu	1184(%r10), %ymm12
+        vmovdqu	1216(%r10), %ymm11
+        vmovdqu	1248(%r10), %ymm13
+        vpsllq	$32, %ymm5, %ymm8
+        vpsrlq	$32, %ymm4, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm4, %ymm4
+        vpblendd	$0x55, %ymm9, %ymm5, %ymm5
+        vpsllq	$32, %ymm7, %ymm8
+        vpsrlq	$32, %ymm6, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm6, %ymm6
+        vpblendd	$0x55, %ymm9, %ymm7, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        vpunpckldq	%ymm1, %ymm0, %ymm8
+        vpunpckhdq	%ymm1, %ymm0, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm0
+        vperm2i128	$49, %ymm9, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm2, %ymm8
+        vpunpckhdq	%ymm3, %ymm2, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm2
+        vperm2i128	$49, %ymm9, %ymm8, %ymm3
+        vpunpckldq	%ymm5, %ymm4, %ymm8
+        vpunpckhdq	%ymm5, %ymm4, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm4
+        vperm2i128	$49, %ymm9, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm6, %ymm8
+        vpunpckhdq	%ymm7, %ymm6, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm6
+        vperm2i128	$49, %ymm9, %ymm8, %ymm7
+        vpmulhw	%ymm15, %ymm0, %ymm8
+        vpmulhw	%ymm15, %ymm1, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm8
+        vpsubw	%ymm9, %ymm1, %ymm9
+        vmovdqu	%ymm8, (%r9)
+        vmovdqu	%ymm9, 32(%r9)
+        vpmulhw	%ymm15, %ymm2, %ymm8
+        vpmulhw	%ymm15, %ymm3, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vmovdqu	%ymm8, 64(%r9)
+        vmovdqu	%ymm9, 96(%r9)
+        vpmulhw	%ymm15, %ymm4, %ymm8
+        vpmulhw	%ymm15, %ymm5, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vmovdqu	%ymm8, 128(%r9)
+        vmovdqu	%ymm9, 160(%r9)
+        vpmulhw	%ymm15, %ymm6, %ymm8
+        vpmulhw	%ymm15, %ymm7, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vmovdqu	%ymm8, 192(%r9)
+        vmovdqu	%ymm9, 224(%r9)
+        vmovdqu	256(%r9), %ymm0
+        vmovdqu	288(%r9), %ymm1
+        vmovdqu	320(%r9), %ymm2
+        vmovdqu	352(%r9), %ymm3
+        vmovdqu	384(%r9), %ymm4
+        vmovdqu	416(%r9), %ymm5
+        vmovdqu	448(%r9), %ymm6
+        vmovdqu	480(%r9), %ymm7
+        # 64: 1/3
+        vmovdqu	1280(%r10), %ymm10
+        vmovdqu	1312(%r10), %ymm12
+        vpmullw	%ymm12, %ymm4, %ymm8
+        vpmullw	%ymm12, %ymm5, %ymm9
+        vpmulhw	%ymm10, %ymm4, %ymm4
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm4
+        vpsubw	%ymm9, %ymm1, %ymm5
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm6
+        vpsubw	%ymm9, %ymm3, %ymm7
+        vpaddw	%ymm8, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        # 32: 1/3
+        vmovdqu	1344(%r10), %ymm10
+        vmovdqu	1376(%r10), %ymm12
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm2
+        vpsubw	%ymm9, %ymm1, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        # 32: 1/3
+        vmovdqu	1408(%r10), %ymm10
+        vmovdqu	1440(%r10), %ymm12
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm6
+        vpsubw	%ymm9, %ymm5, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        # 16: 1/3
+        vmovdqu	1472(%r10), %ymm10
+        vmovdqu	1504(%r10), %ymm12
+        vmovdqu	1536(%r10), %ymm11
+        vmovdqu	1568(%r10), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 16: 1/3
+        vmovdqu	1600(%r10), %ymm10
+        vmovdqu	1632(%r10), %ymm12
+        vmovdqu	1664(%r10), %ymm11
+        vmovdqu	1696(%r10), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 8: 1/3
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	1728(%r10), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm1
+        vmovdqu	1760(%r10), %ymm12
+        vperm2i128	$32, %ymm3, %ymm2, %ymm9
+        vmovdqu	1792(%r10), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm3
+        vmovdqu	1824(%r10), %ymm13
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm0
+        vpsubw	%ymm2, %ymm3, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm1
+        vpsubw	%ymm2, %ymm9, %ymm3
+        vpaddw	%ymm0, %ymm8, %ymm8
+        vpaddw	%ymm2, %ymm9, %ymm9
+        # 4: 1/3
+        vmovdqu	1856(%r10), %ymm10
+        vmovdqu	1888(%r10), %ymm12
+        vmovdqu	1920(%r10), %ymm11
+        vmovdqu	1952(%r10), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 8: 1/3
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	1984(%r10), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm5
+        vmovdqu	2016(%r10), %ymm12
+        vperm2i128	$32, %ymm7, %ymm6, %ymm9
+        vmovdqu	2048(%r10), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm7
+        vmovdqu	2080(%r10), %ymm13
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm4
+        vpsubw	%ymm6, %ymm7, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm5
+        vpsubw	%ymm6, %ymm9, %ymm7
+        vpaddw	%ymm4, %ymm8, %ymm8
+        vpaddw	%ymm6, %ymm9, %ymm9
+        # 4: 1/3
+        vmovdqu	2112(%r10), %ymm10
+        vmovdqu	2144(%r10), %ymm12
+        vmovdqu	2176(%r10), %ymm11
+        vmovdqu	2208(%r10), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        # 2: 1/3
+        vmovdqu	2240(%r10), %ymm10
+        vmovdqu	2272(%r10), %ymm12
+        vmovdqu	2304(%r10), %ymm11
+        vmovdqu	2336(%r10), %ymm13
+        vpsllq	$32, %ymm1, %ymm8
+        vpsrlq	$32, %ymm0, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm0, %ymm0
+        vpblendd	$0x55, %ymm9, %ymm1, %ymm1
+        vpsllq	$32, %ymm3, %ymm8
+        vpsrlq	$32, %ymm2, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm2, %ymm2
+        vpblendd	$0x55, %ymm9, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm1, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm1
+        vpsubw	%ymm9, %ymm2, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm2, %ymm2
+        # 2: 1/3
+        vmovdqu	2368(%r10), %ymm10
+        vmovdqu	2400(%r10), %ymm12
+        vmovdqu	2432(%r10), %ymm11
+        vmovdqu	2464(%r10), %ymm13
+        vpsllq	$32, %ymm5, %ymm8
+        vpsrlq	$32, %ymm4, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm4, %ymm4
+        vpblendd	$0x55, %ymm9, %ymm5, %ymm5
+        vpsllq	$32, %ymm7, %ymm8
+        vpsrlq	$32, %ymm6, %ymm9
+        vpblendd	$0xaa, %ymm8, %ymm6, %ymm6
+        vpblendd	$0x55, %ymm9, %ymm7, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm5, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm5
+        vpsubw	%ymm9, %ymm6, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm6, %ymm6
+        vpunpckldq	%ymm1, %ymm0, %ymm8
+        vpunpckhdq	%ymm1, %ymm0, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm0
+        vperm2i128	$49, %ymm9, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm2, %ymm8
+        vpunpckhdq	%ymm3, %ymm2, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm2
+        vperm2i128	$49, %ymm9, %ymm8, %ymm3
+        vpunpckldq	%ymm5, %ymm4, %ymm8
+        vpunpckhdq	%ymm5, %ymm4, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm4
+        vperm2i128	$49, %ymm9, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm6, %ymm8
+        vpunpckhdq	%ymm7, %ymm6, %ymm9
+        vperm2i128	$32, %ymm9, %ymm8, %ymm6
+        vperm2i128	$49, %ymm9, %ymm8, %ymm7
+        vpmulhw	%ymm15, %ymm0, %ymm8
+        vpmulhw	%ymm15, %ymm1, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm8
+        vpsubw	%ymm9, %ymm1, %ymm9
+        vmovdqu	%ymm8, 256(%r9)
+        vmovdqu	%ymm9, 288(%r9)
+        vpmulhw	%ymm15, %ymm2, %ymm8
+        vpmulhw	%ymm15, %ymm3, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm8
+        vpsubw	%ymm9, %ymm3, %ymm9
+        vmovdqu	%ymm8, 320(%r9)
+        vmovdqu	%ymm9, 352(%r9)
+        vpmulhw	%ymm15, %ymm4, %ymm8
+        vpmulhw	%ymm15, %ymm5, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm8
+        vpsubw	%ymm9, %ymm5, %ymm9
+        vmovdqu	%ymm8, 384(%r9)
+        vmovdqu	%ymm9, 416(%r9)
+        vpmulhw	%ymm15, %ymm6, %ymm8
+        vpmulhw	%ymm15, %ymm7, %ymm9
+        vpsraw	$10, %ymm8, %ymm8
+        vpsraw	$10, %ymm9, %ymm9
+        vpmullw	%ymm14, %ymm8, %ymm8
+        vpmullw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm8
+        vpsubw	%ymm9, %ymm7, %ymm9
+        vmovdqu	%ymm8, 448(%r9)
+        vmovdqu	%ymm9, 480(%r9)
+        addq	$0x200, %r9
+        subq	$0x01, %rax
+        jg	L_kyber_decapsulate_avx2_trans
+        vmovdqu	kyber_qinv(%rip), %ymm12
+        # Pointwise acc mont
+        movq	%r8, %rax
+        # Base mul mont
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r10
+        vmovdqu	(%rdi), %ymm2
+        vmovdqu	32(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%rdx), %ymm4
+        vmovdqu	32(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r10), %ymm10
+        vmovdqu	32(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%rdx), %ymm4
+        vmovdqu	96(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r10), %ymm10
+        vmovdqu	96(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%rsi)
+        vmovdqu	%ymm1, 96(%rsi)
+        vmovdqu	128(%rdi), %ymm2
+        vmovdqu	160(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%rdx), %ymm4
+        vmovdqu	160(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r10), %ymm10
+        vmovdqu	160(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	192(%rdi), %ymm2
+        vmovdqu	224(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%rdx), %ymm4
+        vmovdqu	224(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r10), %ymm10
+        vmovdqu	224(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%rsi)
+        vmovdqu	%ymm1, 224(%rsi)
+        vmovdqu	256(%rdi), %ymm2
+        vmovdqu	288(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%rdx), %ymm4
+        vmovdqu	288(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r10), %ymm10
+        vmovdqu	288(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	320(%rdi), %ymm2
+        vmovdqu	352(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%rdx), %ymm4
+        vmovdqu	352(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r10), %ymm10
+        vmovdqu	352(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%rsi)
+        vmovdqu	%ymm1, 352(%rsi)
+        vmovdqu	384(%rdi), %ymm2
+        vmovdqu	416(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%rdx), %ymm4
+        vmovdqu	416(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r10), %ymm10
+        vmovdqu	416(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%rsi)
+        vmovdqu	%ymm1, 416(%rsi)
+        vmovdqu	448(%rdi), %ymm2
+        vmovdqu	480(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%rdx), %ymm4
+        vmovdqu	480(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r10), %ymm10
+        vmovdqu	480(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%rsi)
+        vmovdqu	%ymm1, 480(%rsi)
+        addq	$0x200, %rdi
+        addq	$0x200, %rdx
+        subq	$2, %rax
+        jz	L_pointwise_acc_mont_end_decap
+L_pointwise_acc_mont_start_decap:
+        # Base mul mont add
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r10
+        vmovdqu	(%rdi), %ymm2
+        vmovdqu	32(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%rdx), %ymm4
+        vmovdqu	32(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r10), %ymm10
+        vmovdqu	32(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	(%rsi), %ymm6
+        vmovdqu	32(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%rdx), %ymm4
+        vmovdqu	96(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r10), %ymm10
+        vmovdqu	96(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	64(%rsi), %ymm6
+        vmovdqu	96(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%rsi)
+        vmovdqu	%ymm1, 96(%rsi)
+        vmovdqu	128(%rdi), %ymm2
+        vmovdqu	160(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%rdx), %ymm4
+        vmovdqu	160(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r10), %ymm10
+        vmovdqu	160(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	128(%rsi), %ymm6
+        vmovdqu	160(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	192(%rdi), %ymm2
+        vmovdqu	224(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%rdx), %ymm4
+        vmovdqu	224(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r10), %ymm10
+        vmovdqu	224(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	192(%rsi), %ymm6
+        vmovdqu	224(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%rsi)
+        vmovdqu	%ymm1, 224(%rsi)
+        vmovdqu	256(%rdi), %ymm2
+        vmovdqu	288(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%rdx), %ymm4
+        vmovdqu	288(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r10), %ymm10
+        vmovdqu	288(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	256(%rsi), %ymm6
+        vmovdqu	288(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	320(%rdi), %ymm2
+        vmovdqu	352(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%rdx), %ymm4
+        vmovdqu	352(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r10), %ymm10
+        vmovdqu	352(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	320(%rsi), %ymm6
+        vmovdqu	352(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%rsi)
+        vmovdqu	%ymm1, 352(%rsi)
+        vmovdqu	384(%rdi), %ymm2
+        vmovdqu	416(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%rdx), %ymm4
+        vmovdqu	416(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r10), %ymm10
+        vmovdqu	416(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	384(%rsi), %ymm6
+        vmovdqu	416(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%rsi)
+        vmovdqu	%ymm1, 416(%rsi)
+        vmovdqu	448(%rdi), %ymm2
+        vmovdqu	480(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%rdx), %ymm4
+        vmovdqu	480(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r10), %ymm10
+        vmovdqu	480(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	448(%rsi), %ymm6
+        vmovdqu	480(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%rsi)
+        vmovdqu	%ymm1, 480(%rsi)
+        addq	$0x200, %rdi
+        addq	$0x200, %rdx
+        subq	$0x01, %rax
+        jg	L_pointwise_acc_mont_start_decap
+L_pointwise_acc_mont_end_decap:
+        # Base mul mont add
+        leaq	L_kyber_avx2_zetas_basemul(%rip), %r10
+        vmovdqu	(%rdi), %ymm2
+        vmovdqu	32(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	(%rdx), %ymm4
+        vmovdqu	32(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	(%r10), %ymm10
+        vmovdqu	32(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	(%rsi), %ymm6
+        vmovdqu	32(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	64(%rdx), %ymm4
+        vmovdqu	96(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	64(%r10), %ymm10
+        vmovdqu	96(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	64(%rsi), %ymm6
+        vmovdqu	96(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 64(%rsi)
+        vmovdqu	%ymm1, 96(%rsi)
+        vmovdqu	128(%rdi), %ymm2
+        vmovdqu	160(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	128(%rdx), %ymm4
+        vmovdqu	160(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	128(%r10), %ymm10
+        vmovdqu	160(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	128(%rsi), %ymm6
+        vmovdqu	160(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	192(%rdi), %ymm2
+        vmovdqu	224(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	192(%rdx), %ymm4
+        vmovdqu	224(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	192(%r10), %ymm10
+        vmovdqu	224(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	192(%rsi), %ymm6
+        vmovdqu	224(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 192(%rsi)
+        vmovdqu	%ymm1, 224(%rsi)
+        vmovdqu	256(%rdi), %ymm2
+        vmovdqu	288(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	256(%rdx), %ymm4
+        vmovdqu	288(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	256(%r10), %ymm10
+        vmovdqu	288(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	256(%rsi), %ymm6
+        vmovdqu	288(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	320(%rdi), %ymm2
+        vmovdqu	352(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	320(%rdx), %ymm4
+        vmovdqu	352(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	320(%r10), %ymm10
+        vmovdqu	352(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	320(%rsi), %ymm6
+        vmovdqu	352(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 320(%rsi)
+        vmovdqu	%ymm1, 352(%rsi)
+        vmovdqu	384(%rdi), %ymm2
+        vmovdqu	416(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	384(%rdx), %ymm4
+        vmovdqu	416(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	384(%r10), %ymm10
+        vmovdqu	416(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	384(%rsi), %ymm6
+        vmovdqu	416(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 384(%rsi)
+        vmovdqu	%ymm1, 416(%rsi)
+        vmovdqu	448(%rdi), %ymm2
+        vmovdqu	480(%rdi), %ymm3
+        vpslld	$16, %ymm3, %ymm6
+        vpsrld	$16, %ymm2, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm2, %ymm2
+        vpblendw	$0x55, %ymm7, %ymm3, %ymm3
+        vmovdqu	448(%rdx), %ymm4
+        vmovdqu	480(%rdx), %ymm5
+        vpslld	$16, %ymm5, %ymm6
+        vpsrld	$16, %ymm4, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm4, %ymm4
+        vpblendw	$0x55, %ymm7, %ymm5, %ymm5
+        vmovdqu	448(%r10), %ymm10
+        vmovdqu	480(%r10), %ymm11
+        vpmullw	%ymm5, %ymm3, %ymm0
+        vpmulhw	%ymm5, %ymm3, %ymm6
+        vpmullw	%ymm4, %ymm2, %ymm1
+        vpmulhw	%ymm4, %ymm2, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm0, %ymm8
+        vpmullw	%ymm12, %ymm1, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm0
+        vpsubw	%ymm9, %ymm7, %ymm1
+        vpmullw	%ymm11, %ymm0, %ymm6
+        vpmulhw	%ymm10, %ymm0, %ymm7
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm6, %ymm7, %ymm0
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm2, %ymm1
+        vpmulhw	%ymm5, %ymm2, %ymm6
+        vpmullw	%ymm4, %ymm3, %ymm2
+        vpmulhw	%ymm4, %ymm3, %ymm7
+        # Mont Reduce
+        vpmullw	%ymm12, %ymm1, %ymm8
+        vpmullw	%ymm12, %ymm2, %ymm9
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm1
+        vpsubw	%ymm9, %ymm7, %ymm2
+        vpaddw	%ymm2, %ymm1, %ymm1
+        vmovdqu	448(%rsi), %ymm6
+        vmovdqu	480(%rsi), %ymm7
+        vpaddw	%ymm6, %ymm0, %ymm0
+        vpaddw	%ymm7, %ymm1, %ymm1
+        vpslld	$16, %ymm1, %ymm6
+        vpsrld	$16, %ymm0, %ymm7
+        vpblendw	$0xaa, %ymm6, %ymm0, %ymm0
+        vpblendw	$0x55, %ymm7, %ymm1, %ymm1
+        vmovdqu	%ymm0, 448(%rsi)
+        vmovdqu	%ymm1, 480(%rsi)
+        addq	$0x200, %rdi
+        addq	$0x200, %rdx
+        movq	%r8, %rax
+        shl	$9, %eax
+        subq	%rax, %rdx
+        # invntt
+        leaq	L_kyber_avx2_zetas_inv(%rip), %r10
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vmovdqu	64(%rsi), %ymm2
+        vmovdqu	96(%rsi), %ymm3
+        vmovdqu	128(%rsi), %ymm4
+        vmovdqu	160(%rsi), %ymm5
+        vmovdqu	192(%rsi), %ymm6
+        vmovdqu	224(%rsi), %ymm7
+        # 2: 1/2
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	(%r10), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm9
+        vmovdqu	32(%r10), %ymm12
+        vpsllq	$32, %ymm9, %ymm0
+        vpsrlq	$32, %ymm8, %ymm1
+        vpblendd	$0xaa, %ymm0, %ymm8, %ymm0
+        vpblendd	$0x55, %ymm1, %ymm9, %ymm1
+        vperm2i128	$32, %ymm3, %ymm2, %ymm8
+        vmovdqu	64(%r10), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm9
+        vmovdqu	96(%r10), %ymm13
+        vpsllq	$32, %ymm9, %ymm2
+        vpsrlq	$32, %ymm8, %ymm3
+        vpblendd	$0xaa, %ymm2, %ymm8, %ymm2
+        vpblendd	$0x55, %ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 4: 1/2
+        vmovdqu	128(%r10), %ymm10
+        vmovdqu	160(%r10), %ymm12
+        vmovdqu	192(%r10), %ymm11
+        vmovdqu	224(%r10), %ymm13
+        vpunpckldq	%ymm1, %ymm8, %ymm0
+        vpunpckhdq	%ymm1, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm9, %ymm2
+        vpunpckhdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm2
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm8
+        vpsubw	%ymm2, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 8: 1/2
+        vmovdqu	256(%r10), %ymm10
+        vmovdqu	288(%r10), %ymm12
+        vmovdqu	320(%r10), %ymm11
+        vmovdqu	352(%r10), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 16: 1/2
+        vperm2i128	$32, %ymm1, %ymm8, %ymm0
+        vmovdqu	384(%r10), %ymm10
+        vperm2i128	$49, %ymm1, %ymm8, %ymm1
+        vmovdqu	416(%r10), %ymm12
+        vperm2i128	$32, %ymm3, %ymm9, %ymm2
+        vmovdqu	448(%r10), %ymm11
+        vperm2i128	$49, %ymm3, %ymm9, %ymm3
+        vmovdqu	480(%r10), %ymm13
+        vpsubw	%ymm1, %ymm0, %ymm8
+        vpsubw	%ymm3, %ymm2, %ymm9
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm2, %ymm2
+        vpmullw	%ymm12, %ymm8, %ymm1
+        vpmullw	%ymm13, %ymm9, %ymm3
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm1, %ymm8, %ymm1
+        vpsubw	%ymm3, %ymm9, %ymm3
+        # 32: 1/2
+        vmovdqu	512(%r10), %ymm10
+        vmovdqu	544(%r10), %ymm12
+        vpaddw	%ymm2, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm1, %ymm9
+        vpsubw	%ymm2, %ymm0, %ymm2
+        vpsubw	%ymm3, %ymm1, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm8, %ymm0
+        vpsubw	%ymm1, %ymm9, %ymm1
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        # 2: 1/2
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	576(%r10), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm9
+        vmovdqu	608(%r10), %ymm12
+        vpsllq	$32, %ymm9, %ymm4
+        vpsrlq	$32, %ymm8, %ymm5
+        vpblendd	$0xaa, %ymm4, %ymm8, %ymm4
+        vpblendd	$0x55, %ymm5, %ymm9, %ymm5
+        vperm2i128	$32, %ymm7, %ymm6, %ymm8
+        vmovdqu	640(%r10), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm9
+        vmovdqu	672(%r10), %ymm13
+        vpsllq	$32, %ymm9, %ymm6
+        vpsrlq	$32, %ymm8, %ymm7
+        vpblendd	$0xaa, %ymm6, %ymm8, %ymm6
+        vpblendd	$0x55, %ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 4: 1/2
+        vmovdqu	704(%r10), %ymm10
+        vmovdqu	736(%r10), %ymm12
+        vmovdqu	768(%r10), %ymm11
+        vmovdqu	800(%r10), %ymm13
+        vpunpckldq	%ymm5, %ymm8, %ymm4
+        vpunpckhdq	%ymm5, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm9, %ymm6
+        vpunpckhdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm6
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm6, %ymm6
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm8
+        vpsubw	%ymm6, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 8: 1/2
+        vmovdqu	832(%r10), %ymm10
+        vmovdqu	864(%r10), %ymm12
+        vmovdqu	896(%r10), %ymm11
+        vmovdqu	928(%r10), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 16: 1/2
+        vperm2i128	$32, %ymm5, %ymm8, %ymm4
+        vmovdqu	960(%r10), %ymm10
+        vperm2i128	$49, %ymm5, %ymm8, %ymm5
+        vmovdqu	992(%r10), %ymm12
+        vperm2i128	$32, %ymm7, %ymm9, %ymm6
+        vmovdqu	1024(%r10), %ymm11
+        vperm2i128	$49, %ymm7, %ymm9, %ymm7
+        vmovdqu	1056(%r10), %ymm13
+        vpsubw	%ymm5, %ymm4, %ymm8
+        vpsubw	%ymm7, %ymm6, %ymm9
+        vpaddw	%ymm5, %ymm4, %ymm4
+        vpaddw	%ymm7, %ymm6, %ymm6
+        vpmullw	%ymm12, %ymm8, %ymm5
+        vpmullw	%ymm13, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm5, %ymm8, %ymm5
+        vpsubw	%ymm7, %ymm9, %ymm7
+        # 32: 1/2
+        vmovdqu	1088(%r10), %ymm10
+        vmovdqu	1120(%r10), %ymm12
+        vpaddw	%ymm6, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm5, %ymm9
+        vpsubw	%ymm6, %ymm4, %ymm6
+        vpsubw	%ymm7, %ymm5, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm5
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm5, %ymm5
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        # 64: 1/2
+        vmovdqu	1152(%r10), %ymm10
+        vmovdqu	1184(%r10), %ymm12
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	%ymm2, 64(%rsi)
+        vmovdqu	%ymm3, 96(%rsi)
+        vmovdqu	%ymm4, 128(%rsi)
+        vmovdqu	%ymm5, 160(%rsi)
+        vmovdqu	%ymm6, 192(%rsi)
+        vmovdqu	%ymm7, 224(%rsi)
+        vmovdqu	256(%rsi), %ymm0
+        vmovdqu	288(%rsi), %ymm1
+        vmovdqu	320(%rsi), %ymm2
+        vmovdqu	352(%rsi), %ymm3
+        vmovdqu	384(%rsi), %ymm4
+        vmovdqu	416(%rsi), %ymm5
+        vmovdqu	448(%rsi), %ymm6
+        vmovdqu	480(%rsi), %ymm7
+        # 2: 2/2
+        vperm2i128	$32, %ymm1, %ymm0, %ymm8
+        vmovdqu	1216(%r10), %ymm10
+        vperm2i128	$49, %ymm1, %ymm0, %ymm9
+        vmovdqu	1248(%r10), %ymm12
+        vpsllq	$32, %ymm9, %ymm0
+        vpsrlq	$32, %ymm8, %ymm1
+        vpblendd	$0xaa, %ymm0, %ymm8, %ymm0
+        vpblendd	$0x55, %ymm1, %ymm9, %ymm1
+        vperm2i128	$32, %ymm3, %ymm2, %ymm8
+        vmovdqu	1280(%r10), %ymm11
+        vperm2i128	$49, %ymm3, %ymm2, %ymm9
+        vmovdqu	1312(%r10), %ymm13
+        vpsllq	$32, %ymm9, %ymm2
+        vpsrlq	$32, %ymm8, %ymm3
+        vpblendd	$0xaa, %ymm2, %ymm8, %ymm2
+        vpblendd	$0x55, %ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 4: 2/2
+        vmovdqu	1344(%r10), %ymm10
+        vmovdqu	1376(%r10), %ymm12
+        vmovdqu	1408(%r10), %ymm11
+        vmovdqu	1440(%r10), %ymm13
+        vpunpckldq	%ymm1, %ymm8, %ymm0
+        vpunpckhdq	%ymm1, %ymm8, %ymm1
+        vpunpckldq	%ymm3, %ymm9, %ymm2
+        vpunpckhdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm2
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm8, %ymm8
+        vpsubw	%ymm2, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 8: 2/2
+        vmovdqu	1472(%r10), %ymm10
+        vmovdqu	1504(%r10), %ymm12
+        vmovdqu	1536(%r10), %ymm11
+        vmovdqu	1568(%r10), %ymm13
+        vpunpcklqdq	%ymm1, %ymm8, %ymm0
+        vpunpckhqdq	%ymm1, %ymm8, %ymm1
+        vpunpcklqdq	%ymm3, %ymm9, %ymm2
+        vpunpckhqdq	%ymm3, %ymm9, %ymm3
+        vpaddw	%ymm1, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm2, %ymm9
+        vpsubw	%ymm1, %ymm0, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpmullw	%ymm12, %ymm1, %ymm0
+        vpmullw	%ymm13, %ymm3, %ymm2
+        vpmulhw	%ymm10, %ymm1, %ymm1
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm0, %ymm0
+        vpmulhw	%ymm14, %ymm2, %ymm2
+        vpsubw	%ymm0, %ymm1, %ymm1
+        vpsubw	%ymm2, %ymm3, %ymm3
+        # 16: 2/2
+        vperm2i128	$32, %ymm1, %ymm8, %ymm0
+        vmovdqu	1600(%r10), %ymm10
+        vperm2i128	$49, %ymm1, %ymm8, %ymm1
+        vmovdqu	1632(%r10), %ymm12
+        vperm2i128	$32, %ymm3, %ymm9, %ymm2
+        vmovdqu	1664(%r10), %ymm11
+        vperm2i128	$49, %ymm3, %ymm9, %ymm3
+        vmovdqu	1696(%r10), %ymm13
+        vpsubw	%ymm1, %ymm0, %ymm8
+        vpsubw	%ymm3, %ymm2, %ymm9
+        vpaddw	%ymm1, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm2, %ymm2
+        vpmullw	%ymm12, %ymm8, %ymm1
+        vpmullw	%ymm13, %ymm9, %ymm3
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm1, %ymm8, %ymm1
+        vpsubw	%ymm3, %ymm9, %ymm3
+        # 32: 2/2
+        vmovdqu	1728(%r10), %ymm10
+        vmovdqu	1760(%r10), %ymm12
+        vpaddw	%ymm2, %ymm0, %ymm8
+        vpaddw	%ymm3, %ymm1, %ymm9
+        vpsubw	%ymm2, %ymm0, %ymm2
+        vpsubw	%ymm3, %ymm1, %ymm3
+        vpmulhw	%ymm15, %ymm8, %ymm0
+        vpmulhw	%ymm15, %ymm9, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm8, %ymm0
+        vpsubw	%ymm1, %ymm9, %ymm1
+        vpmullw	%ymm12, %ymm2, %ymm8
+        vpmullw	%ymm12, %ymm3, %ymm9
+        vpmulhw	%ymm10, %ymm2, %ymm2
+        vpmulhw	%ymm10, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        # 2: 2/2
+        vperm2i128	$32, %ymm5, %ymm4, %ymm8
+        vmovdqu	1792(%r10), %ymm10
+        vperm2i128	$49, %ymm5, %ymm4, %ymm9
+        vmovdqu	1824(%r10), %ymm12
+        vpsllq	$32, %ymm9, %ymm4
+        vpsrlq	$32, %ymm8, %ymm5
+        vpblendd	$0xaa, %ymm4, %ymm8, %ymm4
+        vpblendd	$0x55, %ymm5, %ymm9, %ymm5
+        vperm2i128	$32, %ymm7, %ymm6, %ymm8
+        vmovdqu	1856(%r10), %ymm11
+        vperm2i128	$49, %ymm7, %ymm6, %ymm9
+        vmovdqu	1888(%r10), %ymm13
+        vpsllq	$32, %ymm9, %ymm6
+        vpsrlq	$32, %ymm8, %ymm7
+        vpblendd	$0xaa, %ymm6, %ymm8, %ymm6
+        vpblendd	$0x55, %ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 4: 2/2
+        vmovdqu	1920(%r10), %ymm10
+        vmovdqu	1952(%r10), %ymm12
+        vmovdqu	1984(%r10), %ymm11
+        vmovdqu	2016(%r10), %ymm13
+        vpunpckldq	%ymm5, %ymm8, %ymm4
+        vpunpckhdq	%ymm5, %ymm8, %ymm5
+        vpunpckldq	%ymm7, %ymm9, %ymm6
+        vpunpckhdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm6
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm6, %ymm6
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm8, %ymm8
+        vpsubw	%ymm6, %ymm9, %ymm9
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 8: 2/2
+        vmovdqu	2048(%r10), %ymm10
+        vmovdqu	2080(%r10), %ymm12
+        vmovdqu	2112(%r10), %ymm11
+        vmovdqu	2144(%r10), %ymm13
+        vpunpcklqdq	%ymm5, %ymm8, %ymm4
+        vpunpckhqdq	%ymm5, %ymm8, %ymm5
+        vpunpcklqdq	%ymm7, %ymm9, %ymm6
+        vpunpckhqdq	%ymm7, %ymm9, %ymm7
+        vpaddw	%ymm5, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm6, %ymm9
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpsubw	%ymm7, %ymm6, %ymm7
+        vpmullw	%ymm12, %ymm5, %ymm4
+        vpmullw	%ymm13, %ymm7, %ymm6
+        vpmulhw	%ymm10, %ymm5, %ymm5
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpsubw	%ymm4, %ymm5, %ymm5
+        vpsubw	%ymm6, %ymm7, %ymm7
+        # 16: 2/2
+        vperm2i128	$32, %ymm5, %ymm8, %ymm4
+        vmovdqu	2176(%r10), %ymm10
+        vperm2i128	$49, %ymm5, %ymm8, %ymm5
+        vmovdqu	2208(%r10), %ymm12
+        vperm2i128	$32, %ymm7, %ymm9, %ymm6
+        vmovdqu	2240(%r10), %ymm11
+        vperm2i128	$49, %ymm7, %ymm9, %ymm7
+        vmovdqu	2272(%r10), %ymm13
+        vpsubw	%ymm5, %ymm4, %ymm8
+        vpsubw	%ymm7, %ymm6, %ymm9
+        vpaddw	%ymm5, %ymm4, %ymm4
+        vpaddw	%ymm7, %ymm6, %ymm6
+        vpmullw	%ymm12, %ymm8, %ymm5
+        vpmullw	%ymm13, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm11, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm5, %ymm8, %ymm5
+        vpsubw	%ymm7, %ymm9, %ymm7
+        # 32: 2/2
+        vmovdqu	2304(%r10), %ymm10
+        vmovdqu	2336(%r10), %ymm12
+        vpaddw	%ymm6, %ymm4, %ymm8
+        vpaddw	%ymm7, %ymm5, %ymm9
+        vpsubw	%ymm6, %ymm4, %ymm6
+        vpsubw	%ymm7, %ymm5, %ymm7
+        vpmulhw	%ymm15, %ymm8, %ymm4
+        vpmulhw	%ymm15, %ymm9, %ymm5
+        vpsraw	$10, %ymm4, %ymm4
+        vpsraw	$10, %ymm5, %ymm5
+        vpmullw	%ymm14, %ymm4, %ymm4
+        vpmullw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpmullw	%ymm12, %ymm6, %ymm8
+        vpmullw	%ymm12, %ymm7, %ymm9
+        vpmulhw	%ymm10, %ymm6, %ymm6
+        vpmulhw	%ymm10, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        # 64: 2/2
+        vmovdqu	2368(%r10), %ymm10
+        vmovdqu	2400(%r10), %ymm12
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	%ymm2, 320(%rsi)
+        vmovdqu	%ymm3, 352(%rsi)
+        # 128
+        vmovdqu	2432(%r10), %ymm10
+        vmovdqu	2464(%r10), %ymm12
+        vmovdqu	2496(%r10), %ymm11
+        vmovdqu	2528(%r10), %ymm13
+        vmovdqu	128(%rsi), %ymm0
+        vmovdqu	160(%rsi), %ymm1
+        vmovdqu	192(%rsi), %ymm2
+        vmovdqu	224(%rsi), %ymm3
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm11, %ymm0, %ymm0
+        vpmulhw	%ymm11, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm0
+        vpsubw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm11, %ymm2, %ymm2
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        vpmullw	%ymm13, %ymm4, %ymm8
+        vpmullw	%ymm13, %ymm5, %ymm9
+        vpmulhw	%ymm11, %ymm4, %ymm4
+        vpmulhw	%ymm11, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm4
+        vpsubw	%ymm9, %ymm5, %ymm5
+        vpmullw	%ymm13, %ymm6, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm11, %ymm6, %ymm6
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	%ymm2, 192(%rsi)
+        vmovdqu	%ymm3, 224(%rsi)
+        vmovdqu	%ymm4, 384(%rsi)
+        vmovdqu	%ymm5, 416(%rsi)
+        vmovdqu	%ymm6, 448(%rsi)
+        vmovdqu	%ymm7, 480(%rsi)
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vmovdqu	64(%rsi), %ymm2
+        vmovdqu	96(%rsi), %ymm3
+        vmovdqu	256(%rsi), %ymm4
+        vmovdqu	288(%rsi), %ymm5
+        vmovdqu	320(%rsi), %ymm6
+        vmovdqu	352(%rsi), %ymm7
+        vpsubw	%ymm4, %ymm0, %ymm8
+        vpsubw	%ymm5, %ymm1, %ymm9
+        vpaddw	%ymm4, %ymm0, %ymm0
+        vpaddw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm12, %ymm8, %ymm4
+        vpmullw	%ymm12, %ymm9, %ymm5
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm4, %ymm4
+        vpmulhw	%ymm14, %ymm5, %ymm5
+        vpsubw	%ymm4, %ymm8, %ymm4
+        vpsubw	%ymm5, %ymm9, %ymm5
+        vpsubw	%ymm6, %ymm2, %ymm8
+        vpsubw	%ymm7, %ymm3, %ymm9
+        vpaddw	%ymm6, %ymm2, %ymm2
+        vpaddw	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm12, %ymm8, %ymm6
+        vpmullw	%ymm12, %ymm9, %ymm7
+        vpmulhw	%ymm10, %ymm8, %ymm8
+        vpmulhw	%ymm10, %ymm9, %ymm9
+        vpmulhw	%ymm14, %ymm6, %ymm6
+        vpmulhw	%ymm14, %ymm7, %ymm7
+        vpsubw	%ymm6, %ymm8, %ymm6
+        vpsubw	%ymm7, %ymm9, %ymm7
+        vpmullw	%ymm13, %ymm0, %ymm8
+        vpmullw	%ymm13, %ymm1, %ymm9
+        vpmulhw	%ymm11, %ymm0, %ymm0
+        vpmulhw	%ymm11, %ymm1, %ymm1
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm0, %ymm0
+        vpsubw	%ymm9, %ymm1, %ymm1
+        vpmullw	%ymm13, %ymm2, %ymm8
+        vpmullw	%ymm13, %ymm3, %ymm9
+        vpmulhw	%ymm11, %ymm2, %ymm2
+        vpmulhw	%ymm11, %ymm3, %ymm3
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm2, %ymm2
+        vpsubw	%ymm9, %ymm3, %ymm3
+        vpmullw	%ymm13, %ymm4, %ymm8
+        vpmullw	%ymm13, %ymm5, %ymm9
+        vpmulhw	%ymm11, %ymm4, %ymm4
+        vpmulhw	%ymm11, %ymm5, %ymm5
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm4, %ymm4
+        vpsubw	%ymm9, %ymm5, %ymm5
+        vpmullw	%ymm13, %ymm6, %ymm8
+        vpmullw	%ymm13, %ymm7, %ymm9
+        vpmulhw	%ymm11, %ymm6, %ymm6
+        vpmulhw	%ymm11, %ymm7, %ymm7
+        vpmulhw	%ymm14, %ymm8, %ymm8
+        vpmulhw	%ymm14, %ymm9, %ymm9
+        vpsubw	%ymm8, %ymm6, %ymm6
+        vpsubw	%ymm9, %ymm7, %ymm7
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	%ymm2, 64(%rsi)
+        vmovdqu	%ymm3, 96(%rsi)
+        vmovdqu	%ymm4, 256(%rsi)
+        vmovdqu	%ymm5, 288(%rsi)
+        vmovdqu	%ymm6, 320(%rsi)
+        vmovdqu	%ymm7, 352(%rsi)
+        # Sub Errors
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vmovdqu	64(%rsi), %ymm2
+        vmovdqu	96(%rsi), %ymm3
+        vmovdqu	(%rcx), %ymm4
+        vmovdqu	32(%rcx), %ymm5
+        vmovdqu	64(%rcx), %ymm6
+        vmovdqu	96(%rcx), %ymm7
+        vpsubw	%ymm0, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm5, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpsubw	%ymm2, %ymm6, %ymm6
+        vpsubw	%ymm3, %ymm7, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm1, 32(%rsi)
+        vmovdqu	%ymm2, 64(%rsi)
+        vmovdqu	%ymm3, 96(%rsi)
+        vmovdqu	128(%rsi), %ymm0
+        vmovdqu	160(%rsi), %ymm1
+        vmovdqu	192(%rsi), %ymm2
+        vmovdqu	224(%rsi), %ymm3
+        vmovdqu	128(%rcx), %ymm4
+        vmovdqu	160(%rcx), %ymm5
+        vmovdqu	192(%rcx), %ymm6
+        vmovdqu	224(%rcx), %ymm7
+        vpsubw	%ymm0, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm5, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpsubw	%ymm2, %ymm6, %ymm6
+        vpsubw	%ymm3, %ymm7, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 128(%rsi)
+        vmovdqu	%ymm1, 160(%rsi)
+        vmovdqu	%ymm2, 192(%rsi)
+        vmovdqu	%ymm3, 224(%rsi)
+        vmovdqu	256(%rsi), %ymm0
+        vmovdqu	288(%rsi), %ymm1
+        vmovdqu	320(%rsi), %ymm2
+        vmovdqu	352(%rsi), %ymm3
+        vmovdqu	256(%rcx), %ymm4
+        vmovdqu	288(%rcx), %ymm5
+        vmovdqu	320(%rcx), %ymm6
+        vmovdqu	352(%rcx), %ymm7
+        vpsubw	%ymm0, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm5, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpsubw	%ymm2, %ymm6, %ymm6
+        vpsubw	%ymm3, %ymm7, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 256(%rsi)
+        vmovdqu	%ymm1, 288(%rsi)
+        vmovdqu	%ymm2, 320(%rsi)
+        vmovdqu	%ymm3, 352(%rsi)
+        vmovdqu	384(%rsi), %ymm0
+        vmovdqu	416(%rsi), %ymm1
+        vmovdqu	448(%rsi), %ymm2
+        vmovdqu	480(%rsi), %ymm3
+        vmovdqu	384(%rcx), %ymm4
+        vmovdqu	416(%rcx), %ymm5
+        vmovdqu	448(%rcx), %ymm6
+        vmovdqu	480(%rcx), %ymm7
+        vpsubw	%ymm0, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm5, %ymm5
+        vpmulhw	%ymm15, %ymm4, %ymm0
+        vpmulhw	%ymm15, %ymm5, %ymm1
+        vpsraw	$10, %ymm0, %ymm0
+        vpsraw	$10, %ymm1, %ymm1
+        vpmullw	%ymm14, %ymm0, %ymm0
+        vpmullw	%ymm14, %ymm1, %ymm1
+        vpsubw	%ymm0, %ymm4, %ymm0
+        vpsubw	%ymm1, %ymm5, %ymm1
+        vpsubw	%ymm2, %ymm6, %ymm6
+        vpsubw	%ymm3, %ymm7, %ymm7
+        vpmulhw	%ymm15, %ymm6, %ymm2
+        vpmulhw	%ymm15, %ymm7, %ymm3
+        vpsraw	$10, %ymm2, %ymm2
+        vpsraw	$10, %ymm3, %ymm3
+        vpmullw	%ymm14, %ymm2, %ymm2
+        vpmullw	%ymm14, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm6, %ymm2
+        vpsubw	%ymm3, %ymm7, %ymm3
+        vmovdqu	%ymm0, 384(%rsi)
+        vmovdqu	%ymm1, 416(%rsi)
+        vmovdqu	%ymm2, 448(%rsi)
+        vmovdqu	%ymm3, 480(%rsi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_decapsulate_avx2,.-kyber_decapsulate_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.text
+.globl	kyber_csubq_avx2
+.type	kyber_csubq_avx2,@function
+.align	16
+kyber_csubq_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_csubq_avx2
+.p2align	4
+_kyber_csubq_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	kyber_q(%rip), %ymm12
+        vmovdqu	(%rdi), %ymm0
+        vmovdqu	32(%rdi), %ymm1
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vmovdqu	128(%rdi), %ymm4
+        vmovdqu	160(%rdi), %ymm5
+        vmovdqu	192(%rdi), %ymm6
+        vmovdqu	224(%rdi), %ymm7
+        vpsubw	%ymm12, %ymm0, %ymm8
+        vpsubw	%ymm12, %ymm1, %ymm9
+        vpsubw	%ymm12, %ymm2, %ymm10
+        vpsubw	%ymm12, %ymm3, %ymm11
+        vpsraw	$15, %ymm8, %ymm0
+        vpsraw	$15, %ymm9, %ymm1
+        vpsraw	$15, %ymm10, %ymm2
+        vpsraw	$15, %ymm11, %ymm3
+        vpand	%ymm12, %ymm0, %ymm0
+        vpand	%ymm12, %ymm1, %ymm1
+        vpand	%ymm12, %ymm2, %ymm2
+        vpand	%ymm12, %ymm3, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpaddw	%ymm10, %ymm2, %ymm2
+        vpaddw	%ymm11, %ymm3, %ymm3
+        vpsubw	%ymm12, %ymm4, %ymm8
+        vpsubw	%ymm12, %ymm5, %ymm9
+        vpsubw	%ymm12, %ymm6, %ymm10
+        vpsubw	%ymm12, %ymm7, %ymm11
+        vpsraw	$15, %ymm8, %ymm4
+        vpsraw	$15, %ymm9, %ymm5
+        vpsraw	$15, %ymm10, %ymm6
+        vpsraw	$15, %ymm11, %ymm7
+        vpand	%ymm12, %ymm4, %ymm4
+        vpand	%ymm12, %ymm5, %ymm5
+        vpand	%ymm12, %ymm6, %ymm6
+        vpand	%ymm12, %ymm7, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        vpaddw	%ymm10, %ymm6, %ymm6
+        vpaddw	%ymm11, %ymm7, %ymm7
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, 128(%rdi)
+        vmovdqu	%ymm5, 160(%rdi)
+        vmovdqu	%ymm6, 192(%rdi)
+        vmovdqu	%ymm7, 224(%rdi)
+        vmovdqu	256(%rdi), %ymm0
+        vmovdqu	288(%rdi), %ymm1
+        vmovdqu	320(%rdi), %ymm2
+        vmovdqu	352(%rdi), %ymm3
+        vmovdqu	384(%rdi), %ymm4
+        vmovdqu	416(%rdi), %ymm5
+        vmovdqu	448(%rdi), %ymm6
+        vmovdqu	480(%rdi), %ymm7
+        vpsubw	%ymm12, %ymm0, %ymm8
+        vpsubw	%ymm12, %ymm1, %ymm9
+        vpsubw	%ymm12, %ymm2, %ymm10
+        vpsubw	%ymm12, %ymm3, %ymm11
+        vpsraw	$15, %ymm8, %ymm0
+        vpsraw	$15, %ymm9, %ymm1
+        vpsraw	$15, %ymm10, %ymm2
+        vpsraw	$15, %ymm11, %ymm3
+        vpand	%ymm12, %ymm0, %ymm0
+        vpand	%ymm12, %ymm1, %ymm1
+        vpand	%ymm12, %ymm2, %ymm2
+        vpand	%ymm12, %ymm3, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpaddw	%ymm10, %ymm2, %ymm2
+        vpaddw	%ymm11, %ymm3, %ymm3
+        vpsubw	%ymm12, %ymm4, %ymm8
+        vpsubw	%ymm12, %ymm5, %ymm9
+        vpsubw	%ymm12, %ymm6, %ymm10
+        vpsubw	%ymm12, %ymm7, %ymm11
+        vpsraw	$15, %ymm8, %ymm4
+        vpsraw	$15, %ymm9, %ymm5
+        vpsraw	$15, %ymm10, %ymm6
+        vpsraw	$15, %ymm11, %ymm7
+        vpand	%ymm12, %ymm4, %ymm4
+        vpand	%ymm12, %ymm5, %ymm5
+        vpand	%ymm12, %ymm6, %ymm6
+        vpand	%ymm12, %ymm7, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        vpaddw	%ymm10, %ymm6, %ymm6
+        vpaddw	%ymm11, %ymm7, %ymm7
+        vmovdqu	%ymm0, 256(%rdi)
+        vmovdqu	%ymm1, 288(%rdi)
+        vmovdqu	%ymm2, 320(%rdi)
+        vmovdqu	%ymm3, 352(%rdi)
+        vmovdqu	%ymm4, 384(%rdi)
+        vmovdqu	%ymm5, 416(%rdi)
+        vmovdqu	%ymm6, 448(%rdi)
+        vmovdqu	%ymm7, 480(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_csubq_avx2,.-kyber_csubq_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_rej_idx:
+.quad	0xffffffffffffffff,0xffffffffffffff00
+.quad	0xffffffffffffff02,0xffffffffffff0200
+.quad	0xffffffffffffff04,0xffffffffffff0400
+.quad	0xffffffffffff0402,0xffffffffff040200
+.quad	0xffffffffffffff06,0xffffffffffff0600
+.quad	0xffffffffffff0602,0xffffffffff060200
+.quad	0xffffffffffff0604,0xffffffffff060400
+.quad	0xffffffffff060402,0xffffffff06040200
+.quad	0xffffffffffffff08,0xffffffffffff0800
+.quad	0xffffffffffff0802,0xffffffffff080200
+.quad	0xffffffffffff0804,0xffffffffff080400
+.quad	0xffffffffff080402,0xffffffff08040200
+.quad	0xffffffffffff0806,0xffffffffff080600
+.quad	0xffffffffff080602,0xffffffff08060200
+.quad	0xffffffffff080604,0xffffffff08060400
+.quad	0xffffffff08060402,0xffffff0806040200
+.quad	0xffffffffffffff0a,0xffffffffffff0a00
+.quad	0xffffffffffff0a02,0xffffffffff0a0200
+.quad	0xffffffffffff0a04,0xffffffffff0a0400
+.quad	0xffffffffff0a0402,0xffffffff0a040200
+.quad	0xffffffffffff0a06,0xffffffffff0a0600
+.quad	0xffffffffff0a0602,0xffffffff0a060200
+.quad	0xffffffffff0a0604,0xffffffff0a060400
+.quad	0xffffffff0a060402,0xffffff0a06040200
+.quad	0xffffffffffff0a08,0xffffffffff0a0800
+.quad	0xffffffffff0a0802,0xffffffff0a080200
+.quad	0xffffffffff0a0804,0xffffffff0a080400
+.quad	0xffffffff0a080402,0xffffff0a08040200
+.quad	0xffffffffff0a0806,0xffffffff0a080600
+.quad	0xffffffff0a080602,0xffffff0a08060200
+.quad	0xffffffff0a080604,0xffffff0a08060400
+.quad	0xffffff0a08060402,0xffff0a0806040200
+.quad	0xffffffffffffff0c,0xffffffffffff0c00
+.quad	0xffffffffffff0c02,0xffffffffff0c0200
+.quad	0xffffffffffff0c04,0xffffffffff0c0400
+.quad	0xffffffffff0c0402,0xffffffff0c040200
+.quad	0xffffffffffff0c06,0xffffffffff0c0600
+.quad	0xffffffffff0c0602,0xffffffff0c060200
+.quad	0xffffffffff0c0604,0xffffffff0c060400
+.quad	0xffffffff0c060402,0xffffff0c06040200
+.quad	0xffffffffffff0c08,0xffffffffff0c0800
+.quad	0xffffffffff0c0802,0xffffffff0c080200
+.quad	0xffffffffff0c0804,0xffffffff0c080400
+.quad	0xffffffff0c080402,0xffffff0c08040200
+.quad	0xffffffffff0c0806,0xffffffff0c080600
+.quad	0xffffffff0c080602,0xffffff0c08060200
+.quad	0xffffffff0c080604,0xffffff0c08060400
+.quad	0xffffff0c08060402,0xffff0c0806040200
+.quad	0xffffffffffff0c0a,0xffffffffff0c0a00
+.quad	0xffffffffff0c0a02,0xffffffff0c0a0200
+.quad	0xffffffffff0c0a04,0xffffffff0c0a0400
+.quad	0xffffffff0c0a0402,0xffffff0c0a040200
+.quad	0xffffffffff0c0a06,0xffffffff0c0a0600
+.quad	0xffffffff0c0a0602,0xffffff0c0a060200
+.quad	0xffffffff0c0a0604,0xffffff0c0a060400
+.quad	0xffffff0c0a060402,0xffff0c0a06040200
+.quad	0xffffffffff0c0a08,0xffffffff0c0a0800
+.quad	0xffffffff0c0a0802,0xffffff0c0a080200
+.quad	0xffffffff0c0a0804,0xffffff0c0a080400
+.quad	0xffffff0c0a080402,0xffff0c0a08040200
+.quad	0xffffffff0c0a0806,0xffffff0c0a080600
+.quad	0xffffff0c0a080602,0xffff0c0a08060200
+.quad	0xffffff0c0a080604,0xffff0c0a08060400
+.quad	0xffff0c0a08060402,0xff0c0a0806040200
+.quad	0xffffffffffffff0e,0xffffffffffff0e00
+.quad	0xffffffffffff0e02,0xffffffffff0e0200
+.quad	0xffffffffffff0e04,0xffffffffff0e0400
+.quad	0xffffffffff0e0402,0xffffffff0e040200
+.quad	0xffffffffffff0e06,0xffffffffff0e0600
+.quad	0xffffffffff0e0602,0xffffffff0e060200
+.quad	0xffffffffff0e0604,0xffffffff0e060400
+.quad	0xffffffff0e060402,0xffffff0e06040200
+.quad	0xffffffffffff0e08,0xffffffffff0e0800
+.quad	0xffffffffff0e0802,0xffffffff0e080200
+.quad	0xffffffffff0e0804,0xffffffff0e080400
+.quad	0xffffffff0e080402,0xffffff0e08040200
+.quad	0xffffffffff0e0806,0xffffffff0e080600
+.quad	0xffffffff0e080602,0xffffff0e08060200
+.quad	0xffffffff0e080604,0xffffff0e08060400
+.quad	0xffffff0e08060402,0xffff0e0806040200
+.quad	0xffffffffffff0e0a,0xffffffffff0e0a00
+.quad	0xffffffffff0e0a02,0xffffffff0e0a0200
+.quad	0xffffffffff0e0a04,0xffffffff0e0a0400
+.quad	0xffffffff0e0a0402,0xffffff0e0a040200
+.quad	0xffffffffff0e0a06,0xffffffff0e0a0600
+.quad	0xffffffff0e0a0602,0xffffff0e0a060200
+.quad	0xffffffff0e0a0604,0xffffff0e0a060400
+.quad	0xffffff0e0a060402,0xffff0e0a06040200
+.quad	0xffffffffff0e0a08,0xffffffff0e0a0800
+.quad	0xffffffff0e0a0802,0xffffff0e0a080200
+.quad	0xffffffff0e0a0804,0xffffff0e0a080400
+.quad	0xffffff0e0a080402,0xffff0e0a08040200
+.quad	0xffffffff0e0a0806,0xffffff0e0a080600
+.quad	0xffffff0e0a080602,0xffff0e0a08060200
+.quad	0xffffff0e0a080604,0xffff0e0a08060400
+.quad	0xffff0e0a08060402,0xff0e0a0806040200
+.quad	0xffffffffffff0e0c,0xffffffffff0e0c00
+.quad	0xffffffffff0e0c02,0xffffffff0e0c0200
+.quad	0xffffffffff0e0c04,0xffffffff0e0c0400
+.quad	0xffffffff0e0c0402,0xffffff0e0c040200
+.quad	0xffffffffff0e0c06,0xffffffff0e0c0600
+.quad	0xffffffff0e0c0602,0xffffff0e0c060200
+.quad	0xffffffff0e0c0604,0xffffff0e0c060400
+.quad	0xffffff0e0c060402,0xffff0e0c06040200
+.quad	0xffffffffff0e0c08,0xffffffff0e0c0800
+.quad	0xffffffff0e0c0802,0xffffff0e0c080200
+.quad	0xffffffff0e0c0804,0xffffff0e0c080400
+.quad	0xffffff0e0c080402,0xffff0e0c08040200
+.quad	0xffffffff0e0c0806,0xffffff0e0c080600
+.quad	0xffffff0e0c080602,0xffff0e0c08060200
+.quad	0xffffff0e0c080604,0xffff0e0c08060400
+.quad	0xffff0e0c08060402,0xff0e0c0806040200
+.quad	0xffffffffff0e0c0a,0xffffffff0e0c0a00
+.quad	0xffffffff0e0c0a02,0xffffff0e0c0a0200
+.quad	0xffffffff0e0c0a04,0xffffff0e0c0a0400
+.quad	0xffffff0e0c0a0402,0xffff0e0c0a040200
+.quad	0xffffffff0e0c0a06,0xffffff0e0c0a0600
+.quad	0xffffff0e0c0a0602,0xffff0e0c0a060200
+.quad	0xffffff0e0c0a0604,0xffff0e0c0a060400
+.quad	0xffff0e0c0a060402,0xff0e0c0a06040200
+.quad	0xffffffff0e0c0a08,0xffffff0e0c0a0800
+.quad	0xffffff0e0c0a0802,0xffff0e0c0a080200
+.quad	0xffffff0e0c0a0804,0xffff0e0c0a080400
+.quad	0xffff0e0c0a080402,0xff0e0c0a08040200
+.quad	0xffffff0e0c0a0806,0xffff0e0c0a080600
+.quad	0xffff0e0c0a080602,0xff0e0c0a08060200
+.quad	0xffff0e0c0a080604,0xff0e0c0a08060400
+.quad	0xff0e0c0a08060402,0xe0c0a0806040200
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_rej_q:
+.quad	0xd010d010d010d01, 0xd010d010d010d01
+.quad	0xd010d010d010d01, 0xd010d010d010d01
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_rej_ones:
+.quad	0x101010101010101, 0x101010101010101
+.quad	0x101010101010101, 0x101010101010101
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_rej_mask:
+.quad	0xfff0fff0fff0fff, 0xfff0fff0fff0fff
+.quad	0xfff0fff0fff0fff, 0xfff0fff0fff0fff
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_rej_shuffle:
+.quad	0x504040302010100, 0xb0a0a0908070706
+.quad	0x908080706050504, 0xf0e0e0d0c0b0b0a
+#ifndef __APPLE__
+.text
+.globl	kyber_rej_uniform_n_avx2
+.type	kyber_rej_uniform_n_avx2,@function
+.align	16
+kyber_rej_uniform_n_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_rej_uniform_n_avx2
+.p2align	4
+_kyber_rej_uniform_n_avx2:
+#endif /* __APPLE__ */
+        pushq	%rbx
+        pushq	%r12
+        pushq	%r13
+        pushq	%r14
+        pushq	%r15
+        pushq	%rbp
+        movq	%rcx, %r8
+        movl	%esi, %eax
+        vmovdqu	L_kyber_rej_q(%rip), %ymm6
+        vmovdqu	L_kyber_rej_ones(%rip), %ymm7
+        vmovdqu	L_kyber_rej_mask(%rip), %ymm8
+        vmovdqu	L_kyber_rej_shuffle(%rip), %ymm9
+        leaq	L_kyber_rej_idx(%rip), %r9
+        movq	$0x1111111111111111, %r14
+        movq	$0xe0c0a0806040200, %rbp
+        movq	$0x101010101010101, %r13
+        vpermq	$0x94, (%rdx), %ymm0
+        vpermq	$0x94, 24(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        vpermq	$0x94, 48(%rdx), %ymm0
+        vpermq	$0x94, 72(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        vpermq	$0x94, 96(%rdx), %ymm0
+        vpermq	$0x94, 120(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        vpermq	$0x94, 144(%rdx), %ymm0
+        vpermq	$0x94, 168(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        vpermq	$0x94, 192(%rdx), %ymm0
+        vpermq	$0x94, 216(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        vpermq	$0x94, 240(%rdx), %ymm0
+        vpermq	$0x94, 264(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        vpermq	$0x94, 288(%rdx), %ymm0
+        vpermq	$0x94, 312(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        addq	$0x150, %rdx
+        subl	$0x150, %r8d
+L_kyber_rej_uniform_n_avx2_start_256:
+        vpermq	$0x94, (%rdx), %ymm0
+        vpermq	$0x94, 24(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        addq	$48, %rdx
+        subl	$48, %r8d
+        cmpl	$48, %r8d
+        jl	L_kyber_rej_uniform_n_avx2_done_256
+        cmpl	$32, %esi
+        jge	L_kyber_rej_uniform_n_avx2_start_256
+L_kyber_rej_uniform_n_avx2_done_256:
+        cmpl	$8, %esi
+        jl	L_kyber_rej_uniform_n_avx2_done_128
+        cmpl	$12, %r8d
+        jl	L_kyber_rej_uniform_n_avx2_done_128
+L_kyber_rej_uniform_n_avx2_start_128:
+        vmovdqu	(%rdx), %xmm0
+        vpshufb	%xmm9, %xmm0, %xmm0
+        vpsrlw	$4, %xmm0, %xmm2
+        vpblendw	$0xaa, %xmm2, %xmm0, %xmm0
+        vpand	%xmm8, %xmm0, %xmm0
+        vpcmpgtw	%xmm0, %xmm6, %xmm2
+        vpmovmskb	%xmm2, %rbx
+        movq	$0x5555, %r10
+        pextl	%r10d, %ebx, %ebx
+        movq	(%r9,%rbx,8), %xmm3
+        vpaddb	%xmm7, %xmm3, %xmm4
+        vpunpcklbw	%xmm4, %xmm3, %xmm3
+        vpshufb	%xmm3, %xmm0, %xmm0
+        vmovdqu	%xmm0, (%rdi)
+        popcntl	%ebx, %ecx
+        leaq	(%rdi,%rcx,2), %rdi
+        subl	%ecx, %esi
+        addq	$12, %rdx
+        subl	$12, %r8d
+        cmpl	$12, %r8d
+        jl	L_kyber_rej_uniform_n_avx2_done_128
+        cmpl	$8, %esi
+        jge	L_kyber_rej_uniform_n_avx2_start_128
+L_kyber_rej_uniform_n_avx2_done_128:
+        cmpl	$0x00, %r8d
+        je	L_kyber_rej_uniform_n_avx2_done_64
+        cmpl	$0x00, %esi
+        je	L_kyber_rej_uniform_n_avx2_done_64
+        movq	$0xfff0fff0fff0fff, %r15
+        movq	$0x2000200020002000, %r10
+        movq	$0xd010d010d010d01, %r11
+        movq	$0x1000100010001000, %r12
+L_kyber_rej_uniform_n_avx2_start_64:
+        movq	(%rdx), %rcx
+        pdepq	%r15, %rcx, %rcx
+        cmpw	$0xd01, %cx
+        jge	L_kyber_rej_uniform_0_avx2_rej_large_0
+        movw	%cx, (%rdi)
+        addq	$2, %rdi
+        subl	$0x01, %esi
+        je	L_kyber_rej_uniform_n_avx2_done_64
+L_kyber_rej_uniform_0_avx2_rej_large_0:
+        shrq	$16, %rcx
+        cmpw	$0xd01, %cx
+        jge	L_kyber_rej_uniform_0_avx2_rej_large_1
+        movw	%cx, (%rdi)
+        addq	$2, %rdi
+        subl	$0x01, %esi
+        je	L_kyber_rej_uniform_n_avx2_done_64
+L_kyber_rej_uniform_0_avx2_rej_large_1:
+        shrq	$16, %rcx
+        cmpw	$0xd01, %cx
+        jge	L_kyber_rej_uniform_0_avx2_rej_large_2
+        movw	%cx, (%rdi)
+        addq	$2, %rdi
+        subl	$0x01, %esi
+        je	L_kyber_rej_uniform_n_avx2_done_64
+L_kyber_rej_uniform_0_avx2_rej_large_2:
+        shrq	$16, %rcx
+        cmpw	$0xd01, %cx
+        jge	L_kyber_rej_uniform_0_avx2_rej_large_3
+        movw	%cx, (%rdi)
+        addq	$2, %rdi
+        subl	$0x01, %esi
+        je	L_kyber_rej_uniform_n_avx2_done_64
+L_kyber_rej_uniform_0_avx2_rej_large_3:
+        addq	$6, %rdx
+        subl	$6, %r8d
+        jle	L_kyber_rej_uniform_n_avx2_done_64
+        cmpl	$0x00, %esi
+        jg	L_kyber_rej_uniform_n_avx2_start_64
+L_kyber_rej_uniform_n_avx2_done_64:
+        vzeroupper
+        subl	%esi, %eax
+        popq	%rbp
+        popq	%r15
+        popq	%r14
+        popq	%r13
+        popq	%r12
+        popq	%rbx
+        repz retq
+#ifndef __APPLE__
+.size	kyber_rej_uniform_n_avx2,.-kyber_rej_uniform_n_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.text
+.globl	kyber_rej_uniform_avx2
+.type	kyber_rej_uniform_avx2,@function
+.align	16
+kyber_rej_uniform_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_rej_uniform_avx2
+.p2align	4
+_kyber_rej_uniform_avx2:
+#endif /* __APPLE__ */
+        pushq	%rbx
+        pushq	%r12
+        pushq	%r13
+        pushq	%r14
+        pushq	%r15
+        pushq	%rbp
+        movq	%rcx, %r8
+        movl	%esi, %eax
+        cmpl	$0x00, %esi
+        je	L_kyber_rej_uniform_avx2_done_64
+        cmpl	$8, %esi
+        jl	L_kyber_rej_uniform_avx2_done_128
+        vmovdqu	L_kyber_rej_q(%rip), %ymm6
+        vmovdqu	L_kyber_rej_ones(%rip), %ymm7
+        vmovdqu	L_kyber_rej_mask(%rip), %ymm8
+        vmovdqu	L_kyber_rej_shuffle(%rip), %ymm9
+        leaq	L_kyber_rej_idx(%rip), %r9
+        movq	$0x1111111111111111, %r14
+        movq	$0xe0c0a0806040200, %rbp
+        movq	$0x101010101010101, %r13
+        cmpl	$32, %esi
+        jl	L_kyber_rej_uniform_avx2_done_256
+        vpermq	$0x94, (%rdx), %ymm0
+        vpermq	$0x94, 24(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        addq	$48, %rdx
+        subl	$48, %r8d
+        cmpl	$32, %esi
+        jl	L_kyber_rej_uniform_avx2_done_256
+        vpermq	$0x94, (%rdx), %ymm0
+        vpermq	$0x94, 24(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        addq	$48, %rdx
+        subl	$48, %r8d
+        cmpl	$32, %esi
+        jl	L_kyber_rej_uniform_avx2_done_256
+L_kyber_rej_uniform_avx2_start_256:
+        vpermq	$0x94, (%rdx), %ymm0
+        vpermq	$0x94, 24(%rdx), %ymm1
+        vpshufb	%ymm9, %ymm0, %ymm0
+        vpshufb	%ymm9, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpblendw	$0xaa, %ymm2, %ymm0, %ymm0
+        vpblendw	$0xaa, %ymm3, %ymm1, %ymm1
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpcmpgtw	%ymm0, %ymm6, %ymm2
+        vpcmpgtw	%ymm1, %ymm6, %ymm3
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpmovmskb	%ymm2, %rbx
+        movzbl	%bl, %r10d
+        movzbl	%bh, %ecx
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        shrq	$16, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r11
+        andq	$0xff, %r12
+        movq	(%r9,%r10,8), %xmm2
+        movq	(%r9,%rcx,8), %xmm3
+        movq	(%r9,%r11,8), %xmm4
+        movq	(%r9,%r12,8), %xmm5
+        vinserti128	$0x01, %xmm4, %ymm2, %ymm2
+        vinserti128	$0x01, %xmm5, %ymm3, %ymm3
+        vpaddb	%ymm7, %ymm2, %ymm4
+        vpaddb	%ymm7, %ymm3, %ymm5
+        vpunpcklbw	%ymm4, %ymm2, %ymm2
+        vpunpcklbw	%ymm5, %ymm3, %ymm3
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpshufb	%ymm3, %ymm1, %ymm1
+        movq	%rbx, %r10
+        movq	%rbx, %r11
+        movq	%rbx, %r12
+        andq	$0xff, %rbx
+        shrq	$16, %r10
+        shrq	$8, %r11
+        shrq	$24, %r12
+        andq	$0xff, %r10
+        andq	$0xff, %r11
+        popcntl	%ebx, %ebx
+        popcntl	%r10d, %r10d
+        popcntl	%r11d, %r11d
+        popcntl	%r12d, %r12d
+        vmovdqu	%xmm0, (%rdi)
+        vextracti128	$0x01, %ymm0, %xmm0
+        leaq	(%rdi,%rbx,2), %rdi
+        subl	%ebx, %esi
+        vmovdqu	%xmm0, (%rdi)
+        leaq	(%rdi,%r10,2), %rdi
+        subl	%r10d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        vextracti128	$0x01, %ymm1, %xmm1
+        leaq	(%rdi,%r11,2), %rdi
+        subl	%r11d, %esi
+        vmovdqu	%xmm1, (%rdi)
+        leaq	(%rdi,%r12,2), %rdi
+        subl	%r12d, %esi
+        addq	$48, %rdx
+        subl	$48, %r8d
+        cmpl	$48, %r8d
+        jl	L_kyber_rej_uniform_avx2_done_256
+        cmpl	$32, %esi
+        jge	L_kyber_rej_uniform_avx2_start_256
+L_kyber_rej_uniform_avx2_done_256:
+        cmpl	$8, %esi
+        jl	L_kyber_rej_uniform_avx2_done_128
+        cmpl	$12, %r8d
+        jl	L_kyber_rej_uniform_avx2_done_128
+L_kyber_rej_uniform_avx2_start_128:
+        vmovdqu	(%rdx), %xmm0
+        vpshufb	%xmm9, %xmm0, %xmm0
+        vpsrlw	$4, %xmm0, %xmm2
+        vpblendw	$0xaa, %xmm2, %xmm0, %xmm0
+        vpand	%xmm8, %xmm0, %xmm0
+        vpcmpgtw	%xmm0, %xmm6, %xmm2
+        vpmovmskb	%xmm2, %rbx
+        movq	$0x5555, %r10
+        pextl	%r10d, %ebx, %ebx
+        movq	(%r9,%rbx,8), %xmm3
+        vpaddb	%xmm7, %xmm3, %xmm4
+        vpunpcklbw	%xmm4, %xmm3, %xmm3
+        vpshufb	%xmm3, %xmm0, %xmm0
+        vmovdqu	%xmm0, (%rdi)
+        popcntl	%ebx, %ecx
+        leaq	(%rdi,%rcx,2), %rdi
+        subl	%ecx, %esi
+        addq	$12, %rdx
+        subl	$12, %r8d
+        cmpl	$12, %r8d
+        jl	L_kyber_rej_uniform_avx2_done_128
+        cmpl	$8, %esi
+        jge	L_kyber_rej_uniform_avx2_start_128
+L_kyber_rej_uniform_avx2_done_128:
+        cmpl	$0x00, %r8d
+        je	L_kyber_rej_uniform_avx2_done_64
+        cmpl	$0x00, %esi
+        je	L_kyber_rej_uniform_avx2_done_64
+        movq	$0xfff0fff0fff0fff, %r15
+        movq	$0x2000200020002000, %r10
+        movq	$0xd010d010d010d01, %r11
+        movq	$0x1000100010001000, %r12
+L_kyber_rej_uniform_avx2_start_64:
+        movq	(%rdx), %rcx
+        pdepq	%r15, %rcx, %rcx
+        cmpw	$0xd01, %cx
+        jge	L_kyber_rej_uniform_avx2_rej_large_0
+        movw	%cx, (%rdi)
+        addq	$2, %rdi
+        subl	$0x01, %esi
+        je	L_kyber_rej_uniform_avx2_done_64
+L_kyber_rej_uniform_avx2_rej_large_0:
+        shrq	$16, %rcx
+        cmpw	$0xd01, %cx
+        jge	L_kyber_rej_uniform_avx2_rej_large_1
+        movw	%cx, (%rdi)
+        addq	$2, %rdi
+        subl	$0x01, %esi
+        je	L_kyber_rej_uniform_avx2_done_64
+L_kyber_rej_uniform_avx2_rej_large_1:
+        shrq	$16, %rcx
+        cmpw	$0xd01, %cx
+        jge	L_kyber_rej_uniform_avx2_rej_large_2
+        movw	%cx, (%rdi)
+        addq	$2, %rdi
+        subl	$0x01, %esi
+        je	L_kyber_rej_uniform_avx2_done_64
+L_kyber_rej_uniform_avx2_rej_large_2:
+        shrq	$16, %rcx
+        cmpw	$0xd01, %cx
+        jge	L_kyber_rej_uniform_avx2_rej_large_3
+        movw	%cx, (%rdi)
+        addq	$2, %rdi
+        subl	$0x01, %esi
+        je	L_kyber_rej_uniform_avx2_done_64
+L_kyber_rej_uniform_avx2_rej_large_3:
+        addq	$6, %rdx
+        subl	$6, %r8d
+        jle	L_kyber_rej_uniform_avx2_done_64
+        cmpl	$0x00, %esi
+        jg	L_kyber_rej_uniform_avx2_start_64
+L_kyber_rej_uniform_avx2_done_64:
+        vzeroupper
+        subl	%esi, %eax
+        popq	%rbp
+        popq	%r15
+        popq	%r14
+        popq	%r13
+        popq	%r12
+        popq	%rbx
+        repz retq
+#ifndef __APPLE__
+.size	kyber_rej_uniform_avx2,.-kyber_rej_uniform_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_mask_249:
+.quad	0x24924900249249, 0x24924900249249
+.quad	0x24924900249249, 0x24924900249249
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_mask_6db:
+.quad	0x6db6db006db6db, 0x6db6db006db6db
+.quad	0x6db6db006db6db, 0x6db6db006db6db
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_mask_07:
+.quad	0x700000007, 0x700000007
+.quad	0x700000007, 0x700000007
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_mask_70:
+.quad	0x7000000070000, 0x7000000070000
+.quad	0x7000000070000, 0x7000000070000
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_mask_3:
+.quad	0x3000300030003, 0x3000300030003
+.quad	0x3000300030003, 0x3000300030003
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_shuff:
+.quad	0xff050403ff020100, 0xff0b0a09ff080706
+.quad	0xff090807ff060504, 0xff0f0e0dff0c0b0a
+#ifndef __APPLE__
+.text
+.globl	kyber_cbd_eta3_avx2
+.type	kyber_cbd_eta3_avx2,@function
+.align	16
+kyber_cbd_eta3_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_cbd_eta3_avx2
+.p2align	4
+_kyber_cbd_eta3_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	L_kyber_mask_249(%rip), %ymm8
+        vmovdqu	L_kyber_mask_6db(%rip), %ymm9
+        vmovdqu	L_kyber_mask_07(%rip), %ymm10
+        vmovdqu	L_kyber_mask_70(%rip), %ymm11
+        vmovdqu	L_kyber_mask_3(%rip), %ymm12
+        vmovdqu	L_kyber_shuff(%rip), %ymm13
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	24(%rsi), %ymm1
+        vpermq	$0x94, %ymm0, %ymm0
+        vpermq	$0x94, %ymm1, %ymm1
+        vpshufb	%ymm13, %ymm0, %ymm0
+        vpshufb	%ymm13, %ymm1, %ymm1
+        vpsrld	$0x01, %ymm0, %ymm2
+        vpsrld	$0x01, %ymm1, %ymm3
+        vpsrld	$2, %ymm0, %ymm4
+        vpsrld	$2, %ymm1, %ymm5
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpand	%ymm8, %ymm2, %ymm2
+        vpand	%ymm8, %ymm3, %ymm3
+        vpand	%ymm8, %ymm4, %ymm4
+        vpand	%ymm8, %ymm5, %ymm5
+        vpaddd	%ymm2, %ymm0, %ymm0
+        vpaddd	%ymm3, %ymm1, %ymm1
+        vpaddd	%ymm4, %ymm0, %ymm0
+        vpaddd	%ymm5, %ymm1, %ymm1
+        vpsrld	$3, %ymm0, %ymm2
+        vpsrld	$3, %ymm1, %ymm3
+        vpaddd	%ymm9, %ymm0, %ymm0
+        vpaddd	%ymm9, %ymm1, %ymm1
+        vpsubd	%ymm2, %ymm0, %ymm0
+        vpsubd	%ymm3, %ymm1, %ymm1
+        vpslld	$10, %ymm0, %ymm2
+        vpslld	$10, %ymm1, %ymm3
+        vpsrld	$12, %ymm0, %ymm4
+        vpsrld	$12, %ymm1, %ymm5
+        vpsrld	$2, %ymm0, %ymm6
+        vpsrld	$2, %ymm1, %ymm7
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpand	%ymm10, %ymm4, %ymm4
+        vpand	%ymm10, %ymm5, %ymm5
+        vpand	%ymm11, %ymm6, %ymm6
+        vpand	%ymm11, %ymm7, %ymm7
+        vpaddw	%ymm2, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm1, %ymm1
+        vpaddw	%ymm6, %ymm4, %ymm2
+        vpaddw	%ymm7, %ymm5, %ymm3
+        vpsubw	%ymm12, %ymm0, %ymm0
+        vpsubw	%ymm12, %ymm1, %ymm1
+        vpsubw	%ymm12, %ymm2, %ymm2
+        vpsubw	%ymm12, %ymm3, %ymm3
+        vpunpckldq	%ymm2, %ymm0, %ymm4
+        vpunpckldq	%ymm3, %ymm1, %ymm5
+        vpunpckhdq	%ymm2, %ymm0, %ymm6
+        vpunpckhdq	%ymm3, %ymm1, %ymm7
+        vperm2i128	$32, %ymm6, %ymm4, %ymm0
+        vperm2i128	$32, %ymm7, %ymm5, %ymm1
+        vperm2i128	$49, %ymm6, %ymm4, %ymm2
+        vperm2i128	$49, %ymm7, %ymm5, %ymm3
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	48(%rsi), %ymm0
+        vmovdqu	72(%rsi), %ymm1
+        vpermq	$0x94, %ymm0, %ymm0
+        vpermq	$0x94, %ymm1, %ymm1
+        vpshufb	%ymm13, %ymm0, %ymm0
+        vpshufb	%ymm13, %ymm1, %ymm1
+        vpsrld	$0x01, %ymm0, %ymm2
+        vpsrld	$0x01, %ymm1, %ymm3
+        vpsrld	$2, %ymm0, %ymm4
+        vpsrld	$2, %ymm1, %ymm5
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpand	%ymm8, %ymm2, %ymm2
+        vpand	%ymm8, %ymm3, %ymm3
+        vpand	%ymm8, %ymm4, %ymm4
+        vpand	%ymm8, %ymm5, %ymm5
+        vpaddd	%ymm2, %ymm0, %ymm0
+        vpaddd	%ymm3, %ymm1, %ymm1
+        vpaddd	%ymm4, %ymm0, %ymm0
+        vpaddd	%ymm5, %ymm1, %ymm1
+        vpsrld	$3, %ymm0, %ymm2
+        vpsrld	$3, %ymm1, %ymm3
+        vpaddd	%ymm9, %ymm0, %ymm0
+        vpaddd	%ymm9, %ymm1, %ymm1
+        vpsubd	%ymm2, %ymm0, %ymm0
+        vpsubd	%ymm3, %ymm1, %ymm1
+        vpslld	$10, %ymm0, %ymm2
+        vpslld	$10, %ymm1, %ymm3
+        vpsrld	$12, %ymm0, %ymm4
+        vpsrld	$12, %ymm1, %ymm5
+        vpsrld	$2, %ymm0, %ymm6
+        vpsrld	$2, %ymm1, %ymm7
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpand	%ymm10, %ymm4, %ymm4
+        vpand	%ymm10, %ymm5, %ymm5
+        vpand	%ymm11, %ymm6, %ymm6
+        vpand	%ymm11, %ymm7, %ymm7
+        vpaddw	%ymm2, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm1, %ymm1
+        vpaddw	%ymm6, %ymm4, %ymm2
+        vpaddw	%ymm7, %ymm5, %ymm3
+        vpsubw	%ymm12, %ymm0, %ymm0
+        vpsubw	%ymm12, %ymm1, %ymm1
+        vpsubw	%ymm12, %ymm2, %ymm2
+        vpsubw	%ymm12, %ymm3, %ymm3
+        vpunpckldq	%ymm2, %ymm0, %ymm4
+        vpunpckldq	%ymm3, %ymm1, %ymm5
+        vpunpckhdq	%ymm2, %ymm0, %ymm6
+        vpunpckhdq	%ymm3, %ymm1, %ymm7
+        vperm2i128	$32, %ymm6, %ymm4, %ymm0
+        vperm2i128	$32, %ymm7, %ymm5, %ymm1
+        vperm2i128	$49, %ymm6, %ymm4, %ymm2
+        vperm2i128	$49, %ymm7, %ymm5, %ymm3
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm2, 160(%rdi)
+        vmovdqu	%ymm1, 192(%rdi)
+        vmovdqu	%ymm3, 224(%rdi)
+        vmovdqu	96(%rsi), %ymm0
+        vmovdqu	120(%rsi), %ymm1
+        vpermq	$0x94, %ymm0, %ymm0
+        vpermq	$0x94, %ymm1, %ymm1
+        vpshufb	%ymm13, %ymm0, %ymm0
+        vpshufb	%ymm13, %ymm1, %ymm1
+        vpsrld	$0x01, %ymm0, %ymm2
+        vpsrld	$0x01, %ymm1, %ymm3
+        vpsrld	$2, %ymm0, %ymm4
+        vpsrld	$2, %ymm1, %ymm5
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpand	%ymm8, %ymm2, %ymm2
+        vpand	%ymm8, %ymm3, %ymm3
+        vpand	%ymm8, %ymm4, %ymm4
+        vpand	%ymm8, %ymm5, %ymm5
+        vpaddd	%ymm2, %ymm0, %ymm0
+        vpaddd	%ymm3, %ymm1, %ymm1
+        vpaddd	%ymm4, %ymm0, %ymm0
+        vpaddd	%ymm5, %ymm1, %ymm1
+        vpsrld	$3, %ymm0, %ymm2
+        vpsrld	$3, %ymm1, %ymm3
+        vpaddd	%ymm9, %ymm0, %ymm0
+        vpaddd	%ymm9, %ymm1, %ymm1
+        vpsubd	%ymm2, %ymm0, %ymm0
+        vpsubd	%ymm3, %ymm1, %ymm1
+        vpslld	$10, %ymm0, %ymm2
+        vpslld	$10, %ymm1, %ymm3
+        vpsrld	$12, %ymm0, %ymm4
+        vpsrld	$12, %ymm1, %ymm5
+        vpsrld	$2, %ymm0, %ymm6
+        vpsrld	$2, %ymm1, %ymm7
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpand	%ymm10, %ymm4, %ymm4
+        vpand	%ymm10, %ymm5, %ymm5
+        vpand	%ymm11, %ymm6, %ymm6
+        vpand	%ymm11, %ymm7, %ymm7
+        vpaddw	%ymm2, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm1, %ymm1
+        vpaddw	%ymm6, %ymm4, %ymm2
+        vpaddw	%ymm7, %ymm5, %ymm3
+        vpsubw	%ymm12, %ymm0, %ymm0
+        vpsubw	%ymm12, %ymm1, %ymm1
+        vpsubw	%ymm12, %ymm2, %ymm2
+        vpsubw	%ymm12, %ymm3, %ymm3
+        vpunpckldq	%ymm2, %ymm0, %ymm4
+        vpunpckldq	%ymm3, %ymm1, %ymm5
+        vpunpckhdq	%ymm2, %ymm0, %ymm6
+        vpunpckhdq	%ymm3, %ymm1, %ymm7
+        vperm2i128	$32, %ymm6, %ymm4, %ymm0
+        vperm2i128	$32, %ymm7, %ymm5, %ymm1
+        vperm2i128	$49, %ymm6, %ymm4, %ymm2
+        vperm2i128	$49, %ymm7, %ymm5, %ymm3
+        vmovdqu	%ymm0, 256(%rdi)
+        vmovdqu	%ymm2, 288(%rdi)
+        vmovdqu	%ymm1, 320(%rdi)
+        vmovdqu	%ymm3, 352(%rdi)
+        vmovdqu	144(%rsi), %ymm0
+        vmovdqu	168(%rsi), %ymm1
+        vpermq	$0x94, %ymm0, %ymm0
+        vpermq	$0x94, %ymm1, %ymm1
+        vpshufb	%ymm13, %ymm0, %ymm0
+        vpshufb	%ymm13, %ymm1, %ymm1
+        vpsrld	$0x01, %ymm0, %ymm2
+        vpsrld	$0x01, %ymm1, %ymm3
+        vpsrld	$2, %ymm0, %ymm4
+        vpsrld	$2, %ymm1, %ymm5
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpand	%ymm8, %ymm2, %ymm2
+        vpand	%ymm8, %ymm3, %ymm3
+        vpand	%ymm8, %ymm4, %ymm4
+        vpand	%ymm8, %ymm5, %ymm5
+        vpaddd	%ymm2, %ymm0, %ymm0
+        vpaddd	%ymm3, %ymm1, %ymm1
+        vpaddd	%ymm4, %ymm0, %ymm0
+        vpaddd	%ymm5, %ymm1, %ymm1
+        vpsrld	$3, %ymm0, %ymm2
+        vpsrld	$3, %ymm1, %ymm3
+        vpaddd	%ymm9, %ymm0, %ymm0
+        vpaddd	%ymm9, %ymm1, %ymm1
+        vpsubd	%ymm2, %ymm0, %ymm0
+        vpsubd	%ymm3, %ymm1, %ymm1
+        vpslld	$10, %ymm0, %ymm2
+        vpslld	$10, %ymm1, %ymm3
+        vpsrld	$12, %ymm0, %ymm4
+        vpsrld	$12, %ymm1, %ymm5
+        vpsrld	$2, %ymm0, %ymm6
+        vpsrld	$2, %ymm1, %ymm7
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpand	%ymm10, %ymm4, %ymm4
+        vpand	%ymm10, %ymm5, %ymm5
+        vpand	%ymm11, %ymm6, %ymm6
+        vpand	%ymm11, %ymm7, %ymm7
+        vpaddw	%ymm2, %ymm0, %ymm0
+        vpaddw	%ymm3, %ymm1, %ymm1
+        vpaddw	%ymm6, %ymm4, %ymm2
+        vpaddw	%ymm7, %ymm5, %ymm3
+        vpsubw	%ymm12, %ymm0, %ymm0
+        vpsubw	%ymm12, %ymm1, %ymm1
+        vpsubw	%ymm12, %ymm2, %ymm2
+        vpsubw	%ymm12, %ymm3, %ymm3
+        vpunpckldq	%ymm2, %ymm0, %ymm4
+        vpunpckldq	%ymm3, %ymm1, %ymm5
+        vpunpckhdq	%ymm2, %ymm0, %ymm6
+        vpunpckhdq	%ymm3, %ymm1, %ymm7
+        vperm2i128	$32, %ymm6, %ymm4, %ymm0
+        vperm2i128	$32, %ymm7, %ymm5, %ymm1
+        vperm2i128	$49, %ymm6, %ymm4, %ymm2
+        vperm2i128	$49, %ymm7, %ymm5, %ymm3
+        vmovdqu	%ymm0, 384(%rdi)
+        vmovdqu	%ymm2, 416(%rdi)
+        vmovdqu	%ymm1, 448(%rdi)
+        vmovdqu	%ymm3, 480(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_cbd_eta3_avx2,.-kyber_cbd_eta3_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_mask_55:
+.quad	0x5555555555555555, 0x5555555555555555
+.quad	0x5555555555555555, 0x5555555555555555
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_mask_33:
+.quad	0x3333333333333333, 0x3333333333333333
+.quad	0x3333333333333333, 0x3333333333333333
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_mask_03:
+.quad	0x303030303030303, 0x303030303030303
+.quad	0x303030303030303, 0x303030303030303
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_mask_0f:
+.quad	0xf0f0f0f0f0f0f0f, 0xf0f0f0f0f0f0f0f
+.quad	0xf0f0f0f0f0f0f0f, 0xf0f0f0f0f0f0f0f
+#ifndef __APPLE__
+.text
+.globl	kyber_cbd_eta2_avx2
+.type	kyber_cbd_eta2_avx2,@function
+.align	16
+kyber_cbd_eta2_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_cbd_eta2_avx2
+.p2align	4
+_kyber_cbd_eta2_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	L_kyber_mask_55(%rip), %ymm8
+        vmovdqu	L_kyber_mask_33(%rip), %ymm9
+        vmovdqu	L_kyber_mask_03(%rip), %ymm10
+        vmovdqu	L_kyber_mask_0f(%rip), %ymm11
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vpsrlw	$0x01, %ymm0, %ymm2
+        vpsrlw	$0x01, %ymm1, %ymm3
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpand	%ymm8, %ymm2, %ymm2
+        vpand	%ymm8, %ymm3, %ymm3
+        vpaddb	%ymm2, %ymm0, %ymm0
+        vpaddb	%ymm3, %ymm1, %ymm1
+        vpsrlw	$2, %ymm0, %ymm2
+        vpsrlw	$2, %ymm1, %ymm3
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpand	%ymm9, %ymm2, %ymm2
+        vpand	%ymm9, %ymm3, %ymm3
+        vpaddb	%ymm9, %ymm0, %ymm0
+        vpaddb	%ymm9, %ymm1, %ymm1
+        vpsubb	%ymm2, %ymm0, %ymm0
+        vpsubb	%ymm3, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpand	%ymm11, %ymm0, %ymm0
+        vpand	%ymm11, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpsubb	%ymm10, %ymm0, %ymm0
+        vpsubb	%ymm10, %ymm1, %ymm1
+        vpsubb	%ymm10, %ymm2, %ymm2
+        vpsubb	%ymm10, %ymm3, %ymm3
+        vpunpcklbw	%ymm2, %ymm0, %ymm4
+        vpunpcklbw	%ymm3, %ymm1, %ymm5
+        vpunpckhbw	%ymm2, %ymm0, %ymm6
+        vpunpckhbw	%ymm3, %ymm1, %ymm7
+        vpmovsxbw	%xmm4, %ymm0
+        vpmovsxbw	%xmm5, %ymm1
+        vextracti128	$0x01, %ymm4, %xmm2
+        vextracti128	$0x01, %ymm5, %xmm3
+        vpmovsxbw	%xmm2, %ymm2
+        vpmovsxbw	%xmm3, %ymm3
+        vpmovsxbw	%xmm6, %ymm4
+        vpmovsxbw	%xmm7, %ymm5
+        vextracti128	$0x01, %ymm6, %xmm6
+        vextracti128	$0x01, %ymm7, %xmm7
+        vpmovsxbw	%xmm6, %ymm6
+        vpmovsxbw	%xmm7, %ymm7
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm4, 32(%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm6, 96(%rdi)
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm5, 160(%rdi)
+        vmovdqu	%ymm3, 192(%rdi)
+        vmovdqu	%ymm7, 224(%rdi)
+        vmovdqu	64(%rsi), %ymm0
+        vmovdqu	96(%rsi), %ymm1
+        vpsrlw	$0x01, %ymm0, %ymm2
+        vpsrlw	$0x01, %ymm1, %ymm3
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpand	%ymm8, %ymm2, %ymm2
+        vpand	%ymm8, %ymm3, %ymm3
+        vpaddb	%ymm2, %ymm0, %ymm0
+        vpaddb	%ymm3, %ymm1, %ymm1
+        vpsrlw	$2, %ymm0, %ymm2
+        vpsrlw	$2, %ymm1, %ymm3
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpand	%ymm9, %ymm2, %ymm2
+        vpand	%ymm9, %ymm3, %ymm3
+        vpaddb	%ymm9, %ymm0, %ymm0
+        vpaddb	%ymm9, %ymm1, %ymm1
+        vpsubb	%ymm2, %ymm0, %ymm0
+        vpsubb	%ymm3, %ymm1, %ymm1
+        vpsrlw	$4, %ymm0, %ymm2
+        vpsrlw	$4, %ymm1, %ymm3
+        vpand	%ymm11, %ymm0, %ymm0
+        vpand	%ymm11, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpsubb	%ymm10, %ymm0, %ymm0
+        vpsubb	%ymm10, %ymm1, %ymm1
+        vpsubb	%ymm10, %ymm2, %ymm2
+        vpsubb	%ymm10, %ymm3, %ymm3
+        vpunpcklbw	%ymm2, %ymm0, %ymm4
+        vpunpcklbw	%ymm3, %ymm1, %ymm5
+        vpunpckhbw	%ymm2, %ymm0, %ymm6
+        vpunpckhbw	%ymm3, %ymm1, %ymm7
+        vpmovsxbw	%xmm4, %ymm0
+        vpmovsxbw	%xmm5, %ymm1
+        vextracti128	$0x01, %ymm4, %xmm2
+        vextracti128	$0x01, %ymm5, %xmm3
+        vpmovsxbw	%xmm2, %ymm2
+        vpmovsxbw	%xmm3, %ymm3
+        vpmovsxbw	%xmm6, %ymm4
+        vpmovsxbw	%xmm7, %ymm5
+        vextracti128	$0x01, %ymm6, %xmm6
+        vextracti128	$0x01, %ymm7, %xmm7
+        vpmovsxbw	%xmm6, %ymm6
+        vpmovsxbw	%xmm7, %ymm7
+        vmovdqu	%ymm0, 256(%rdi)
+        vmovdqu	%ymm4, 288(%rdi)
+        vmovdqu	%ymm2, 320(%rdi)
+        vmovdqu	%ymm6, 352(%rdi)
+        vmovdqu	%ymm1, 384(%rdi)
+        vmovdqu	%ymm5, 416(%rdi)
+        vmovdqu	%ymm3, 448(%rdi)
+        vmovdqu	%ymm7, 480(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_cbd_eta2_avx2,.-kyber_cbd_eta2_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_10_avx2_mask:
+.value	0x3ff,0x3ff
+.value	0x3ff,0x3ff
+.value	0x3ff,0x3ff
+.value	0x3ff,0x3ff
+.value	0x3ff,0x3ff
+.value	0x3ff,0x3ff
+.value	0x3ff,0x3ff
+.value	0x3ff,0x3ff
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_compress_10_avx2_shift:
+.quad	0x400000104000001, 0x400000104000001
+.quad	0x400000104000001, 0x400000104000001
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_compress_10_avx2_shlv:
+.quad	0xc, 0xc
+.quad	0xc, 0xc
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_10_avx2_shuf:
+.value	0x100,0x302
+.value	0x804,0xa09
+.value	0xc0b,0xffff
+.value	0xffff,0xffff
+.value	0xa09,0xc0b
+.value	0xffff,0xffff
+.value	0xffff,0x100
+.value	0x302,0x804
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_10_avx2_v:
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_10_avx2_offset:
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_10_avx2_shift12:
+.value	0x1000,0x1000
+.value	0x1000,0x1000
+.value	0x1000,0x1000
+.value	0x1000,0x1000
+.value	0x1000,0x1000
+.value	0x1000,0x1000
+.value	0x1000,0x1000
+.value	0x1000,0x1000
+#ifndef __APPLE__
+.text
+.globl	kyber_compress_10_avx2
+.type	kyber_compress_10_avx2,@function
+.align	16
+kyber_compress_10_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_compress_10_avx2
+.p2align	4
+_kyber_compress_10_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	L_kyber_compress_10_avx2_mask(%rip), %ymm9
+        vmovdqu	L_kyber_compress_10_avx2_shift(%rip), %ymm8
+        vmovdqu	L_kyber_compress_10_avx2_shlv(%rip), %ymm10
+        vmovdqu	L_kyber_compress_10_avx2_shuf(%rip), %ymm11
+        vmovdqu	L_kyber_compress_10_avx2_v(%rip), %ymm6
+        vmovdqu	L_kyber_compress_10_avx2_offset(%rip), %ymm12
+        vmovdqu	L_kyber_compress_10_avx2_shift12(%rip), %ymm13
+        vpsllw	$3, %ymm6, %ymm7
+L_kyber_compress_10_avx2_start:
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vpmullw	%ymm7, %ymm0, %ymm2
+        vpmullw	%ymm7, %ymm1, %ymm4
+        vpaddw	%ymm12, %ymm0, %ymm3
+        vpaddw	%ymm12, %ymm1, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm1, %ymm1
+        vpmulhuw	%ymm6, %ymm0, %ymm0
+        vpmulhuw	%ymm6, %ymm1, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm3, %ymm2, %ymm2
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm2, %ymm2
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm2, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm13, %ymm0, %ymm0
+        vpmulhrsw	%ymm13, %ymm1, %ymm1
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpmaddwd	%ymm8, %ymm0, %ymm0
+        vpmaddwd	%ymm8, %ymm1, %ymm1
+        vpsllvd	%ymm10, %ymm0, %ymm0
+        vpsllvd	%ymm10, %ymm1, %ymm1
+        vpsrlq	$12, %ymm0, %ymm0
+        vpsrlq	$12, %ymm1, %ymm1
+        vpshufb	%ymm11, %ymm0, %ymm0
+        vpshufb	%ymm11, %ymm1, %ymm1
+        vextracti128	$0x01, %ymm0, %xmm2
+        vextracti128	$0x01, %ymm1, %xmm4
+        vpblendw	$0xe0, %xmm2, %xmm0, %xmm0
+        vpblendw	$0xe0, %xmm4, %xmm1, %xmm1
+        vmovdqu	%xmm0, (%rdi)
+        vmovdqu	%xmm1, 20(%rdi)
+        vmovss	%xmm2, 16(%rdi)
+        vmovss	%xmm4, 36(%rdi)
+        vmovdqu	64(%rsi), %ymm0
+        vmovdqu	96(%rsi), %ymm1
+        vpmullw	%ymm7, %ymm0, %ymm2
+        vpmullw	%ymm7, %ymm1, %ymm4
+        vpaddw	%ymm12, %ymm0, %ymm3
+        vpaddw	%ymm12, %ymm1, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm1, %ymm1
+        vpmulhuw	%ymm6, %ymm0, %ymm0
+        vpmulhuw	%ymm6, %ymm1, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm3, %ymm2, %ymm2
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm2, %ymm2
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm2, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm13, %ymm0, %ymm0
+        vpmulhrsw	%ymm13, %ymm1, %ymm1
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpmaddwd	%ymm8, %ymm0, %ymm0
+        vpmaddwd	%ymm8, %ymm1, %ymm1
+        vpsllvd	%ymm10, %ymm0, %ymm0
+        vpsllvd	%ymm10, %ymm1, %ymm1
+        vpsrlq	$12, %ymm0, %ymm0
+        vpsrlq	$12, %ymm1, %ymm1
+        vpshufb	%ymm11, %ymm0, %ymm0
+        vpshufb	%ymm11, %ymm1, %ymm1
+        vextracti128	$0x01, %ymm0, %xmm2
+        vextracti128	$0x01, %ymm1, %xmm4
+        vpblendw	$0xe0, %xmm2, %xmm0, %xmm0
+        vpblendw	$0xe0, %xmm4, %xmm1, %xmm1
+        vmovdqu	%xmm0, 40(%rdi)
+        vmovdqu	%xmm1, 60(%rdi)
+        vmovss	%xmm2, 56(%rdi)
+        vmovss	%xmm4, 76(%rdi)
+        vmovdqu	128(%rsi), %ymm0
+        vmovdqu	160(%rsi), %ymm1
+        vpmullw	%ymm7, %ymm0, %ymm2
+        vpmullw	%ymm7, %ymm1, %ymm4
+        vpaddw	%ymm12, %ymm0, %ymm3
+        vpaddw	%ymm12, %ymm1, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm1, %ymm1
+        vpmulhuw	%ymm6, %ymm0, %ymm0
+        vpmulhuw	%ymm6, %ymm1, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm3, %ymm2, %ymm2
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm2, %ymm2
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm2, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm13, %ymm0, %ymm0
+        vpmulhrsw	%ymm13, %ymm1, %ymm1
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpmaddwd	%ymm8, %ymm0, %ymm0
+        vpmaddwd	%ymm8, %ymm1, %ymm1
+        vpsllvd	%ymm10, %ymm0, %ymm0
+        vpsllvd	%ymm10, %ymm1, %ymm1
+        vpsrlq	$12, %ymm0, %ymm0
+        vpsrlq	$12, %ymm1, %ymm1
+        vpshufb	%ymm11, %ymm0, %ymm0
+        vpshufb	%ymm11, %ymm1, %ymm1
+        vextracti128	$0x01, %ymm0, %xmm2
+        vextracti128	$0x01, %ymm1, %xmm4
+        vpblendw	$0xe0, %xmm2, %xmm0, %xmm0
+        vpblendw	$0xe0, %xmm4, %xmm1, %xmm1
+        vmovdqu	%xmm0, 80(%rdi)
+        vmovdqu	%xmm1, 100(%rdi)
+        vmovss	%xmm2, 96(%rdi)
+        vmovss	%xmm4, 116(%rdi)
+        vmovdqu	192(%rsi), %ymm0
+        vmovdqu	224(%rsi), %ymm1
+        vpmullw	%ymm7, %ymm0, %ymm2
+        vpmullw	%ymm7, %ymm1, %ymm4
+        vpaddw	%ymm12, %ymm0, %ymm3
+        vpaddw	%ymm12, %ymm1, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm1, %ymm1
+        vpmulhuw	%ymm6, %ymm0, %ymm0
+        vpmulhuw	%ymm6, %ymm1, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm3, %ymm2, %ymm2
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm2, %ymm2
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm2, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm13, %ymm0, %ymm0
+        vpmulhrsw	%ymm13, %ymm1, %ymm1
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpmaddwd	%ymm8, %ymm0, %ymm0
+        vpmaddwd	%ymm8, %ymm1, %ymm1
+        vpsllvd	%ymm10, %ymm0, %ymm0
+        vpsllvd	%ymm10, %ymm1, %ymm1
+        vpsrlq	$12, %ymm0, %ymm0
+        vpsrlq	$12, %ymm1, %ymm1
+        vpshufb	%ymm11, %ymm0, %ymm0
+        vpshufb	%ymm11, %ymm1, %ymm1
+        vextracti128	$0x01, %ymm0, %xmm2
+        vextracti128	$0x01, %ymm1, %xmm4
+        vpblendw	$0xe0, %xmm2, %xmm0, %xmm0
+        vpblendw	$0xe0, %xmm4, %xmm1, %xmm1
+        vmovdqu	%xmm0, 120(%rdi)
+        vmovdqu	%xmm1, 140(%rdi)
+        vmovss	%xmm2, 136(%rdi)
+        vmovss	%xmm4, 156(%rdi)
+        vmovdqu	256(%rsi), %ymm0
+        vmovdqu	288(%rsi), %ymm1
+        vpmullw	%ymm7, %ymm0, %ymm2
+        vpmullw	%ymm7, %ymm1, %ymm4
+        vpaddw	%ymm12, %ymm0, %ymm3
+        vpaddw	%ymm12, %ymm1, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm1, %ymm1
+        vpmulhuw	%ymm6, %ymm0, %ymm0
+        vpmulhuw	%ymm6, %ymm1, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm3, %ymm2, %ymm2
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm2, %ymm2
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm2, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm13, %ymm0, %ymm0
+        vpmulhrsw	%ymm13, %ymm1, %ymm1
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpmaddwd	%ymm8, %ymm0, %ymm0
+        vpmaddwd	%ymm8, %ymm1, %ymm1
+        vpsllvd	%ymm10, %ymm0, %ymm0
+        vpsllvd	%ymm10, %ymm1, %ymm1
+        vpsrlq	$12, %ymm0, %ymm0
+        vpsrlq	$12, %ymm1, %ymm1
+        vpshufb	%ymm11, %ymm0, %ymm0
+        vpshufb	%ymm11, %ymm1, %ymm1
+        vextracti128	$0x01, %ymm0, %xmm2
+        vextracti128	$0x01, %ymm1, %xmm4
+        vpblendw	$0xe0, %xmm2, %xmm0, %xmm0
+        vpblendw	$0xe0, %xmm4, %xmm1, %xmm1
+        vmovdqu	%xmm0, 160(%rdi)
+        vmovdqu	%xmm1, 180(%rdi)
+        vmovss	%xmm2, 176(%rdi)
+        vmovss	%xmm4, 196(%rdi)
+        vmovdqu	320(%rsi), %ymm0
+        vmovdqu	352(%rsi), %ymm1
+        vpmullw	%ymm7, %ymm0, %ymm2
+        vpmullw	%ymm7, %ymm1, %ymm4
+        vpaddw	%ymm12, %ymm0, %ymm3
+        vpaddw	%ymm12, %ymm1, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm1, %ymm1
+        vpmulhuw	%ymm6, %ymm0, %ymm0
+        vpmulhuw	%ymm6, %ymm1, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm3, %ymm2, %ymm2
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm2, %ymm2
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm2, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm13, %ymm0, %ymm0
+        vpmulhrsw	%ymm13, %ymm1, %ymm1
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpmaddwd	%ymm8, %ymm0, %ymm0
+        vpmaddwd	%ymm8, %ymm1, %ymm1
+        vpsllvd	%ymm10, %ymm0, %ymm0
+        vpsllvd	%ymm10, %ymm1, %ymm1
+        vpsrlq	$12, %ymm0, %ymm0
+        vpsrlq	$12, %ymm1, %ymm1
+        vpshufb	%ymm11, %ymm0, %ymm0
+        vpshufb	%ymm11, %ymm1, %ymm1
+        vextracti128	$0x01, %ymm0, %xmm2
+        vextracti128	$0x01, %ymm1, %xmm4
+        vpblendw	$0xe0, %xmm2, %xmm0, %xmm0
+        vpblendw	$0xe0, %xmm4, %xmm1, %xmm1
+        vmovdqu	%xmm0, 200(%rdi)
+        vmovdqu	%xmm1, 220(%rdi)
+        vmovss	%xmm2, 216(%rdi)
+        vmovss	%xmm4, 236(%rdi)
+        vmovdqu	384(%rsi), %ymm0
+        vmovdqu	416(%rsi), %ymm1
+        vpmullw	%ymm7, %ymm0, %ymm2
+        vpmullw	%ymm7, %ymm1, %ymm4
+        vpaddw	%ymm12, %ymm0, %ymm3
+        vpaddw	%ymm12, %ymm1, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm1, %ymm1
+        vpmulhuw	%ymm6, %ymm0, %ymm0
+        vpmulhuw	%ymm6, %ymm1, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm3, %ymm2, %ymm2
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm2, %ymm2
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm2, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm13, %ymm0, %ymm0
+        vpmulhrsw	%ymm13, %ymm1, %ymm1
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpmaddwd	%ymm8, %ymm0, %ymm0
+        vpmaddwd	%ymm8, %ymm1, %ymm1
+        vpsllvd	%ymm10, %ymm0, %ymm0
+        vpsllvd	%ymm10, %ymm1, %ymm1
+        vpsrlq	$12, %ymm0, %ymm0
+        vpsrlq	$12, %ymm1, %ymm1
+        vpshufb	%ymm11, %ymm0, %ymm0
+        vpshufb	%ymm11, %ymm1, %ymm1
+        vextracti128	$0x01, %ymm0, %xmm2
+        vextracti128	$0x01, %ymm1, %xmm4
+        vpblendw	$0xe0, %xmm2, %xmm0, %xmm0
+        vpblendw	$0xe0, %xmm4, %xmm1, %xmm1
+        vmovdqu	%xmm0, 240(%rdi)
+        vmovdqu	%xmm1, 260(%rdi)
+        vmovss	%xmm2, 256(%rdi)
+        vmovss	%xmm4, 276(%rdi)
+        vmovdqu	448(%rsi), %ymm0
+        vmovdqu	480(%rsi), %ymm1
+        vpmullw	%ymm7, %ymm0, %ymm2
+        vpmullw	%ymm7, %ymm1, %ymm4
+        vpaddw	%ymm12, %ymm0, %ymm3
+        vpaddw	%ymm12, %ymm1, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm1, %ymm1
+        vpmulhuw	%ymm6, %ymm0, %ymm0
+        vpmulhuw	%ymm6, %ymm1, %ymm1
+        vpsubw	%ymm3, %ymm2, %ymm3
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm3, %ymm2, %ymm2
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm2, %ymm2
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm2, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm13, %ymm0, %ymm0
+        vpmulhrsw	%ymm13, %ymm1, %ymm1
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpmaddwd	%ymm8, %ymm0, %ymm0
+        vpmaddwd	%ymm8, %ymm1, %ymm1
+        vpsllvd	%ymm10, %ymm0, %ymm0
+        vpsllvd	%ymm10, %ymm1, %ymm1
+        vpsrlq	$12, %ymm0, %ymm0
+        vpsrlq	$12, %ymm1, %ymm1
+        vpshufb	%ymm11, %ymm0, %ymm0
+        vpshufb	%ymm11, %ymm1, %ymm1
+        vextracti128	$0x01, %ymm0, %xmm2
+        vextracti128	$0x01, %ymm1, %xmm4
+        vpblendw	$0xe0, %xmm2, %xmm0, %xmm0
+        vpblendw	$0xe0, %xmm4, %xmm1, %xmm1
+        vmovdqu	%xmm0, 280(%rdi)
+        vmovdqu	%xmm1, 300(%rdi)
+        vmovss	%xmm2, 296(%rdi)
+        vmovss	%xmm4, 316(%rdi)
+        addq	$0x140, %rdi
+        addq	$0x200, %rsi
+        subl	$0x01, %edx
+        jg	L_kyber_compress_10_avx2_start
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_compress_10_avx2,.-kyber_compress_10_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_decompress_10_avx2_mask:
+.long	0x7fe01ff8,0x7fe01ff8,0x7fe01ff8,0x7fe01ff8
+.long	0x7fe01ff8,0x7fe01ff8,0x7fe01ff8,0x7fe01ff8
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_decompress_10_avx2_sllv:
+.quad	0x4, 0x4
+.quad	0x4, 0x4
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_decompress_10_avx2_q:
+.long	0xd013404,0xd013404,0xd013404,0xd013404
+.long	0xd013404,0xd013404,0xd013404,0xd013404
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_10_avx2_shuf:
+.value	0x100,0x201
+.value	0x302,0x403
+.value	0x605,0x706
+.value	0x807,0x908
+.value	0x302,0x403
+.value	0x504,0x605
+.value	0x807,0x908
+.value	0xa09,0xb0a
+#ifndef __APPLE__
+.text
+.globl	kyber_decompress_10_avx2
+.type	kyber_decompress_10_avx2,@function
+.align	16
+kyber_decompress_10_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_decompress_10_avx2
+.p2align	4
+_kyber_decompress_10_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	L_kyber_decompress_10_avx2_mask(%rip), %ymm4
+        vmovdqu	L_kyber_decompress_10_avx2_q(%rip), %ymm5
+        vmovdqu	L_kyber_decompress_10_avx2_shuf(%rip), %ymm6
+        vmovdqu	L_kyber_decompress_10_avx2_sllv(%rip), %ymm7
+L_kyber_decompress_10_avx2_start:
+        vpermq	$0x94, (%rsi), %ymm0
+        vpermq	$0x94, 20(%rsi), %ymm1
+        vpermq	$0x94, 40(%rsi), %ymm2
+        vpermq	$0x94, 60(%rsi), %ymm3
+        vpshufb	%ymm6, %ymm0, %ymm0
+        vpshufb	%ymm6, %ymm1, %ymm1
+        vpshufb	%ymm6, %ymm2, %ymm2
+        vpshufb	%ymm6, %ymm3, %ymm3
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm1, %ymm1
+        vpsllvd	%ymm7, %ymm2, %ymm2
+        vpsllvd	%ymm7, %ymm3, %ymm3
+        vpsrlw	$0x01, %ymm0, %ymm0
+        vpsrlw	$0x01, %ymm1, %ymm1
+        vpsrlw	$0x01, %ymm2, %ymm2
+        vpsrlw	$0x01, %ymm3, %ymm3
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpand	%ymm4, %ymm2, %ymm2
+        vpand	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm5, %ymm0, %ymm0
+        vpmulhrsw	%ymm5, %ymm1, %ymm1
+        vpmulhrsw	%ymm5, %ymm2, %ymm2
+        vpmulhrsw	%ymm5, %ymm3, %ymm3
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, 96(%rdi)
+        vpermq	$0x94, 80(%rsi), %ymm0
+        vpermq	$0x94, 100(%rsi), %ymm1
+        vpermq	$0x94, 120(%rsi), %ymm2
+        vpermq	$0x94, 140(%rsi), %ymm3
+        vpshufb	%ymm6, %ymm0, %ymm0
+        vpshufb	%ymm6, %ymm1, %ymm1
+        vpshufb	%ymm6, %ymm2, %ymm2
+        vpshufb	%ymm6, %ymm3, %ymm3
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm1, %ymm1
+        vpsllvd	%ymm7, %ymm2, %ymm2
+        vpsllvd	%ymm7, %ymm3, %ymm3
+        vpsrlw	$0x01, %ymm0, %ymm0
+        vpsrlw	$0x01, %ymm1, %ymm1
+        vpsrlw	$0x01, %ymm2, %ymm2
+        vpsrlw	$0x01, %ymm3, %ymm3
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpand	%ymm4, %ymm2, %ymm2
+        vpand	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm5, %ymm0, %ymm0
+        vpmulhrsw	%ymm5, %ymm1, %ymm1
+        vpmulhrsw	%ymm5, %ymm2, %ymm2
+        vpmulhrsw	%ymm5, %ymm3, %ymm3
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, 160(%rdi)
+        vmovdqu	%ymm2, 192(%rdi)
+        vmovdqu	%ymm3, 224(%rdi)
+        vpermq	$0x94, 160(%rsi), %ymm0
+        vpermq	$0x94, 180(%rsi), %ymm1
+        vpermq	$0x94, 200(%rsi), %ymm2
+        vpermq	$0x94, 220(%rsi), %ymm3
+        vpshufb	%ymm6, %ymm0, %ymm0
+        vpshufb	%ymm6, %ymm1, %ymm1
+        vpshufb	%ymm6, %ymm2, %ymm2
+        vpshufb	%ymm6, %ymm3, %ymm3
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm1, %ymm1
+        vpsllvd	%ymm7, %ymm2, %ymm2
+        vpsllvd	%ymm7, %ymm3, %ymm3
+        vpsrlw	$0x01, %ymm0, %ymm0
+        vpsrlw	$0x01, %ymm1, %ymm1
+        vpsrlw	$0x01, %ymm2, %ymm2
+        vpsrlw	$0x01, %ymm3, %ymm3
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpand	%ymm4, %ymm2, %ymm2
+        vpand	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm5, %ymm0, %ymm0
+        vpmulhrsw	%ymm5, %ymm1, %ymm1
+        vpmulhrsw	%ymm5, %ymm2, %ymm2
+        vpmulhrsw	%ymm5, %ymm3, %ymm3
+        vmovdqu	%ymm0, 256(%rdi)
+        vmovdqu	%ymm1, 288(%rdi)
+        vmovdqu	%ymm2, 320(%rdi)
+        vmovdqu	%ymm3, 352(%rdi)
+        vpermq	$0x94, 240(%rsi), %ymm0
+        vpermq	$0x94, 260(%rsi), %ymm1
+        vpermq	$0x94, 280(%rsi), %ymm2
+        vpermq	$0x94, 300(%rsi), %ymm3
+        vpshufb	%ymm6, %ymm0, %ymm0
+        vpshufb	%ymm6, %ymm1, %ymm1
+        vpshufb	%ymm6, %ymm2, %ymm2
+        vpshufb	%ymm6, %ymm3, %ymm3
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm1, %ymm1
+        vpsllvd	%ymm7, %ymm2, %ymm2
+        vpsllvd	%ymm7, %ymm3, %ymm3
+        vpsrlw	$0x01, %ymm0, %ymm0
+        vpsrlw	$0x01, %ymm1, %ymm1
+        vpsrlw	$0x01, %ymm2, %ymm2
+        vpsrlw	$0x01, %ymm3, %ymm3
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpand	%ymm4, %ymm2, %ymm2
+        vpand	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm5, %ymm0, %ymm0
+        vpmulhrsw	%ymm5, %ymm1, %ymm1
+        vpmulhrsw	%ymm5, %ymm2, %ymm2
+        vpmulhrsw	%ymm5, %ymm3, %ymm3
+        vmovdqu	%ymm0, 384(%rdi)
+        vmovdqu	%ymm1, 416(%rdi)
+        vmovdqu	%ymm2, 448(%rdi)
+        vmovdqu	%ymm3, 480(%rdi)
+        addq	$0x140, %rsi
+        addq	$0x200, %rdi
+        subl	$0x01, %edx
+        jg	L_kyber_decompress_10_avx2_start
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_decompress_10_avx2,.-kyber_decompress_10_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_11_avx2_v:
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_11_avx2_off:
+.value	0x24,0x24
+.value	0x24,0x24
+.value	0x24,0x24
+.value	0x24,0x24
+.value	0x24,0x24
+.value	0x24,0x24
+.value	0x24,0x24
+.value	0x24,0x24
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_11_avx2_shift13:
+.value	0x2000,0x2000
+.value	0x2000,0x2000
+.value	0x2000,0x2000
+.value	0x2000,0x2000
+.value	0x2000,0x2000
+.value	0x2000,0x2000
+.value	0x2000,0x2000
+.value	0x2000,0x2000
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_11_avx2_mask:
+.value	0x7ff,0x7ff
+.value	0x7ff,0x7ff
+.value	0x7ff,0x7ff
+.value	0x7ff,0x7ff
+.value	0x7ff,0x7ff
+.value	0x7ff,0x7ff
+.value	0x7ff,0x7ff
+.value	0x7ff,0x7ff
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_compress_11_avx2_shift:
+.quad	0x800000108000001, 0x800000108000001
+.quad	0x800000108000001, 0x800000108000001
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_compress_11_avx2_sllvd:
+.long	0xa,0x0,0xa,0x0
+.long	0xa,0x0,0xa,0x0
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_compress_11_avx2_srlvq:
+.quad	0xa, 0x1e
+.quad	0xa, 0x1e
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_11_avx2_shuf:
+.value	0x100,0x302
+.value	0x504,0x706
+.value	0x908,0xff0a
+.value	0xffff,0xffff
+.value	0x605,0x807
+.value	0xa09,0xffff
+.value	0xffff,0x0
+.value	0x201,0x403
+#ifndef __APPLE__
+.text
+.globl	kyber_compress_11_avx2
+.type	kyber_compress_11_avx2,@function
+.align	16
+kyber_compress_11_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_compress_11_avx2
+.p2align	4
+_kyber_compress_11_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	L_kyber_compress_11_avx2_v(%rip), %ymm7
+        vmovdqu	L_kyber_compress_11_avx2_off(%rip), %ymm8
+        vmovdqu	L_kyber_compress_11_avx2_shift13(%rip), %ymm9
+        vmovdqu	L_kyber_compress_11_avx2_mask(%rip), %ymm10
+        vmovdqu	L_kyber_compress_11_avx2_shift(%rip), %ymm11
+        vmovdqu	L_kyber_compress_11_avx2_sllvd(%rip), %ymm12
+        vmovdqu	L_kyber_compress_11_avx2_srlvq(%rip), %ymm13
+        vmovdqu	L_kyber_compress_11_avx2_shuf(%rip), %ymm14
+        vpsllw	$3, %ymm7, %ymm6
+L_kyber_compress_11_avx2_start:
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm3
+        vpmullw	%ymm6, %ymm0, %ymm1
+        vpmullw	%ymm6, %ymm3, %ymm4
+        vpaddw	%ymm8, %ymm0, %ymm2
+        vpaddw	%ymm8, %ymm3, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm3, %ymm3
+        vpmulhw	%ymm7, %ymm0, %ymm0
+        vpmulhw	%ymm7, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm1, %ymm2
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm2, %ymm1, %ymm1
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm1, %ymm1
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm3, %ymm3
+        vpmaddwd	%ymm11, %ymm0, %ymm0
+        vpmaddwd	%ymm11, %ymm3, %ymm3
+        vpsllvd	%ymm12, %ymm0, %ymm0
+        vpsllvd	%ymm12, %ymm3, %ymm3
+        vpsrldq	$8, %ymm0, %ymm1
+        vpsrldq	$8, %ymm3, %ymm4
+        vpsrlvq	%ymm13, %ymm0, %ymm0
+        vpsrlvq	%ymm13, %ymm3, %ymm3
+        vpsllq	$34, %ymm1, %ymm1
+        vpsllq	$34, %ymm4, %ymm4
+        vpaddq	%ymm1, %ymm0, %ymm0
+        vpaddq	%ymm4, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vextracti128	$0x01, %ymm0, %xmm1
+        vextracti128	$0x01, %ymm3, %xmm4
+        vpblendvb	%xmm14, %xmm1, %xmm0, %xmm0
+        vpblendvb	%xmm14, %xmm4, %xmm3, %xmm3
+        vmovdqu	%xmm0, (%rdi)
+        vmovq	%xmm1, 16(%rdi)
+        vmovdqu	%xmm3, 22(%rdi)
+        vmovq	%xmm4, 38(%rdi)
+        vmovdqu	64(%rsi), %ymm0
+        vmovdqu	96(%rsi), %ymm3
+        vpmullw	%ymm6, %ymm0, %ymm1
+        vpmullw	%ymm6, %ymm3, %ymm4
+        vpaddw	%ymm8, %ymm0, %ymm2
+        vpaddw	%ymm8, %ymm3, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm3, %ymm3
+        vpmulhw	%ymm7, %ymm0, %ymm0
+        vpmulhw	%ymm7, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm1, %ymm2
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm2, %ymm1, %ymm1
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm1, %ymm1
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm3, %ymm3
+        vpmaddwd	%ymm11, %ymm0, %ymm0
+        vpmaddwd	%ymm11, %ymm3, %ymm3
+        vpsllvd	%ymm12, %ymm0, %ymm0
+        vpsllvd	%ymm12, %ymm3, %ymm3
+        vpsrldq	$8, %ymm0, %ymm1
+        vpsrldq	$8, %ymm3, %ymm4
+        vpsrlvq	%ymm13, %ymm0, %ymm0
+        vpsrlvq	%ymm13, %ymm3, %ymm3
+        vpsllq	$34, %ymm1, %ymm1
+        vpsllq	$34, %ymm4, %ymm4
+        vpaddq	%ymm1, %ymm0, %ymm0
+        vpaddq	%ymm4, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vextracti128	$0x01, %ymm0, %xmm1
+        vextracti128	$0x01, %ymm3, %xmm4
+        vpblendvb	%xmm14, %xmm1, %xmm0, %xmm0
+        vpblendvb	%xmm14, %xmm4, %xmm3, %xmm3
+        vmovdqu	%xmm0, 44(%rdi)
+        vmovq	%xmm1, 60(%rdi)
+        vmovdqu	%xmm3, 66(%rdi)
+        vmovq	%xmm4, 82(%rdi)
+        vmovdqu	128(%rsi), %ymm0
+        vmovdqu	160(%rsi), %ymm3
+        vpmullw	%ymm6, %ymm0, %ymm1
+        vpmullw	%ymm6, %ymm3, %ymm4
+        vpaddw	%ymm8, %ymm0, %ymm2
+        vpaddw	%ymm8, %ymm3, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm3, %ymm3
+        vpmulhw	%ymm7, %ymm0, %ymm0
+        vpmulhw	%ymm7, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm1, %ymm2
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm2, %ymm1, %ymm1
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm1, %ymm1
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm3, %ymm3
+        vpmaddwd	%ymm11, %ymm0, %ymm0
+        vpmaddwd	%ymm11, %ymm3, %ymm3
+        vpsllvd	%ymm12, %ymm0, %ymm0
+        vpsllvd	%ymm12, %ymm3, %ymm3
+        vpsrldq	$8, %ymm0, %ymm1
+        vpsrldq	$8, %ymm3, %ymm4
+        vpsrlvq	%ymm13, %ymm0, %ymm0
+        vpsrlvq	%ymm13, %ymm3, %ymm3
+        vpsllq	$34, %ymm1, %ymm1
+        vpsllq	$34, %ymm4, %ymm4
+        vpaddq	%ymm1, %ymm0, %ymm0
+        vpaddq	%ymm4, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vextracti128	$0x01, %ymm0, %xmm1
+        vextracti128	$0x01, %ymm3, %xmm4
+        vpblendvb	%xmm14, %xmm1, %xmm0, %xmm0
+        vpblendvb	%xmm14, %xmm4, %xmm3, %xmm3
+        vmovdqu	%xmm0, 88(%rdi)
+        vmovq	%xmm1, 104(%rdi)
+        vmovdqu	%xmm3, 110(%rdi)
+        vmovq	%xmm4, 126(%rdi)
+        vmovdqu	192(%rsi), %ymm0
+        vmovdqu	224(%rsi), %ymm3
+        vpmullw	%ymm6, %ymm0, %ymm1
+        vpmullw	%ymm6, %ymm3, %ymm4
+        vpaddw	%ymm8, %ymm0, %ymm2
+        vpaddw	%ymm8, %ymm3, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm3, %ymm3
+        vpmulhw	%ymm7, %ymm0, %ymm0
+        vpmulhw	%ymm7, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm1, %ymm2
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm2, %ymm1, %ymm1
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm1, %ymm1
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm3, %ymm3
+        vpmaddwd	%ymm11, %ymm0, %ymm0
+        vpmaddwd	%ymm11, %ymm3, %ymm3
+        vpsllvd	%ymm12, %ymm0, %ymm0
+        vpsllvd	%ymm12, %ymm3, %ymm3
+        vpsrldq	$8, %ymm0, %ymm1
+        vpsrldq	$8, %ymm3, %ymm4
+        vpsrlvq	%ymm13, %ymm0, %ymm0
+        vpsrlvq	%ymm13, %ymm3, %ymm3
+        vpsllq	$34, %ymm1, %ymm1
+        vpsllq	$34, %ymm4, %ymm4
+        vpaddq	%ymm1, %ymm0, %ymm0
+        vpaddq	%ymm4, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vextracti128	$0x01, %ymm0, %xmm1
+        vextracti128	$0x01, %ymm3, %xmm4
+        vpblendvb	%xmm14, %xmm1, %xmm0, %xmm0
+        vpblendvb	%xmm14, %xmm4, %xmm3, %xmm3
+        vmovdqu	%xmm0, 132(%rdi)
+        vmovq	%xmm1, 148(%rdi)
+        vmovdqu	%xmm3, 154(%rdi)
+        vmovq	%xmm4, 170(%rdi)
+        vmovdqu	256(%rsi), %ymm0
+        vmovdqu	288(%rsi), %ymm3
+        vpmullw	%ymm6, %ymm0, %ymm1
+        vpmullw	%ymm6, %ymm3, %ymm4
+        vpaddw	%ymm8, %ymm0, %ymm2
+        vpaddw	%ymm8, %ymm3, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm3, %ymm3
+        vpmulhw	%ymm7, %ymm0, %ymm0
+        vpmulhw	%ymm7, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm1, %ymm2
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm2, %ymm1, %ymm1
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm1, %ymm1
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm3, %ymm3
+        vpmaddwd	%ymm11, %ymm0, %ymm0
+        vpmaddwd	%ymm11, %ymm3, %ymm3
+        vpsllvd	%ymm12, %ymm0, %ymm0
+        vpsllvd	%ymm12, %ymm3, %ymm3
+        vpsrldq	$8, %ymm0, %ymm1
+        vpsrldq	$8, %ymm3, %ymm4
+        vpsrlvq	%ymm13, %ymm0, %ymm0
+        vpsrlvq	%ymm13, %ymm3, %ymm3
+        vpsllq	$34, %ymm1, %ymm1
+        vpsllq	$34, %ymm4, %ymm4
+        vpaddq	%ymm1, %ymm0, %ymm0
+        vpaddq	%ymm4, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vextracti128	$0x01, %ymm0, %xmm1
+        vextracti128	$0x01, %ymm3, %xmm4
+        vpblendvb	%xmm14, %xmm1, %xmm0, %xmm0
+        vpblendvb	%xmm14, %xmm4, %xmm3, %xmm3
+        vmovdqu	%xmm0, 176(%rdi)
+        vmovq	%xmm1, 192(%rdi)
+        vmovdqu	%xmm3, 198(%rdi)
+        vmovq	%xmm4, 214(%rdi)
+        vmovdqu	320(%rsi), %ymm0
+        vmovdqu	352(%rsi), %ymm3
+        vpmullw	%ymm6, %ymm0, %ymm1
+        vpmullw	%ymm6, %ymm3, %ymm4
+        vpaddw	%ymm8, %ymm0, %ymm2
+        vpaddw	%ymm8, %ymm3, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm3, %ymm3
+        vpmulhw	%ymm7, %ymm0, %ymm0
+        vpmulhw	%ymm7, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm1, %ymm2
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm2, %ymm1, %ymm1
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm1, %ymm1
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm3, %ymm3
+        vpmaddwd	%ymm11, %ymm0, %ymm0
+        vpmaddwd	%ymm11, %ymm3, %ymm3
+        vpsllvd	%ymm12, %ymm0, %ymm0
+        vpsllvd	%ymm12, %ymm3, %ymm3
+        vpsrldq	$8, %ymm0, %ymm1
+        vpsrldq	$8, %ymm3, %ymm4
+        vpsrlvq	%ymm13, %ymm0, %ymm0
+        vpsrlvq	%ymm13, %ymm3, %ymm3
+        vpsllq	$34, %ymm1, %ymm1
+        vpsllq	$34, %ymm4, %ymm4
+        vpaddq	%ymm1, %ymm0, %ymm0
+        vpaddq	%ymm4, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vextracti128	$0x01, %ymm0, %xmm1
+        vextracti128	$0x01, %ymm3, %xmm4
+        vpblendvb	%xmm14, %xmm1, %xmm0, %xmm0
+        vpblendvb	%xmm14, %xmm4, %xmm3, %xmm3
+        vmovdqu	%xmm0, 220(%rdi)
+        vmovq	%xmm1, 236(%rdi)
+        vmovdqu	%xmm3, 242(%rdi)
+        vmovq	%xmm4, 258(%rdi)
+        vmovdqu	384(%rsi), %ymm0
+        vmovdqu	416(%rsi), %ymm3
+        vpmullw	%ymm6, %ymm0, %ymm1
+        vpmullw	%ymm6, %ymm3, %ymm4
+        vpaddw	%ymm8, %ymm0, %ymm2
+        vpaddw	%ymm8, %ymm3, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm3, %ymm3
+        vpmulhw	%ymm7, %ymm0, %ymm0
+        vpmulhw	%ymm7, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm1, %ymm2
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm2, %ymm1, %ymm1
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm1, %ymm1
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm3, %ymm3
+        vpmaddwd	%ymm11, %ymm0, %ymm0
+        vpmaddwd	%ymm11, %ymm3, %ymm3
+        vpsllvd	%ymm12, %ymm0, %ymm0
+        vpsllvd	%ymm12, %ymm3, %ymm3
+        vpsrldq	$8, %ymm0, %ymm1
+        vpsrldq	$8, %ymm3, %ymm4
+        vpsrlvq	%ymm13, %ymm0, %ymm0
+        vpsrlvq	%ymm13, %ymm3, %ymm3
+        vpsllq	$34, %ymm1, %ymm1
+        vpsllq	$34, %ymm4, %ymm4
+        vpaddq	%ymm1, %ymm0, %ymm0
+        vpaddq	%ymm4, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vextracti128	$0x01, %ymm0, %xmm1
+        vextracti128	$0x01, %ymm3, %xmm4
+        vpblendvb	%xmm14, %xmm1, %xmm0, %xmm0
+        vpblendvb	%xmm14, %xmm4, %xmm3, %xmm3
+        vmovdqu	%xmm0, 264(%rdi)
+        vmovq	%xmm1, 280(%rdi)
+        vmovdqu	%xmm3, 286(%rdi)
+        vmovq	%xmm4, 302(%rdi)
+        vmovdqu	448(%rsi), %ymm0
+        vmovdqu	480(%rsi), %ymm3
+        vpmullw	%ymm6, %ymm0, %ymm1
+        vpmullw	%ymm6, %ymm3, %ymm4
+        vpaddw	%ymm8, %ymm0, %ymm2
+        vpaddw	%ymm8, %ymm3, %ymm5
+        vpsllw	$3, %ymm0, %ymm0
+        vpsllw	$3, %ymm3, %ymm3
+        vpmulhw	%ymm7, %ymm0, %ymm0
+        vpmulhw	%ymm7, %ymm3, %ymm3
+        vpsubw	%ymm2, %ymm1, %ymm2
+        vpsubw	%ymm5, %ymm4, %ymm5
+        vpandn	%ymm2, %ymm1, %ymm1
+        vpandn	%ymm5, %ymm4, %ymm4
+        vpsrlw	$15, %ymm1, %ymm1
+        vpsrlw	$15, %ymm4, %ymm4
+        vpsubw	%ymm1, %ymm0, %ymm0
+        vpsubw	%ymm4, %ymm3, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm10, %ymm0, %ymm0
+        vpand	%ymm10, %ymm3, %ymm3
+        vpmaddwd	%ymm11, %ymm0, %ymm0
+        vpmaddwd	%ymm11, %ymm3, %ymm3
+        vpsllvd	%ymm12, %ymm0, %ymm0
+        vpsllvd	%ymm12, %ymm3, %ymm3
+        vpsrldq	$8, %ymm0, %ymm1
+        vpsrldq	$8, %ymm3, %ymm4
+        vpsrlvq	%ymm13, %ymm0, %ymm0
+        vpsrlvq	%ymm13, %ymm3, %ymm3
+        vpsllq	$34, %ymm1, %ymm1
+        vpsllq	$34, %ymm4, %ymm4
+        vpaddq	%ymm1, %ymm0, %ymm0
+        vpaddq	%ymm4, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vextracti128	$0x01, %ymm0, %xmm1
+        vextracti128	$0x01, %ymm3, %xmm4
+        vpblendvb	%xmm14, %xmm1, %xmm0, %xmm0
+        vpblendvb	%xmm14, %xmm4, %xmm3, %xmm3
+        vmovdqu	%xmm0, 308(%rdi)
+        vmovq	%xmm1, 324(%rdi)
+        vmovdqu	%xmm3, 330(%rdi)
+        vmovq	%xmm4, 346(%rdi)
+        addq	$0x160, %rdi
+        addq	$0x200, %rsi
+        subl	$0x01, %edx
+        jg	L_kyber_compress_11_avx2_start
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_compress_11_avx2,.-kyber_compress_11_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_11_avx2_q:
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_11_avx2_shuf:
+.value	0x100,0x201
+.value	0x302,0x504
+.value	0x605,0x706
+.value	0x908,0xa09
+.value	0x403,0x504
+.value	0x605,0x807
+.value	0x908,0xa09
+.value	0xc0b,0xd0c
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_decompress_11_avx2_sllv:
+.long	0x0,0x1,0x0,0x0
+.long	0x0,0x1,0x0,0x0
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_decompress_11_avx2_srlv:
+.quad	0x0, 0x2
+.quad	0x0, 0x2
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_11_avx2_shift:
+.value	0x20,0x4
+.value	0x1,0x20
+.value	0x8,0x1
+.value	0x20,0x4
+.value	0x20,0x4
+.value	0x1,0x20
+.value	0x8,0x1
+.value	0x20,0x4
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_11_avx2_mask:
+.value	0x7ff0,0x7ff0
+.value	0x7ff0,0x7ff0
+.value	0x7ff0,0x7ff0
+.value	0x7ff0,0x7ff0
+.value	0x7ff0,0x7ff0
+.value	0x7ff0,0x7ff0
+.value	0x7ff0,0x7ff0
+.value	0x7ff0,0x7ff0
+#ifndef __APPLE__
+.text
+.globl	kyber_decompress_11_avx2
+.type	kyber_decompress_11_avx2,@function
+.align	16
+kyber_decompress_11_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_decompress_11_avx2
+.p2align	4
+_kyber_decompress_11_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	L_kyber_decompress_11_avx2_q(%rip), %ymm4
+        vmovdqu	L_kyber_decompress_11_avx2_shuf(%rip), %ymm5
+        vmovdqu	L_kyber_decompress_11_avx2_sllv(%rip), %ymm6
+        vmovdqu	L_kyber_decompress_11_avx2_srlv(%rip), %ymm7
+        vmovdqu	L_kyber_decompress_11_avx2_shift(%rip), %ymm8
+        vmovdqu	L_kyber_decompress_11_avx2_mask(%rip), %ymm9
+L_kyber_decompress_11_avx2_start:
+        vpermq	$0x94, (%rsi), %ymm0
+        vpermq	$0x94, 22(%rsi), %ymm1
+        vpermq	$0x94, 44(%rsi), %ymm2
+        vpermq	$0x94, 66(%rsi), %ymm3
+        vpshufb	%ymm5, %ymm0, %ymm0
+        vpshufb	%ymm5, %ymm1, %ymm1
+        vpshufb	%ymm5, %ymm2, %ymm2
+        vpshufb	%ymm5, %ymm3, %ymm3
+        vpsrlvd	%ymm6, %ymm0, %ymm0
+        vpsrlvd	%ymm6, %ymm1, %ymm1
+        vpsrlvd	%ymm6, %ymm2, %ymm2
+        vpsrlvd	%ymm6, %ymm3, %ymm3
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm1, %ymm1
+        vpsrlvq	%ymm7, %ymm2, %ymm2
+        vpsrlvq	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm8, %ymm0, %ymm0
+        vpmullw	%ymm8, %ymm1, %ymm1
+        vpmullw	%ymm8, %ymm2, %ymm2
+        vpmullw	%ymm8, %ymm3, %ymm3
+        vpsrlw	$0x01, %ymm0, %ymm0
+        vpsrlw	$0x01, %ymm1, %ymm1
+        vpsrlw	$0x01, %ymm2, %ymm2
+        vpsrlw	$0x01, %ymm3, %ymm3
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpand	%ymm9, %ymm2, %ymm2
+        vpand	%ymm9, %ymm3, %ymm3
+        vpmulhrsw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm4, %ymm2, %ymm2
+        vpmulhrsw	%ymm4, %ymm3, %ymm3
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, 96(%rdi)
+        vpermq	$0x94, 88(%rsi), %ymm0
+        vpermq	$0x94, 110(%rsi), %ymm1
+        vpermq	$0x94, 132(%rsi), %ymm2
+        vpermq	$0x94, 154(%rsi), %ymm3
+        vpshufb	%ymm5, %ymm0, %ymm0
+        vpshufb	%ymm5, %ymm1, %ymm1
+        vpshufb	%ymm5, %ymm2, %ymm2
+        vpshufb	%ymm5, %ymm3, %ymm3
+        vpsrlvd	%ymm6, %ymm0, %ymm0
+        vpsrlvd	%ymm6, %ymm1, %ymm1
+        vpsrlvd	%ymm6, %ymm2, %ymm2
+        vpsrlvd	%ymm6, %ymm3, %ymm3
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm1, %ymm1
+        vpsrlvq	%ymm7, %ymm2, %ymm2
+        vpsrlvq	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm8, %ymm0, %ymm0
+        vpmullw	%ymm8, %ymm1, %ymm1
+        vpmullw	%ymm8, %ymm2, %ymm2
+        vpmullw	%ymm8, %ymm3, %ymm3
+        vpsrlw	$0x01, %ymm0, %ymm0
+        vpsrlw	$0x01, %ymm1, %ymm1
+        vpsrlw	$0x01, %ymm2, %ymm2
+        vpsrlw	$0x01, %ymm3, %ymm3
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpand	%ymm9, %ymm2, %ymm2
+        vpand	%ymm9, %ymm3, %ymm3
+        vpmulhrsw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm4, %ymm2, %ymm2
+        vpmulhrsw	%ymm4, %ymm3, %ymm3
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, 160(%rdi)
+        vmovdqu	%ymm2, 192(%rdi)
+        vmovdqu	%ymm3, 224(%rdi)
+        vpermq	$0x94, 176(%rsi), %ymm0
+        vpermq	$0x94, 198(%rsi), %ymm1
+        vpermq	$0x94, 220(%rsi), %ymm2
+        vpermq	$0x94, 242(%rsi), %ymm3
+        vpshufb	%ymm5, %ymm0, %ymm0
+        vpshufb	%ymm5, %ymm1, %ymm1
+        vpshufb	%ymm5, %ymm2, %ymm2
+        vpshufb	%ymm5, %ymm3, %ymm3
+        vpsrlvd	%ymm6, %ymm0, %ymm0
+        vpsrlvd	%ymm6, %ymm1, %ymm1
+        vpsrlvd	%ymm6, %ymm2, %ymm2
+        vpsrlvd	%ymm6, %ymm3, %ymm3
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm1, %ymm1
+        vpsrlvq	%ymm7, %ymm2, %ymm2
+        vpsrlvq	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm8, %ymm0, %ymm0
+        vpmullw	%ymm8, %ymm1, %ymm1
+        vpmullw	%ymm8, %ymm2, %ymm2
+        vpmullw	%ymm8, %ymm3, %ymm3
+        vpsrlw	$0x01, %ymm0, %ymm0
+        vpsrlw	$0x01, %ymm1, %ymm1
+        vpsrlw	$0x01, %ymm2, %ymm2
+        vpsrlw	$0x01, %ymm3, %ymm3
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpand	%ymm9, %ymm2, %ymm2
+        vpand	%ymm9, %ymm3, %ymm3
+        vpmulhrsw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm4, %ymm2, %ymm2
+        vpmulhrsw	%ymm4, %ymm3, %ymm3
+        vmovdqu	%ymm0, 256(%rdi)
+        vmovdqu	%ymm1, 288(%rdi)
+        vmovdqu	%ymm2, 320(%rdi)
+        vmovdqu	%ymm3, 352(%rdi)
+        vpermq	$0x94, 264(%rsi), %ymm0
+        vpermq	$0x94, 286(%rsi), %ymm1
+        vpermq	$0x94, 308(%rsi), %ymm2
+        vpermq	$0x94, 330(%rsi), %ymm3
+        vpshufb	%ymm5, %ymm0, %ymm0
+        vpshufb	%ymm5, %ymm1, %ymm1
+        vpshufb	%ymm5, %ymm2, %ymm2
+        vpshufb	%ymm5, %ymm3, %ymm3
+        vpsrlvd	%ymm6, %ymm0, %ymm0
+        vpsrlvd	%ymm6, %ymm1, %ymm1
+        vpsrlvd	%ymm6, %ymm2, %ymm2
+        vpsrlvd	%ymm6, %ymm3, %ymm3
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm1, %ymm1
+        vpsrlvq	%ymm7, %ymm2, %ymm2
+        vpsrlvq	%ymm7, %ymm3, %ymm3
+        vpmullw	%ymm8, %ymm0, %ymm0
+        vpmullw	%ymm8, %ymm1, %ymm1
+        vpmullw	%ymm8, %ymm2, %ymm2
+        vpmullw	%ymm8, %ymm3, %ymm3
+        vpsrlw	$0x01, %ymm0, %ymm0
+        vpsrlw	$0x01, %ymm1, %ymm1
+        vpsrlw	$0x01, %ymm2, %ymm2
+        vpsrlw	$0x01, %ymm3, %ymm3
+        vpand	%ymm9, %ymm0, %ymm0
+        vpand	%ymm9, %ymm1, %ymm1
+        vpand	%ymm9, %ymm2, %ymm2
+        vpand	%ymm9, %ymm3, %ymm3
+        vpmulhrsw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm4, %ymm1, %ymm1
+        vpmulhrsw	%ymm4, %ymm2, %ymm2
+        vpmulhrsw	%ymm4, %ymm3, %ymm3
+        vmovdqu	%ymm0, 384(%rdi)
+        vmovdqu	%ymm1, 416(%rdi)
+        vmovdqu	%ymm2, 448(%rdi)
+        vmovdqu	%ymm3, 480(%rdi)
+        addq	$0x160, %rsi
+        addq	$0x200, %rdi
+        subl	$0x01, %edx
+        jg	L_kyber_decompress_11_avx2_start
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_decompress_11_avx2,.-kyber_decompress_11_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_4_avx2_mask:
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+.value	0xf,0xf
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_4_avx2_shift:
+.value	0x200,0x200
+.value	0x200,0x200
+.value	0x200,0x200
+.value	0x200,0x200
+.value	0x200,0x200
+.value	0x200,0x200
+.value	0x200,0x200
+.value	0x200,0x200
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_compress_4_avx2_perm:
+.long	0x0,0x4,0x1,0x5
+.long	0x2,0x6,0x3,0x7
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_4_avx2_v:
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_4_avx2_shift12:
+.value	0x1001,0x1001
+.value	0x1001,0x1001
+.value	0x1001,0x1001
+.value	0x1001,0x1001
+.value	0x1001,0x1001
+.value	0x1001,0x1001
+.value	0x1001,0x1001
+.value	0x1001,0x1001
+#ifndef __APPLE__
+.text
+.globl	kyber_compress_4_avx2
+.type	kyber_compress_4_avx2,@function
+.align	16
+kyber_compress_4_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_compress_4_avx2
+.p2align	4
+_kyber_compress_4_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	L_kyber_compress_4_avx2_mask(%rip), %ymm8
+        vmovdqu	L_kyber_compress_4_avx2_shift(%rip), %ymm9
+        vmovdqu	L_kyber_compress_4_avx2_perm(%rip), %ymm10
+        vmovdqu	L_kyber_compress_4_avx2_v(%rip), %ymm11
+        vmovdqu	L_kyber_compress_4_avx2_shift12(%rip), %ymm12
+        vpmulhw	(%rsi), %ymm11, %ymm0
+        vpmulhw	32(%rsi), %ymm11, %ymm1
+        vpmulhw	64(%rsi), %ymm11, %ymm2
+        vpmulhw	96(%rsi), %ymm11, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm1, %ymm1
+        vpmulhrsw	%ymm9, %ymm2, %ymm2
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpand	%ymm8, %ymm2, %ymm2
+        vpand	%ymm8, %ymm3, %ymm3
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpackuswb	%ymm3, %ymm2, %ymm2
+        vpmaddubsw	%ymm12, %ymm0, %ymm0
+        vpmaddubsw	%ymm12, %ymm2, %ymm2
+        vpackuswb	%ymm2, %ymm0, %ymm0
+        vpmulhw	128(%rsi), %ymm11, %ymm4
+        vpmulhw	160(%rsi), %ymm11, %ymm5
+        vpmulhw	192(%rsi), %ymm11, %ymm6
+        vpmulhw	224(%rsi), %ymm11, %ymm7
+        vpmulhrsw	%ymm9, %ymm4, %ymm4
+        vpmulhrsw	%ymm9, %ymm5, %ymm5
+        vpmulhrsw	%ymm9, %ymm6, %ymm6
+        vpmulhrsw	%ymm9, %ymm7, %ymm7
+        vpand	%ymm8, %ymm4, %ymm4
+        vpand	%ymm8, %ymm5, %ymm5
+        vpand	%ymm8, %ymm6, %ymm6
+        vpand	%ymm8, %ymm7, %ymm7
+        vpackuswb	%ymm5, %ymm4, %ymm4
+        vpackuswb	%ymm7, %ymm6, %ymm6
+        vpmaddubsw	%ymm12, %ymm4, %ymm4
+        vpmaddubsw	%ymm12, %ymm6, %ymm6
+        vpackuswb	%ymm6, %ymm4, %ymm4
+        vpermd	%ymm0, %ymm10, %ymm0
+        vpermd	%ymm4, %ymm10, %ymm4
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm4, 32(%rdi)
+        vpmulhw	256(%rsi), %ymm11, %ymm0
+        vpmulhw	288(%rsi), %ymm11, %ymm1
+        vpmulhw	320(%rsi), %ymm11, %ymm2
+        vpmulhw	352(%rsi), %ymm11, %ymm3
+        vpmulhrsw	%ymm9, %ymm0, %ymm0
+        vpmulhrsw	%ymm9, %ymm1, %ymm1
+        vpmulhrsw	%ymm9, %ymm2, %ymm2
+        vpmulhrsw	%ymm9, %ymm3, %ymm3
+        vpand	%ymm8, %ymm0, %ymm0
+        vpand	%ymm8, %ymm1, %ymm1
+        vpand	%ymm8, %ymm2, %ymm2
+        vpand	%ymm8, %ymm3, %ymm3
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpackuswb	%ymm3, %ymm2, %ymm2
+        vpmaddubsw	%ymm12, %ymm0, %ymm0
+        vpmaddubsw	%ymm12, %ymm2, %ymm2
+        vpackuswb	%ymm2, %ymm0, %ymm0
+        vpmulhw	384(%rsi), %ymm11, %ymm4
+        vpmulhw	416(%rsi), %ymm11, %ymm5
+        vpmulhw	448(%rsi), %ymm11, %ymm6
+        vpmulhw	480(%rsi), %ymm11, %ymm7
+        vpmulhrsw	%ymm9, %ymm4, %ymm4
+        vpmulhrsw	%ymm9, %ymm5, %ymm5
+        vpmulhrsw	%ymm9, %ymm6, %ymm6
+        vpmulhrsw	%ymm9, %ymm7, %ymm7
+        vpand	%ymm8, %ymm4, %ymm4
+        vpand	%ymm8, %ymm5, %ymm5
+        vpand	%ymm8, %ymm6, %ymm6
+        vpand	%ymm8, %ymm7, %ymm7
+        vpackuswb	%ymm5, %ymm4, %ymm4
+        vpackuswb	%ymm7, %ymm6, %ymm6
+        vpmaddubsw	%ymm12, %ymm4, %ymm4
+        vpmaddubsw	%ymm12, %ymm6, %ymm6
+        vpackuswb	%ymm6, %ymm4, %ymm4
+        vpermd	%ymm0, %ymm10, %ymm0
+        vpermd	%ymm4, %ymm10, %ymm4
+        vmovdqu	%ymm0, 64(%rdi)
+        vmovdqu	%ymm4, 96(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_compress_4_avx2,.-kyber_compress_4_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_decompress_4_avx2_mask:
+.long	0xf0000f,0xf0000f,0xf0000f,0xf0000f
+.long	0xf0000f,0xf0000f,0xf0000f,0xf0000f
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_decompress_4_avx2_shift:
+.long	0x800800,0x800800,0x800800,0x800800
+.long	0x800800,0x800800,0x800800,0x800800
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_4_avx2_q:
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_4_avx2_shuf:
+.value	0x0,0x0
+.value	0x101,0x101
+.value	0x202,0x202
+.value	0x303,0x303
+.value	0x404,0x404
+.value	0x505,0x505
+.value	0x606,0x606
+.value	0x707,0x707
+#ifndef __APPLE__
+.text
+.globl	kyber_decompress_4_avx2
+.type	kyber_decompress_4_avx2,@function
+.align	16
+kyber_decompress_4_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_decompress_4_avx2
+.p2align	4
+_kyber_decompress_4_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	L_kyber_decompress_4_avx2_mask(%rip), %ymm4
+        vmovdqu	L_kyber_decompress_4_avx2_shift(%rip), %ymm5
+        vmovdqu	L_kyber_decompress_4_avx2_shuf(%rip), %ymm6
+        vmovdqu	L_kyber_decompress_4_avx2_q(%rip), %ymm7
+        vpbroadcastq	(%rsi), %ymm0
+        vpbroadcastq	8(%rsi), %ymm1
+        vpbroadcastq	16(%rsi), %ymm2
+        vpbroadcastq	24(%rsi), %ymm3
+        vpshufb	%ymm6, %ymm0, %ymm0
+        vpshufb	%ymm6, %ymm1, %ymm1
+        vpshufb	%ymm6, %ymm2, %ymm2
+        vpshufb	%ymm6, %ymm3, %ymm3
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpand	%ymm4, %ymm2, %ymm2
+        vpand	%ymm4, %ymm3, %ymm3
+        vpmullw	%ymm5, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm5, %ymm2, %ymm2
+        vpmullw	%ymm5, %ymm3, %ymm3
+        vpmulhrsw	%ymm7, %ymm0, %ymm0
+        vpmulhrsw	%ymm7, %ymm1, %ymm1
+        vpmulhrsw	%ymm7, %ymm2, %ymm2
+        vpmulhrsw	%ymm7, %ymm3, %ymm3
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, 96(%rdi)
+        vpbroadcastq	32(%rsi), %ymm0
+        vpbroadcastq	40(%rsi), %ymm1
+        vpbroadcastq	48(%rsi), %ymm2
+        vpbroadcastq	56(%rsi), %ymm3
+        vpshufb	%ymm6, %ymm0, %ymm0
+        vpshufb	%ymm6, %ymm1, %ymm1
+        vpshufb	%ymm6, %ymm2, %ymm2
+        vpshufb	%ymm6, %ymm3, %ymm3
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpand	%ymm4, %ymm2, %ymm2
+        vpand	%ymm4, %ymm3, %ymm3
+        vpmullw	%ymm5, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm5, %ymm2, %ymm2
+        vpmullw	%ymm5, %ymm3, %ymm3
+        vpmulhrsw	%ymm7, %ymm0, %ymm0
+        vpmulhrsw	%ymm7, %ymm1, %ymm1
+        vpmulhrsw	%ymm7, %ymm2, %ymm2
+        vpmulhrsw	%ymm7, %ymm3, %ymm3
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, 160(%rdi)
+        vmovdqu	%ymm2, 192(%rdi)
+        vmovdqu	%ymm3, 224(%rdi)
+        vpbroadcastq	64(%rsi), %ymm0
+        vpbroadcastq	72(%rsi), %ymm1
+        vpbroadcastq	80(%rsi), %ymm2
+        vpbroadcastq	88(%rsi), %ymm3
+        vpshufb	%ymm6, %ymm0, %ymm0
+        vpshufb	%ymm6, %ymm1, %ymm1
+        vpshufb	%ymm6, %ymm2, %ymm2
+        vpshufb	%ymm6, %ymm3, %ymm3
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpand	%ymm4, %ymm2, %ymm2
+        vpand	%ymm4, %ymm3, %ymm3
+        vpmullw	%ymm5, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm5, %ymm2, %ymm2
+        vpmullw	%ymm5, %ymm3, %ymm3
+        vpmulhrsw	%ymm7, %ymm0, %ymm0
+        vpmulhrsw	%ymm7, %ymm1, %ymm1
+        vpmulhrsw	%ymm7, %ymm2, %ymm2
+        vpmulhrsw	%ymm7, %ymm3, %ymm3
+        vmovdqu	%ymm0, 256(%rdi)
+        vmovdqu	%ymm1, 288(%rdi)
+        vmovdqu	%ymm2, 320(%rdi)
+        vmovdqu	%ymm3, 352(%rdi)
+        vpbroadcastq	96(%rsi), %ymm0
+        vpbroadcastq	104(%rsi), %ymm1
+        vpbroadcastq	112(%rsi), %ymm2
+        vpbroadcastq	120(%rsi), %ymm3
+        vpshufb	%ymm6, %ymm0, %ymm0
+        vpshufb	%ymm6, %ymm1, %ymm1
+        vpshufb	%ymm6, %ymm2, %ymm2
+        vpshufb	%ymm6, %ymm3, %ymm3
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpand	%ymm4, %ymm2, %ymm2
+        vpand	%ymm4, %ymm3, %ymm3
+        vpmullw	%ymm5, %ymm0, %ymm0
+        vpmullw	%ymm5, %ymm1, %ymm1
+        vpmullw	%ymm5, %ymm2, %ymm2
+        vpmullw	%ymm5, %ymm3, %ymm3
+        vpmulhrsw	%ymm7, %ymm0, %ymm0
+        vpmulhrsw	%ymm7, %ymm1, %ymm1
+        vpmulhrsw	%ymm7, %ymm2, %ymm2
+        vpmulhrsw	%ymm7, %ymm3, %ymm3
+        vmovdqu	%ymm0, 384(%rdi)
+        vmovdqu	%ymm1, 416(%rdi)
+        vmovdqu	%ymm2, 448(%rdi)
+        vmovdqu	%ymm3, 480(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_decompress_4_avx2,.-kyber_decompress_4_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_5_avx2_v:
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+.value	0x4ebf,0x4ebf
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_5_avx2_shift:
+.value	0x400,0x400
+.value	0x400,0x400
+.value	0x400,0x400
+.value	0x400,0x400
+.value	0x400,0x400
+.value	0x400,0x400
+.value	0x400,0x400
+.value	0x400,0x400
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_5_avx2_mask:
+.value	0x1f,0x1f
+.value	0x1f,0x1f
+.value	0x1f,0x1f
+.value	0x1f,0x1f
+.value	0x1f,0x1f
+.value	0x1f,0x1f
+.value	0x1f,0x1f
+.value	0x1f,0x1f
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_5_avx2_shift1:
+.value	0x2001,0x2001
+.value	0x2001,0x2001
+.value	0x2001,0x2001
+.value	0x2001,0x2001
+.value	0x2001,0x2001
+.value	0x2001,0x2001
+.value	0x2001,0x2001
+.value	0x2001,0x2001
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_compress_5_avx2_shift2:
+.long	0x4000001,0x4000001,0x4000001,0x4000001
+.long	0x4000001,0x4000001,0x4000001,0x4000001
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_kyber_compress_5_avx2_shlv:
+.quad	0xc, 0xc
+.quad	0xc, 0xc
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_compress_5_avx2_shuffle:
+.value	0x100,0x302
+.value	0xff04,0xffff
+.value	0xffff,0x908
+.value	0xb0a,0xff0c
+.value	0xa09,0xc0b
+.value	0xff,0x201
+.value	0x403,0xffff
+.value	0xffff,0x8ff
+#ifndef __APPLE__
+.text
+.globl	kyber_compress_5_avx2
+.type	kyber_compress_5_avx2,@function
+.align	16
+kyber_compress_5_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_compress_5_avx2
+.p2align	4
+_kyber_compress_5_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	L_kyber_compress_5_avx2_v(%rip), %ymm2
+        vmovdqu	L_kyber_compress_5_avx2_shift(%rip), %ymm3
+        vmovdqu	L_kyber_compress_5_avx2_mask(%rip), %ymm4
+        vmovdqu	L_kyber_compress_5_avx2_shift1(%rip), %ymm5
+        vmovdqu	L_kyber_compress_5_avx2_shift2(%rip), %ymm6
+        vmovdqu	L_kyber_compress_5_avx2_shlv(%rip), %ymm7
+        vmovdqu	L_kyber_compress_5_avx2_shuffle(%rip), %ymm8
+        vpmulhw	(%rsi), %ymm2, %ymm0
+        vpmulhw	32(%rsi), %ymm2, %ymm1
+        vpmulhrsw	%ymm3, %ymm0, %ymm0
+        vpmulhrsw	%ymm3, %ymm1, %ymm1
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpmaddubsw	%ymm5, %ymm0, %ymm0
+        vpmaddwd	%ymm6, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpshufb	%ymm8, %ymm0, %ymm0
+        vextracti128	$0x01, %ymm0, %xmm1
+        vpblendvb	%xmm8, %xmm1, %xmm0, %xmm0
+        vmovdqu	%xmm0, (%rdi)
+        movss	%xmm1, 16(%rdi)
+        vpmulhw	64(%rsi), %ymm2, %ymm0
+        vpmulhw	96(%rsi), %ymm2, %ymm1
+        vpmulhrsw	%ymm3, %ymm0, %ymm0
+        vpmulhrsw	%ymm3, %ymm1, %ymm1
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpmaddubsw	%ymm5, %ymm0, %ymm0
+        vpmaddwd	%ymm6, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpshufb	%ymm8, %ymm0, %ymm0
+        vextracti128	$0x01, %ymm0, %xmm1
+        vpblendvb	%xmm8, %xmm1, %xmm0, %xmm0
+        vmovdqu	%xmm0, 20(%rdi)
+        movss	%xmm1, 36(%rdi)
+        vpmulhw	128(%rsi), %ymm2, %ymm0
+        vpmulhw	160(%rsi), %ymm2, %ymm1
+        vpmulhrsw	%ymm3, %ymm0, %ymm0
+        vpmulhrsw	%ymm3, %ymm1, %ymm1
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpmaddubsw	%ymm5, %ymm0, %ymm0
+        vpmaddwd	%ymm6, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpshufb	%ymm8, %ymm0, %ymm0
+        vextracti128	$0x01, %ymm0, %xmm1
+        vpblendvb	%xmm8, %xmm1, %xmm0, %xmm0
+        vmovdqu	%xmm0, 40(%rdi)
+        movss	%xmm1, 56(%rdi)
+        vpmulhw	192(%rsi), %ymm2, %ymm0
+        vpmulhw	224(%rsi), %ymm2, %ymm1
+        vpmulhrsw	%ymm3, %ymm0, %ymm0
+        vpmulhrsw	%ymm3, %ymm1, %ymm1
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpmaddubsw	%ymm5, %ymm0, %ymm0
+        vpmaddwd	%ymm6, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpshufb	%ymm8, %ymm0, %ymm0
+        vextracti128	$0x01, %ymm0, %xmm1
+        vpblendvb	%xmm8, %xmm1, %xmm0, %xmm0
+        vmovdqu	%xmm0, 60(%rdi)
+        movss	%xmm1, 76(%rdi)
+        vpmulhw	256(%rsi), %ymm2, %ymm0
+        vpmulhw	288(%rsi), %ymm2, %ymm1
+        vpmulhrsw	%ymm3, %ymm0, %ymm0
+        vpmulhrsw	%ymm3, %ymm1, %ymm1
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpmaddubsw	%ymm5, %ymm0, %ymm0
+        vpmaddwd	%ymm6, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpshufb	%ymm8, %ymm0, %ymm0
+        vextracti128	$0x01, %ymm0, %xmm1
+        vpblendvb	%xmm8, %xmm1, %xmm0, %xmm0
+        vmovdqu	%xmm0, 80(%rdi)
+        movss	%xmm1, 96(%rdi)
+        vpmulhw	320(%rsi), %ymm2, %ymm0
+        vpmulhw	352(%rsi), %ymm2, %ymm1
+        vpmulhrsw	%ymm3, %ymm0, %ymm0
+        vpmulhrsw	%ymm3, %ymm1, %ymm1
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpmaddubsw	%ymm5, %ymm0, %ymm0
+        vpmaddwd	%ymm6, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpshufb	%ymm8, %ymm0, %ymm0
+        vextracti128	$0x01, %ymm0, %xmm1
+        vpblendvb	%xmm8, %xmm1, %xmm0, %xmm0
+        vmovdqu	%xmm0, 100(%rdi)
+        movss	%xmm1, 116(%rdi)
+        vpmulhw	384(%rsi), %ymm2, %ymm0
+        vpmulhw	416(%rsi), %ymm2, %ymm1
+        vpmulhrsw	%ymm3, %ymm0, %ymm0
+        vpmulhrsw	%ymm3, %ymm1, %ymm1
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpmaddubsw	%ymm5, %ymm0, %ymm0
+        vpmaddwd	%ymm6, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpshufb	%ymm8, %ymm0, %ymm0
+        vextracti128	$0x01, %ymm0, %xmm1
+        vpblendvb	%xmm8, %xmm1, %xmm0, %xmm0
+        vmovdqu	%xmm0, 120(%rdi)
+        movss	%xmm1, 136(%rdi)
+        vpmulhw	448(%rsi), %ymm2, %ymm0
+        vpmulhw	480(%rsi), %ymm2, %ymm1
+        vpmulhrsw	%ymm3, %ymm0, %ymm0
+        vpmulhrsw	%ymm3, %ymm1, %ymm1
+        vpand	%ymm4, %ymm0, %ymm0
+        vpand	%ymm4, %ymm1, %ymm1
+        vpackuswb	%ymm1, %ymm0, %ymm0
+        vpmaddubsw	%ymm5, %ymm0, %ymm0
+        vpmaddwd	%ymm6, %ymm0, %ymm0
+        vpsllvd	%ymm7, %ymm0, %ymm0
+        vpsrlvq	%ymm7, %ymm0, %ymm0
+        vpshufb	%ymm8, %ymm0, %ymm0
+        vextracti128	$0x01, %ymm0, %xmm1
+        vpblendvb	%xmm8, %xmm1, %xmm0, %xmm0
+        vmovdqu	%xmm0, 140(%rdi)
+        movss	%xmm1, 156(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_compress_5_avx2,.-kyber_compress_5_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_5_avx2_q:
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+.value	0xd01,0xd01
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_5_avx2_shuf:
+.value	0x0,0x100
+.value	0x101,0x201
+.value	0x302,0x303
+.value	0x403,0x404
+.value	0x505,0x605
+.value	0x606,0x706
+.value	0x807,0x808
+.value	0x908,0x909
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_5_avx2_mask:
+.value	0x1f,0x3e0
+.value	0x7c,0xf80
+.value	0x1f0,0x3e
+.value	0x7c0,0xfb
+.value	0x1f,0x3e0
+.value	0x7c,0xf80
+.value	0x1f0,0x3e
+.value	0x7c0,0xfb
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_decompress_5_avx2_shift:
+.value	0x400,0x20
+.value	0x100,0x8
+.value	0x40,0x200
+.value	0x10,0x80
+.value	0x400,0x20
+.value	0x100,0x8
+.value	0x40,0x200
+.value	0x10,0x80
+#ifndef __APPLE__
+.text
+.globl	kyber_decompress_5_avx2
+.type	kyber_decompress_5_avx2,@function
+.align	16
+kyber_decompress_5_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_decompress_5_avx2
+.p2align	4
+_kyber_decompress_5_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	L_kyber_decompress_5_avx2_q(%rip), %ymm1
+        vmovdqu	L_kyber_decompress_5_avx2_shuf(%rip), %ymm2
+        vmovdqu	L_kyber_decompress_5_avx2_mask(%rip), %ymm3
+        vmovdqu	L_kyber_decompress_5_avx2_shift(%rip), %ymm4
+        vbroadcasti128	(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, (%rdi)
+        vbroadcasti128	10(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 32(%rdi)
+        vbroadcasti128	20(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 64(%rdi)
+        vbroadcasti128	30(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 96(%rdi)
+        vbroadcasti128	40(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 128(%rdi)
+        vbroadcasti128	50(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 160(%rdi)
+        vbroadcasti128	60(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 192(%rdi)
+        vbroadcasti128	70(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 224(%rdi)
+        vbroadcasti128	80(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 256(%rdi)
+        vbroadcasti128	90(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 288(%rdi)
+        vbroadcasti128	100(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 320(%rdi)
+        vbroadcasti128	110(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 352(%rdi)
+        vbroadcasti128	120(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 384(%rdi)
+        vbroadcasti128	130(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 416(%rdi)
+        vbroadcasti128	140(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 448(%rdi)
+        vbroadcasti128	150(%rsi), %ymm0
+        vpshufb	%ymm2, %ymm0, %ymm0
+        vpand	%ymm3, %ymm0, %ymm0
+        vpmullw	%ymm4, %ymm0, %ymm0
+        vpmulhrsw	%ymm1, %ymm0, %ymm0
+        vmovdqu	%ymm0, 480(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_decompress_5_avx2,.-kyber_decompress_5_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_from_msg_avx2_shift:
+.long	0x3,0x2,0x1,0x0
+.long	0x3,0x2,0x1,0x0
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_from_msg_avx2_shuf:
+.value	0x100,0x504
+.value	0x908,0xd0c
+.value	0x302,0x706
+.value	0xb0a,0xf0e
+.value	0x100,0x504
+.value	0x908,0xd0c
+.value	0x302,0x706
+.value	0xb0a,0xf0e
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_from_msg_avx2_hqs:
+.value	0x681,0x681
+.value	0x681,0x681
+.value	0x681,0x681
+.value	0x681,0x681
+.value	0x681,0x681
+.value	0x681,0x681
+.value	0x681,0x681
+.value	0x681,0x681
+#ifndef __APPLE__
+.text
+.globl	kyber_from_msg_avx2
+.type	kyber_from_msg_avx2,@function
+.align	16
+kyber_from_msg_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_from_msg_avx2
+.p2align	4
+_kyber_from_msg_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	L_kyber_from_msg_avx2_shift(%rip), %ymm9
+        vmovdqu	L_kyber_from_msg_avx2_shuf(%rip), %ymm10
+        vmovdqu	L_kyber_from_msg_avx2_hqs(%rip), %ymm11
+        vpshufd	$0x00, %ymm0, %ymm4
+        vpsllvd	%ymm9, %ymm4, %ymm4
+        vpshufb	%ymm10, %ymm4, %ymm4
+        vpsllw	$12, %ymm4, %ymm1
+        vpsllw	$8, %ymm4, %ymm2
+        vpsllw	$4, %ymm4, %ymm3
+        vpsraw	$15, %ymm1, %ymm1
+        vpsraw	$15, %ymm2, %ymm2
+        vpsraw	$15, %ymm3, %ymm3
+        vpsraw	$15, %ymm4, %ymm4
+        vpand	%ymm11, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpand	%ymm11, %ymm4, %ymm4
+        vpunpcklqdq	%ymm2, %ymm1, %ymm5
+        vpunpckhqdq	%ymm2, %ymm1, %ymm7
+        vpunpcklqdq	%ymm4, %ymm3, %ymm6
+        vpunpckhqdq	%ymm4, %ymm3, %ymm8
+        vperm2i128	$32, %ymm6, %ymm5, %ymm1
+        vperm2i128	$49, %ymm6, %ymm5, %ymm3
+        vperm2i128	$32, %ymm8, %ymm7, %ymm2
+        vperm2i128	$49, %ymm8, %ymm7, %ymm4
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, 256(%rdi)
+        vmovdqu	%ymm4, 288(%rdi)
+        vpshufd	$0x55, %ymm0, %ymm4
+        vpsllvd	%ymm9, %ymm4, %ymm4
+        vpshufb	%ymm10, %ymm4, %ymm4
+        vpsllw	$12, %ymm4, %ymm1
+        vpsllw	$8, %ymm4, %ymm2
+        vpsllw	$4, %ymm4, %ymm3
+        vpsraw	$15, %ymm1, %ymm1
+        vpsraw	$15, %ymm2, %ymm2
+        vpsraw	$15, %ymm3, %ymm3
+        vpsraw	$15, %ymm4, %ymm4
+        vpand	%ymm11, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpand	%ymm11, %ymm4, %ymm4
+        vpunpcklqdq	%ymm2, %ymm1, %ymm5
+        vpunpckhqdq	%ymm2, %ymm1, %ymm7
+        vpunpcklqdq	%ymm4, %ymm3, %ymm6
+        vpunpckhqdq	%ymm4, %ymm3, %ymm8
+        vperm2i128	$32, %ymm6, %ymm5, %ymm1
+        vperm2i128	$49, %ymm6, %ymm5, %ymm3
+        vperm2i128	$32, %ymm8, %ymm7, %ymm2
+        vperm2i128	$49, %ymm8, %ymm7, %ymm4
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, 320(%rdi)
+        vmovdqu	%ymm4, 352(%rdi)
+        vpshufd	$0xaa, %ymm0, %ymm4
+        vpsllvd	%ymm9, %ymm4, %ymm4
+        vpshufb	%ymm10, %ymm4, %ymm4
+        vpsllw	$12, %ymm4, %ymm1
+        vpsllw	$8, %ymm4, %ymm2
+        vpsllw	$4, %ymm4, %ymm3
+        vpsraw	$15, %ymm1, %ymm1
+        vpsraw	$15, %ymm2, %ymm2
+        vpsraw	$15, %ymm3, %ymm3
+        vpsraw	$15, %ymm4, %ymm4
+        vpand	%ymm11, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpand	%ymm11, %ymm4, %ymm4
+        vpunpcklqdq	%ymm2, %ymm1, %ymm5
+        vpunpckhqdq	%ymm2, %ymm1, %ymm7
+        vpunpcklqdq	%ymm4, %ymm3, %ymm6
+        vpunpckhqdq	%ymm4, %ymm3, %ymm8
+        vperm2i128	$32, %ymm6, %ymm5, %ymm1
+        vperm2i128	$49, %ymm6, %ymm5, %ymm3
+        vperm2i128	$32, %ymm8, %ymm7, %ymm2
+        vperm2i128	$49, %ymm8, %ymm7, %ymm4
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, 160(%rdi)
+        vmovdqu	%ymm3, 384(%rdi)
+        vmovdqu	%ymm4, 416(%rdi)
+        vpshufd	$0xff, %ymm0, %ymm4
+        vpsllvd	%ymm9, %ymm4, %ymm4
+        vpshufb	%ymm10, %ymm4, %ymm4
+        vpsllw	$12, %ymm4, %ymm1
+        vpsllw	$8, %ymm4, %ymm2
+        vpsllw	$4, %ymm4, %ymm3
+        vpsraw	$15, %ymm1, %ymm1
+        vpsraw	$15, %ymm2, %ymm2
+        vpsraw	$15, %ymm3, %ymm3
+        vpsraw	$15, %ymm4, %ymm4
+        vpand	%ymm11, %ymm1, %ymm1
+        vpand	%ymm11, %ymm2, %ymm2
+        vpand	%ymm11, %ymm3, %ymm3
+        vpand	%ymm11, %ymm4, %ymm4
+        vpunpcklqdq	%ymm2, %ymm1, %ymm5
+        vpunpckhqdq	%ymm2, %ymm1, %ymm7
+        vpunpcklqdq	%ymm4, %ymm3, %ymm6
+        vpunpckhqdq	%ymm4, %ymm3, %ymm8
+        vperm2i128	$32, %ymm6, %ymm5, %ymm1
+        vperm2i128	$49, %ymm6, %ymm5, %ymm3
+        vperm2i128	$32, %ymm8, %ymm7, %ymm2
+        vperm2i128	$49, %ymm8, %ymm7, %ymm4
+        vmovdqu	%ymm1, 192(%rdi)
+        vmovdqu	%ymm2, 224(%rdi)
+        vmovdqu	%ymm3, 448(%rdi)
+        vmovdqu	%ymm4, 480(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_from_msg_avx2,.-kyber_from_msg_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_to_msg_avx2_hqs:
+.value	0x680,0x680
+.value	0x680,0x680
+.value	0x680,0x680
+.value	0x680,0x680
+.value	0x680,0x680
+.value	0x680,0x680
+.value	0x680,0x680
+.value	0x680,0x680
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_to_msg_avx2_hhqs:
+.value	0xfcc1,0xfcc1
+.value	0xfcc1,0xfcc1
+.value	0xfcc1,0xfcc1
+.value	0xfcc1,0xfcc1
+.value	0xfcc1,0xfcc1
+.value	0xfcc1,0xfcc1
+.value	0xfcc1,0xfcc1
+.value	0xfcc1,0xfcc1
+#ifndef __APPLE__
+.text
+.globl	kyber_to_msg_avx2
+.type	kyber_to_msg_avx2,@function
+.align	16
+kyber_to_msg_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_to_msg_avx2
+.p2align	4
+_kyber_to_msg_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	L_kyber_to_msg_avx2_hqs(%rip), %ymm8
+        vmovdqu	L_kyber_to_msg_avx2_hhqs(%rip), %ymm9
+        vpsubw	(%rsi), %ymm8, %ymm0
+        vpsubw	32(%rsi), %ymm8, %ymm1
+        vpsubw	64(%rsi), %ymm8, %ymm2
+        vpsubw	96(%rsi), %ymm8, %ymm3
+        vpsraw	$15, %ymm0, %ymm4
+        vpsraw	$15, %ymm1, %ymm5
+        vpsraw	$15, %ymm2, %ymm6
+        vpsraw	$15, %ymm3, %ymm7
+        vpxor	%ymm4, %ymm0, %ymm0
+        vpxor	%ymm5, %ymm1, %ymm1
+        vpxor	%ymm6, %ymm2, %ymm2
+        vpxor	%ymm7, %ymm3, %ymm3
+        vpaddw	%ymm9, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpaddw	%ymm9, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vpacksswb	%ymm1, %ymm0, %ymm0
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpermq	$0xd8, %ymm0, %ymm0
+        vpermq	$0xd8, %ymm2, %ymm2
+        vpmovmskb	%ymm0, %edx
+        vpmovmskb	%ymm2, %eax
+        movl	%edx, (%rdi)
+        movl	%eax, 4(%rdi)
+        vpsubw	128(%rsi), %ymm8, %ymm0
+        vpsubw	160(%rsi), %ymm8, %ymm1
+        vpsubw	192(%rsi), %ymm8, %ymm2
+        vpsubw	224(%rsi), %ymm8, %ymm3
+        vpsraw	$15, %ymm0, %ymm4
+        vpsraw	$15, %ymm1, %ymm5
+        vpsraw	$15, %ymm2, %ymm6
+        vpsraw	$15, %ymm3, %ymm7
+        vpxor	%ymm4, %ymm0, %ymm0
+        vpxor	%ymm5, %ymm1, %ymm1
+        vpxor	%ymm6, %ymm2, %ymm2
+        vpxor	%ymm7, %ymm3, %ymm3
+        vpaddw	%ymm9, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpaddw	%ymm9, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vpacksswb	%ymm1, %ymm0, %ymm0
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpermq	$0xd8, %ymm0, %ymm0
+        vpermq	$0xd8, %ymm2, %ymm2
+        vpmovmskb	%ymm0, %edx
+        vpmovmskb	%ymm2, %eax
+        movl	%edx, 8(%rdi)
+        movl	%eax, 12(%rdi)
+        vpsubw	256(%rsi), %ymm8, %ymm0
+        vpsubw	288(%rsi), %ymm8, %ymm1
+        vpsubw	320(%rsi), %ymm8, %ymm2
+        vpsubw	352(%rsi), %ymm8, %ymm3
+        vpsraw	$15, %ymm0, %ymm4
+        vpsraw	$15, %ymm1, %ymm5
+        vpsraw	$15, %ymm2, %ymm6
+        vpsraw	$15, %ymm3, %ymm7
+        vpxor	%ymm4, %ymm0, %ymm0
+        vpxor	%ymm5, %ymm1, %ymm1
+        vpxor	%ymm6, %ymm2, %ymm2
+        vpxor	%ymm7, %ymm3, %ymm3
+        vpaddw	%ymm9, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpaddw	%ymm9, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vpacksswb	%ymm1, %ymm0, %ymm0
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpermq	$0xd8, %ymm0, %ymm0
+        vpermq	$0xd8, %ymm2, %ymm2
+        vpmovmskb	%ymm0, %edx
+        vpmovmskb	%ymm2, %eax
+        movl	%edx, 16(%rdi)
+        movl	%eax, 20(%rdi)
+        vpsubw	384(%rsi), %ymm8, %ymm0
+        vpsubw	416(%rsi), %ymm8, %ymm1
+        vpsubw	448(%rsi), %ymm8, %ymm2
+        vpsubw	480(%rsi), %ymm8, %ymm3
+        vpsraw	$15, %ymm0, %ymm4
+        vpsraw	$15, %ymm1, %ymm5
+        vpsraw	$15, %ymm2, %ymm6
+        vpsraw	$15, %ymm3, %ymm7
+        vpxor	%ymm4, %ymm0, %ymm0
+        vpxor	%ymm5, %ymm1, %ymm1
+        vpxor	%ymm6, %ymm2, %ymm2
+        vpxor	%ymm7, %ymm3, %ymm3
+        vpaddw	%ymm9, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpaddw	%ymm9, %ymm2, %ymm2
+        vpaddw	%ymm9, %ymm3, %ymm3
+        vpacksswb	%ymm1, %ymm0, %ymm0
+        vpacksswb	%ymm3, %ymm2, %ymm2
+        vpermq	$0xd8, %ymm0, %ymm0
+        vpermq	$0xd8, %ymm2, %ymm2
+        vpmovmskb	%ymm0, %edx
+        vpmovmskb	%ymm2, %eax
+        movl	%edx, 24(%rdi)
+        movl	%eax, 28(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_to_msg_avx2,.-kyber_to_msg_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_from_bytes_avx2_shuf:
+.value	0x100,0xff02
+.value	0x403,0xff05
+.value	0x706,0xff08
+.value	0xa09,0xff0b
+.value	0x504,0xff06
+.value	0x807,0xff09
+.value	0xb0a,0xff0c
+.value	0xe0d,0xff0f
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_from_bytes_avx2_mask:
+.long	0xfff,0xfff,0xfff,0xfff
+.long	0xfff,0xfff,0xfff,0xfff
+#ifndef __APPLE__
+.text
+.globl	kyber_from_bytes_avx2
+.type	kyber_from_bytes_avx2,@function
+.align	16
+kyber_from_bytes_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_from_bytes_avx2
+.p2align	4
+_kyber_from_bytes_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	L_kyber_from_bytes_avx2_shuf(%rip), %ymm12
+        vmovdqu	L_kyber_from_bytes_avx2_mask(%rip), %ymm13
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vmovdqu	64(%rsi), %ymm2
+        vmovdqu	96(%rsi), %ymm3
+        vmovdqu	128(%rsi), %ymm4
+        vmovdqu	160(%rsi), %ymm5
+        vpermq	$0xe9, %ymm5, %ymm7
+        vpermq	$0x00, %ymm5, %ymm8
+        vpermq	$62, %ymm4, %ymm6
+        vpermq	$0x40, %ymm4, %ymm9
+        vpermq	$3, %ymm3, %ymm5
+        vpermq	$0x94, %ymm3, %ymm4
+        vpermq	$0xe9, %ymm2, %ymm3
+        vpermq	$0x00, %ymm2, %ymm10
+        vpermq	$62, %ymm1, %ymm2
+        vpermq	$0x40, %ymm1, %ymm11
+        vpermq	$3, %ymm0, %ymm1
+        vpermq	$0x94, %ymm0, %ymm0
+        vpblendd	$0xc0, %ymm8, %ymm6, %ymm6
+        vpblendd	$0xfc, %ymm9, %ymm5, %ymm5
+        vpblendd	$0xc0, %ymm10, %ymm2, %ymm2
+        vpblendd	$0xfc, %ymm11, %ymm1, %ymm1
+        vpshufb	%ymm12, %ymm0, %ymm0
+        vpshufb	%ymm12, %ymm1, %ymm1
+        vpshufb	%ymm12, %ymm2, %ymm2
+        vpshufb	%ymm12, %ymm3, %ymm3
+        vpshufb	%ymm12, %ymm4, %ymm4
+        vpshufb	%ymm12, %ymm5, %ymm5
+        vpshufb	%ymm12, %ymm6, %ymm6
+        vpshufb	%ymm12, %ymm7, %ymm7
+        vpandn	%ymm0, %ymm13, %ymm8
+        vpandn	%ymm1, %ymm13, %ymm9
+        vpandn	%ymm2, %ymm13, %ymm10
+        vpandn	%ymm3, %ymm13, %ymm11
+        vpand	%ymm0, %ymm13, %ymm0
+        vpand	%ymm1, %ymm13, %ymm1
+        vpand	%ymm2, %ymm13, %ymm2
+        vpand	%ymm3, %ymm13, %ymm3
+        vpslld	$4, %ymm8, %ymm8
+        vpslld	$4, %ymm9, %ymm9
+        vpslld	$4, %ymm10, %ymm10
+        vpslld	$4, %ymm11, %ymm11
+        vpor	%ymm8, %ymm0, %ymm0
+        vpor	%ymm9, %ymm1, %ymm1
+        vpor	%ymm10, %ymm2, %ymm2
+        vpor	%ymm11, %ymm3, %ymm3
+        vpandn	%ymm4, %ymm13, %ymm8
+        vpandn	%ymm5, %ymm13, %ymm9
+        vpandn	%ymm6, %ymm13, %ymm10
+        vpandn	%ymm7, %ymm13, %ymm11
+        vpand	%ymm4, %ymm13, %ymm4
+        vpand	%ymm5, %ymm13, %ymm5
+        vpand	%ymm6, %ymm13, %ymm6
+        vpand	%ymm7, %ymm13, %ymm7
+        vpslld	$4, %ymm8, %ymm8
+        vpslld	$4, %ymm9, %ymm9
+        vpslld	$4, %ymm10, %ymm10
+        vpslld	$4, %ymm11, %ymm11
+        vpor	%ymm8, %ymm4, %ymm4
+        vpor	%ymm9, %ymm5, %ymm5
+        vpor	%ymm10, %ymm6, %ymm6
+        vpor	%ymm11, %ymm7, %ymm7
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, 128(%rdi)
+        vmovdqu	%ymm5, 160(%rdi)
+        vmovdqu	%ymm6, 192(%rdi)
+        vmovdqu	%ymm7, 224(%rdi)
+        vmovdqu	192(%rsi), %ymm0
+        vmovdqu	224(%rsi), %ymm1
+        vmovdqu	256(%rsi), %ymm2
+        vmovdqu	288(%rsi), %ymm3
+        vmovdqu	320(%rsi), %ymm4
+        vmovdqu	352(%rsi), %ymm5
+        vpermq	$0xe9, %ymm5, %ymm7
+        vpermq	$0x00, %ymm5, %ymm8
+        vpermq	$62, %ymm4, %ymm6
+        vpermq	$0x40, %ymm4, %ymm9
+        vpermq	$3, %ymm3, %ymm5
+        vpermq	$0x94, %ymm3, %ymm4
+        vpermq	$0xe9, %ymm2, %ymm3
+        vpermq	$0x00, %ymm2, %ymm10
+        vpermq	$62, %ymm1, %ymm2
+        vpermq	$0x40, %ymm1, %ymm11
+        vpermq	$3, %ymm0, %ymm1
+        vpermq	$0x94, %ymm0, %ymm0
+        vpblendd	$0xc0, %ymm8, %ymm6, %ymm6
+        vpblendd	$0xfc, %ymm9, %ymm5, %ymm5
+        vpblendd	$0xc0, %ymm10, %ymm2, %ymm2
+        vpblendd	$0xfc, %ymm11, %ymm1, %ymm1
+        vpshufb	%ymm12, %ymm0, %ymm0
+        vpshufb	%ymm12, %ymm1, %ymm1
+        vpshufb	%ymm12, %ymm2, %ymm2
+        vpshufb	%ymm12, %ymm3, %ymm3
+        vpshufb	%ymm12, %ymm4, %ymm4
+        vpshufb	%ymm12, %ymm5, %ymm5
+        vpshufb	%ymm12, %ymm6, %ymm6
+        vpshufb	%ymm12, %ymm7, %ymm7
+        vpandn	%ymm0, %ymm13, %ymm8
+        vpandn	%ymm1, %ymm13, %ymm9
+        vpandn	%ymm2, %ymm13, %ymm10
+        vpandn	%ymm3, %ymm13, %ymm11
+        vpand	%ymm0, %ymm13, %ymm0
+        vpand	%ymm1, %ymm13, %ymm1
+        vpand	%ymm2, %ymm13, %ymm2
+        vpand	%ymm3, %ymm13, %ymm3
+        vpslld	$4, %ymm8, %ymm8
+        vpslld	$4, %ymm9, %ymm9
+        vpslld	$4, %ymm10, %ymm10
+        vpslld	$4, %ymm11, %ymm11
+        vpor	%ymm8, %ymm0, %ymm0
+        vpor	%ymm9, %ymm1, %ymm1
+        vpor	%ymm10, %ymm2, %ymm2
+        vpor	%ymm11, %ymm3, %ymm3
+        vpandn	%ymm4, %ymm13, %ymm8
+        vpandn	%ymm5, %ymm13, %ymm9
+        vpandn	%ymm6, %ymm13, %ymm10
+        vpandn	%ymm7, %ymm13, %ymm11
+        vpand	%ymm4, %ymm13, %ymm4
+        vpand	%ymm5, %ymm13, %ymm5
+        vpand	%ymm6, %ymm13, %ymm6
+        vpand	%ymm7, %ymm13, %ymm7
+        vpslld	$4, %ymm8, %ymm8
+        vpslld	$4, %ymm9, %ymm9
+        vpslld	$4, %ymm10, %ymm10
+        vpslld	$4, %ymm11, %ymm11
+        vpor	%ymm8, %ymm4, %ymm4
+        vpor	%ymm9, %ymm5, %ymm5
+        vpor	%ymm10, %ymm6, %ymm6
+        vpor	%ymm11, %ymm7, %ymm7
+        vmovdqu	%ymm0, 256(%rdi)
+        vmovdqu	%ymm1, 288(%rdi)
+        vmovdqu	%ymm2, 320(%rdi)
+        vmovdqu	%ymm3, 352(%rdi)
+        vmovdqu	%ymm4, 384(%rdi)
+        vmovdqu	%ymm5, 416(%rdi)
+        vmovdqu	%ymm6, 448(%rdi)
+        vmovdqu	%ymm7, 480(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_from_bytes_avx2,.-kyber_from_bytes_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_to_bytes_avx2_mask:
+.long	0xfff,0xfff,0xfff,0xfff
+.long	0xfff,0xfff,0xfff,0xfff
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_kyber_to_bytes_avx2_shuf:
+.value	0x100,0x402
+.value	0x605,0x908
+.value	0xc0a,0xe0d
+.value	0xffff,0xffff
+.value	0x605,0x908
+.value	0xc0a,0xe0d
+.value	0xffff,0xffff
+.value	0x100,0x402
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+L_kyber_to_bytes_avx2_perm:
+.long	0x0,0x1,0x2,0x7
+.long	0x4,0x5,0x3,0x6
+#ifndef __APPLE__
+.text
+.globl	kyber_to_bytes_avx2
+.type	kyber_to_bytes_avx2,@function
+.align	16
+kyber_to_bytes_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_to_bytes_avx2
+.p2align	4
+_kyber_to_bytes_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	kyber_q(%rip), %ymm12
+        vmovdqu	L_kyber_to_bytes_avx2_mask(%rip), %ymm13
+        vmovdqu	L_kyber_to_bytes_avx2_shuf(%rip), %ymm14
+        vmovdqu	L_kyber_to_bytes_avx2_perm(%rip), %ymm15
+        vmovdqu	(%rsi), %ymm0
+        vmovdqu	32(%rsi), %ymm1
+        vmovdqu	64(%rsi), %ymm2
+        vmovdqu	96(%rsi), %ymm3
+        vmovdqu	128(%rsi), %ymm4
+        vmovdqu	160(%rsi), %ymm5
+        vmovdqu	192(%rsi), %ymm6
+        vmovdqu	224(%rsi), %ymm7
+        vpsubw	%ymm12, %ymm0, %ymm8
+        vpsubw	%ymm12, %ymm1, %ymm9
+        vpsubw	%ymm12, %ymm2, %ymm10
+        vpsubw	%ymm12, %ymm3, %ymm11
+        vpsraw	$15, %ymm8, %ymm0
+        vpsraw	$15, %ymm9, %ymm1
+        vpsraw	$15, %ymm10, %ymm2
+        vpsraw	$15, %ymm11, %ymm3
+        vpand	%ymm12, %ymm0, %ymm0
+        vpand	%ymm12, %ymm1, %ymm1
+        vpand	%ymm12, %ymm2, %ymm2
+        vpand	%ymm12, %ymm3, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpaddw	%ymm10, %ymm2, %ymm2
+        vpaddw	%ymm11, %ymm3, %ymm3
+        vpsubw	%ymm12, %ymm4, %ymm8
+        vpsubw	%ymm12, %ymm5, %ymm9
+        vpsubw	%ymm12, %ymm6, %ymm10
+        vpsubw	%ymm12, %ymm7, %ymm11
+        vpsraw	$15, %ymm8, %ymm4
+        vpsraw	$15, %ymm9, %ymm5
+        vpsraw	$15, %ymm10, %ymm6
+        vpsraw	$15, %ymm11, %ymm7
+        vpand	%ymm12, %ymm4, %ymm4
+        vpand	%ymm12, %ymm5, %ymm5
+        vpand	%ymm12, %ymm6, %ymm6
+        vpand	%ymm12, %ymm7, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        vpaddw	%ymm10, %ymm6, %ymm6
+        vpaddw	%ymm11, %ymm7, %ymm7
+        vpsrld	$16, %ymm0, %ymm8
+        vpsrld	$16, %ymm1, %ymm9
+        vpsrld	$16, %ymm2, %ymm10
+        vpsrld	$16, %ymm3, %ymm11
+        vpand	%ymm0, %ymm13, %ymm0
+        vpand	%ymm1, %ymm13, %ymm1
+        vpand	%ymm2, %ymm13, %ymm2
+        vpand	%ymm3, %ymm13, %ymm3
+        vpslld	$12, %ymm8, %ymm8
+        vpslld	$12, %ymm9, %ymm9
+        vpslld	$12, %ymm10, %ymm10
+        vpslld	$12, %ymm11, %ymm11
+        vpor	%ymm8, %ymm0, %ymm0
+        vpor	%ymm9, %ymm1, %ymm1
+        vpor	%ymm10, %ymm2, %ymm2
+        vpor	%ymm11, %ymm3, %ymm3
+        vpsrld	$16, %ymm4, %ymm8
+        vpsrld	$16, %ymm5, %ymm9
+        vpsrld	$16, %ymm6, %ymm10
+        vpsrld	$16, %ymm7, %ymm11
+        vpand	%ymm4, %ymm13, %ymm4
+        vpand	%ymm5, %ymm13, %ymm5
+        vpand	%ymm6, %ymm13, %ymm6
+        vpand	%ymm7, %ymm13, %ymm7
+        vpslld	$12, %ymm8, %ymm8
+        vpslld	$12, %ymm9, %ymm9
+        vpslld	$12, %ymm10, %ymm10
+        vpslld	$12, %ymm11, %ymm11
+        vpor	%ymm8, %ymm4, %ymm4
+        vpor	%ymm9, %ymm5, %ymm5
+        vpor	%ymm10, %ymm6, %ymm6
+        vpor	%ymm11, %ymm7, %ymm7
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm1, %ymm1
+        vpshufb	%ymm14, %ymm2, %ymm2
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm4, %ymm4
+        vpshufb	%ymm14, %ymm5, %ymm5
+        vpshufb	%ymm14, %ymm6, %ymm6
+        vpshufb	%ymm14, %ymm7, %ymm7
+        vpermd	%ymm0, %ymm15, %ymm0
+        vpermd	%ymm1, %ymm15, %ymm1
+        vpermd	%ymm2, %ymm15, %ymm2
+        vpermd	%ymm3, %ymm15, %ymm3
+        vpermd	%ymm4, %ymm15, %ymm4
+        vpermd	%ymm5, %ymm15, %ymm5
+        vpermd	%ymm6, %ymm15, %ymm6
+        vpermd	%ymm7, %ymm15, %ymm7
+        vpermq	$2, %ymm6, %ymm8
+        vpermq	$0x90, %ymm7, %ymm7
+        vpermq	$9, %ymm5, %ymm9
+        vpermq	$0x40, %ymm6, %ymm6
+        vpermq	$0x00, %ymm5, %ymm5
+        vpblendd	$63, %ymm4, %ymm5, %ymm5
+        vpermq	$2, %ymm2, %ymm10
+        vpermq	$0x90, %ymm3, %ymm4
+        vpermq	$9, %ymm1, %ymm11
+        vpermq	$0x40, %ymm2, %ymm3
+        vpermq	$0x00, %ymm1, %ymm2
+        vpblendd	$63, %ymm0, %ymm2, %ymm2
+        vpblendd	$3, %ymm8, %ymm7, %ymm7
+        vpblendd	$15, %ymm9, %ymm6, %ymm6
+        vpblendd	$3, %ymm10, %ymm4, %ymm4
+        vpblendd	$15, %ymm11, %ymm3, %ymm3
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, 64(%rdi)
+        vmovdqu	%ymm5, 96(%rdi)
+        vmovdqu	%ymm6, 128(%rdi)
+        vmovdqu	%ymm7, 160(%rdi)
+        vmovdqu	256(%rsi), %ymm0
+        vmovdqu	288(%rsi), %ymm1
+        vmovdqu	320(%rsi), %ymm2
+        vmovdqu	352(%rsi), %ymm3
+        vmovdqu	384(%rsi), %ymm4
+        vmovdqu	416(%rsi), %ymm5
+        vmovdqu	448(%rsi), %ymm6
+        vmovdqu	480(%rsi), %ymm7
+        vpsubw	%ymm12, %ymm0, %ymm8
+        vpsubw	%ymm12, %ymm1, %ymm9
+        vpsubw	%ymm12, %ymm2, %ymm10
+        vpsubw	%ymm12, %ymm3, %ymm11
+        vpsraw	$15, %ymm8, %ymm0
+        vpsraw	$15, %ymm9, %ymm1
+        vpsraw	$15, %ymm10, %ymm2
+        vpsraw	$15, %ymm11, %ymm3
+        vpand	%ymm12, %ymm0, %ymm0
+        vpand	%ymm12, %ymm1, %ymm1
+        vpand	%ymm12, %ymm2, %ymm2
+        vpand	%ymm12, %ymm3, %ymm3
+        vpaddw	%ymm8, %ymm0, %ymm0
+        vpaddw	%ymm9, %ymm1, %ymm1
+        vpaddw	%ymm10, %ymm2, %ymm2
+        vpaddw	%ymm11, %ymm3, %ymm3
+        vpsubw	%ymm12, %ymm4, %ymm8
+        vpsubw	%ymm12, %ymm5, %ymm9
+        vpsubw	%ymm12, %ymm6, %ymm10
+        vpsubw	%ymm12, %ymm7, %ymm11
+        vpsraw	$15, %ymm8, %ymm4
+        vpsraw	$15, %ymm9, %ymm5
+        vpsraw	$15, %ymm10, %ymm6
+        vpsraw	$15, %ymm11, %ymm7
+        vpand	%ymm12, %ymm4, %ymm4
+        vpand	%ymm12, %ymm5, %ymm5
+        vpand	%ymm12, %ymm6, %ymm6
+        vpand	%ymm12, %ymm7, %ymm7
+        vpaddw	%ymm8, %ymm4, %ymm4
+        vpaddw	%ymm9, %ymm5, %ymm5
+        vpaddw	%ymm10, %ymm6, %ymm6
+        vpaddw	%ymm11, %ymm7, %ymm7
+        vpsrld	$16, %ymm0, %ymm8
+        vpsrld	$16, %ymm1, %ymm9
+        vpsrld	$16, %ymm2, %ymm10
+        vpsrld	$16, %ymm3, %ymm11
+        vpand	%ymm0, %ymm13, %ymm0
+        vpand	%ymm1, %ymm13, %ymm1
+        vpand	%ymm2, %ymm13, %ymm2
+        vpand	%ymm3, %ymm13, %ymm3
+        vpslld	$12, %ymm8, %ymm8
+        vpslld	$12, %ymm9, %ymm9
+        vpslld	$12, %ymm10, %ymm10
+        vpslld	$12, %ymm11, %ymm11
+        vpor	%ymm8, %ymm0, %ymm0
+        vpor	%ymm9, %ymm1, %ymm1
+        vpor	%ymm10, %ymm2, %ymm2
+        vpor	%ymm11, %ymm3, %ymm3
+        vpsrld	$16, %ymm4, %ymm8
+        vpsrld	$16, %ymm5, %ymm9
+        vpsrld	$16, %ymm6, %ymm10
+        vpsrld	$16, %ymm7, %ymm11
+        vpand	%ymm4, %ymm13, %ymm4
+        vpand	%ymm5, %ymm13, %ymm5
+        vpand	%ymm6, %ymm13, %ymm6
+        vpand	%ymm7, %ymm13, %ymm7
+        vpslld	$12, %ymm8, %ymm8
+        vpslld	$12, %ymm9, %ymm9
+        vpslld	$12, %ymm10, %ymm10
+        vpslld	$12, %ymm11, %ymm11
+        vpor	%ymm8, %ymm4, %ymm4
+        vpor	%ymm9, %ymm5, %ymm5
+        vpor	%ymm10, %ymm6, %ymm6
+        vpor	%ymm11, %ymm7, %ymm7
+        vpshufb	%ymm14, %ymm0, %ymm0
+        vpshufb	%ymm14, %ymm1, %ymm1
+        vpshufb	%ymm14, %ymm2, %ymm2
+        vpshufb	%ymm14, %ymm3, %ymm3
+        vpshufb	%ymm14, %ymm4, %ymm4
+        vpshufb	%ymm14, %ymm5, %ymm5
+        vpshufb	%ymm14, %ymm6, %ymm6
+        vpshufb	%ymm14, %ymm7, %ymm7
+        vpermd	%ymm0, %ymm15, %ymm0
+        vpermd	%ymm1, %ymm15, %ymm1
+        vpermd	%ymm2, %ymm15, %ymm2
+        vpermd	%ymm3, %ymm15, %ymm3
+        vpermd	%ymm4, %ymm15, %ymm4
+        vpermd	%ymm5, %ymm15, %ymm5
+        vpermd	%ymm6, %ymm15, %ymm6
+        vpermd	%ymm7, %ymm15, %ymm7
+        vpermq	$2, %ymm6, %ymm8
+        vpermq	$0x90, %ymm7, %ymm7
+        vpermq	$9, %ymm5, %ymm9
+        vpermq	$0x40, %ymm6, %ymm6
+        vpermq	$0x00, %ymm5, %ymm5
+        vpblendd	$63, %ymm4, %ymm5, %ymm5
+        vpermq	$2, %ymm2, %ymm10
+        vpermq	$0x90, %ymm3, %ymm4
+        vpermq	$9, %ymm1, %ymm11
+        vpermq	$0x40, %ymm2, %ymm3
+        vpermq	$0x00, %ymm1, %ymm2
+        vpblendd	$63, %ymm0, %ymm2, %ymm2
+        vpblendd	$3, %ymm8, %ymm7, %ymm7
+        vpblendd	$15, %ymm9, %ymm6, %ymm6
+        vpblendd	$3, %ymm10, %ymm4, %ymm4
+        vpblendd	$15, %ymm11, %ymm3, %ymm3
+        vmovdqu	%ymm2, 192(%rdi)
+        vmovdqu	%ymm3, 224(%rdi)
+        vmovdqu	%ymm4, 256(%rdi)
+        vmovdqu	%ymm5, 288(%rdi)
+        vmovdqu	%ymm6, 320(%rdi)
+        vmovdqu	%ymm7, 352(%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_to_bytes_avx2,.-kyber_to_bytes_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.text
+.globl	kyber_cmp_avx2
+.type	kyber_cmp_avx2,@function
+.align	16
+kyber_cmp_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_cmp_avx2
+.p2align	4
+_kyber_cmp_avx2:
+#endif /* __APPLE__ */
+        vpxor	%ymm2, %ymm2, %ymm2
+        vpxor	%ymm3, %ymm3, %ymm3
+        movl	$0x00, %ecx
+        movl	$-1, %r8d
+        vmovdqu	(%rdi), %ymm0
+        vmovdqu	32(%rdi), %ymm1
+        vpxor	(%rsi), %ymm0, %ymm0
+        vpxor	32(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	64(%rdi), %ymm0
+        vmovdqu	96(%rdi), %ymm1
+        vpxor	64(%rsi), %ymm0, %ymm0
+        vpxor	96(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	128(%rdi), %ymm0
+        vmovdqu	160(%rdi), %ymm1
+        vpxor	128(%rsi), %ymm0, %ymm0
+        vpxor	160(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	192(%rdi), %ymm0
+        vmovdqu	224(%rdi), %ymm1
+        vpxor	192(%rsi), %ymm0, %ymm0
+        vpxor	224(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	256(%rdi), %ymm0
+        vmovdqu	288(%rdi), %ymm1
+        vpxor	256(%rsi), %ymm0, %ymm0
+        vpxor	288(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	320(%rdi), %ymm0
+        vmovdqu	352(%rdi), %ymm1
+        vpxor	320(%rsi), %ymm0, %ymm0
+        vpxor	352(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	384(%rdi), %ymm0
+        vmovdqu	416(%rdi), %ymm1
+        vpxor	384(%rsi), %ymm0, %ymm0
+        vpxor	416(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	448(%rdi), %ymm0
+        vmovdqu	480(%rdi), %ymm1
+        vpxor	448(%rsi), %ymm0, %ymm0
+        vpxor	480(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	512(%rdi), %ymm0
+        vmovdqu	544(%rdi), %ymm1
+        vpxor	512(%rsi), %ymm0, %ymm0
+        vpxor	544(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	576(%rdi), %ymm0
+        vmovdqu	608(%rdi), %ymm1
+        vpxor	576(%rsi), %ymm0, %ymm0
+        vpxor	608(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	640(%rdi), %ymm0
+        vmovdqu	672(%rdi), %ymm1
+        vpxor	640(%rsi), %ymm0, %ymm0
+        vpxor	672(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	704(%rdi), %ymm0
+        vmovdqu	736(%rdi), %ymm1
+        vpxor	704(%rsi), %ymm0, %ymm0
+        vpxor	736(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        subl	$0x300, %edx
+        jz	L_kyber_cmp_avx2_done
+        vmovdqu	768(%rdi), %ymm0
+        vmovdqu	800(%rdi), %ymm1
+        vpxor	768(%rsi), %ymm0, %ymm0
+        vpxor	800(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	832(%rdi), %ymm0
+        vmovdqu	864(%rdi), %ymm1
+        vpxor	832(%rsi), %ymm0, %ymm0
+        vpxor	864(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	896(%rdi), %ymm0
+        vmovdqu	928(%rdi), %ymm1
+        vpxor	896(%rsi), %ymm0, %ymm0
+        vpxor	928(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	960(%rdi), %ymm0
+        vmovdqu	992(%rdi), %ymm1
+        vpxor	960(%rsi), %ymm0, %ymm0
+        vpxor	992(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	1024(%rdi), %ymm0
+        vmovdqu	1056(%rdi), %ymm1
+        vpxor	1024(%rsi), %ymm0, %ymm0
+        vpxor	1056(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        subl	$0x140, %edx
+        jz	L_kyber_cmp_avx2_done
+        vmovdqu	1088(%rdi), %ymm0
+        vmovdqu	1120(%rdi), %ymm1
+        vpxor	1088(%rsi), %ymm0, %ymm0
+        vpxor	1120(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	1152(%rdi), %ymm0
+        vmovdqu	1184(%rdi), %ymm1
+        vpxor	1152(%rsi), %ymm0, %ymm0
+        vpxor	1184(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	1216(%rdi), %ymm0
+        vmovdqu	1248(%rdi), %ymm1
+        vpxor	1216(%rsi), %ymm0, %ymm0
+        vpxor	1248(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	1280(%rdi), %ymm0
+        vmovdqu	1312(%rdi), %ymm1
+        vpxor	1280(%rsi), %ymm0, %ymm0
+        vpxor	1312(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	1344(%rdi), %ymm0
+        vmovdqu	1376(%rdi), %ymm1
+        vpxor	1344(%rsi), %ymm0, %ymm0
+        vpxor	1376(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	1408(%rdi), %ymm0
+        vmovdqu	1440(%rdi), %ymm1
+        vpxor	1408(%rsi), %ymm0, %ymm0
+        vpxor	1440(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+        vmovdqu	1472(%rdi), %ymm0
+        vmovdqu	1504(%rdi), %ymm1
+        vpxor	1472(%rsi), %ymm0, %ymm0
+        vpxor	1504(%rsi), %ymm1, %ymm1
+        vpor	%ymm0, %ymm2, %ymm2
+        vpor	%ymm1, %ymm3, %ymm3
+L_kyber_cmp_avx2_done:
+        vpor	%ymm3, %ymm2, %ymm2
+        vptest	%ymm2, %ymm2
+        cmovzl	%ecx, %eax
+        cmovnzl	%r8d, %eax
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_cmp_avx2,.-kyber_cmp_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.text
+.globl	kyber_redistribute_21_rand_avx2
+.type	kyber_redistribute_21_rand_avx2,@function
+.align	16
+kyber_redistribute_21_rand_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_redistribute_21_rand_avx2
+.p2align	4
+_kyber_redistribute_21_rand_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	(%rdi), %ymm0
+        vmovdqu	32(%rdi), %ymm1
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vmovdqu	128(%rdi), %ymm4
+        vmovdqu	160(%rdi), %ymm5
+        vmovdqu	192(%rdi), %ymm6
+        vmovdqu	224(%rdi), %ymm7
+        vmovdqu	256(%rdi), %ymm8
+        vmovdqu	288(%rdi), %ymm9
+        vmovdqu	320(%rdi), %ymm10
+        vmovdqu	352(%rdi), %ymm11
+        vpunpcklqdq	%ymm1, %ymm0, %ymm12
+        vpunpckhqdq	%ymm1, %ymm0, %ymm13
+        vpunpcklqdq	%ymm3, %ymm2, %ymm14
+        vpunpckhqdq	%ymm3, %ymm2, %ymm15
+        vperm2i128	$32, %ymm14, %ymm12, %ymm0
+        vperm2i128	$32, %ymm15, %ymm13, %ymm1
+        vperm2i128	$49, %ymm14, %ymm12, %ymm2
+        vperm2i128	$49, %ymm15, %ymm13, %ymm3
+        vpunpcklqdq	%ymm5, %ymm4, %ymm12
+        vpunpckhqdq	%ymm5, %ymm4, %ymm13
+        vpunpcklqdq	%ymm7, %ymm6, %ymm14
+        vpunpckhqdq	%ymm7, %ymm6, %ymm15
+        vperm2i128	$32, %ymm14, %ymm12, %ymm4
+        vperm2i128	$32, %ymm15, %ymm13, %ymm5
+        vperm2i128	$49, %ymm14, %ymm12, %ymm6
+        vperm2i128	$49, %ymm15, %ymm13, %ymm7
+        vpunpcklqdq	%ymm9, %ymm8, %ymm12
+        vpunpckhqdq	%ymm9, %ymm8, %ymm13
+        vpunpcklqdq	%ymm11, %ymm10, %ymm14
+        vpunpckhqdq	%ymm11, %ymm10, %ymm15
+        vperm2i128	$32, %ymm14, %ymm12, %ymm8
+        vperm2i128	$32, %ymm15, %ymm13, %ymm9
+        vperm2i128	$49, %ymm14, %ymm12, %ymm10
+        vperm2i128	$49, %ymm15, %ymm13, %ymm11
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm4, 32(%rsi)
+        vmovdqu	%ymm8, 64(%rsi)
+        vmovdqu	%ymm1, (%rdx)
+        vmovdqu	%ymm5, 32(%rdx)
+        vmovdqu	%ymm9, 64(%rdx)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm6, 32(%rcx)
+        vmovdqu	%ymm10, 64(%rcx)
+        vmovdqu	%ymm3, (%r8)
+        vmovdqu	%ymm7, 32(%r8)
+        vmovdqu	%ymm11, 64(%r8)
+        vmovdqu	384(%rdi), %ymm0
+        vmovdqu	416(%rdi), %ymm1
+        vmovdqu	448(%rdi), %ymm2
+        vmovdqu	480(%rdi), %ymm3
+        vmovdqu	512(%rdi), %ymm4
+        vmovdqu	544(%rdi), %ymm5
+        vmovdqu	576(%rdi), %ymm6
+        vmovdqu	608(%rdi), %ymm7
+        movq	640(%rdi), %rax
+        movq	648(%rdi), %r9
+        movq	656(%rdi), %r10
+        movq	664(%rdi), %r11
+        vpunpcklqdq	%ymm1, %ymm0, %ymm12
+        vpunpckhqdq	%ymm1, %ymm0, %ymm13
+        vpunpcklqdq	%ymm3, %ymm2, %ymm14
+        vpunpckhqdq	%ymm3, %ymm2, %ymm15
+        vperm2i128	$32, %ymm14, %ymm12, %ymm0
+        vperm2i128	$32, %ymm15, %ymm13, %ymm1
+        vperm2i128	$49, %ymm14, %ymm12, %ymm2
+        vperm2i128	$49, %ymm15, %ymm13, %ymm3
+        vpunpcklqdq	%ymm5, %ymm4, %ymm12
+        vpunpckhqdq	%ymm5, %ymm4, %ymm13
+        vpunpcklqdq	%ymm7, %ymm6, %ymm14
+        vpunpckhqdq	%ymm7, %ymm6, %ymm15
+        vperm2i128	$32, %ymm14, %ymm12, %ymm4
+        vperm2i128	$32, %ymm15, %ymm13, %ymm5
+        vperm2i128	$49, %ymm14, %ymm12, %ymm6
+        vperm2i128	$49, %ymm15, %ymm13, %ymm7
+        vmovdqu	%ymm0, 96(%rsi)
+        vmovdqu	%ymm4, 128(%rsi)
+        movq	%rax, 160(%rsi)
+        vmovdqu	%ymm1, 96(%rdx)
+        vmovdqu	%ymm5, 128(%rdx)
+        movq	%r9, 160(%rdx)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm6, 128(%rcx)
+        movq	%r10, 160(%rcx)
+        vmovdqu	%ymm3, 96(%r8)
+        vmovdqu	%ymm7, 128(%r8)
+        movq	%r11, 160(%r8)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_redistribute_21_rand_avx2,.-kyber_redistribute_21_rand_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.text
+.globl	kyber_redistribute_17_rand_avx2
+.type	kyber_redistribute_17_rand_avx2,@function
+.align	16
+kyber_redistribute_17_rand_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_redistribute_17_rand_avx2
+.p2align	4
+_kyber_redistribute_17_rand_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	(%rdi), %ymm0
+        vmovdqu	32(%rdi), %ymm1
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vmovdqu	128(%rdi), %ymm4
+        vmovdqu	160(%rdi), %ymm5
+        vmovdqu	192(%rdi), %ymm6
+        vmovdqu	224(%rdi), %ymm7
+        vpunpcklqdq	%ymm1, %ymm0, %ymm8
+        vpunpckhqdq	%ymm1, %ymm0, %ymm9
+        vpunpcklqdq	%ymm3, %ymm2, %ymm10
+        vpunpckhqdq	%ymm3, %ymm2, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm0
+        vperm2i128	$32, %ymm11, %ymm9, %ymm1
+        vperm2i128	$49, %ymm10, %ymm8, %ymm2
+        vperm2i128	$49, %ymm11, %ymm9, %ymm3
+        vpunpcklqdq	%ymm5, %ymm4, %ymm8
+        vpunpckhqdq	%ymm5, %ymm4, %ymm9
+        vpunpcklqdq	%ymm7, %ymm6, %ymm10
+        vpunpckhqdq	%ymm7, %ymm6, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm4
+        vperm2i128	$32, %ymm11, %ymm9, %ymm5
+        vperm2i128	$49, %ymm10, %ymm8, %ymm6
+        vperm2i128	$49, %ymm11, %ymm9, %ymm7
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm4, 32(%rsi)
+        vmovdqu	%ymm1, (%rdx)
+        vmovdqu	%ymm5, 32(%rdx)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm6, 32(%rcx)
+        vmovdqu	%ymm3, (%r8)
+        vmovdqu	%ymm7, 32(%r8)
+        vmovdqu	256(%rdi), %ymm0
+        vmovdqu	288(%rdi), %ymm1
+        vmovdqu	320(%rdi), %ymm2
+        vmovdqu	352(%rdi), %ymm3
+        vmovdqu	384(%rdi), %ymm4
+        vmovdqu	416(%rdi), %ymm5
+        vmovdqu	448(%rdi), %ymm6
+        vmovdqu	480(%rdi), %ymm7
+        movq	512(%rdi), %rax
+        movq	520(%rdi), %r9
+        movq	528(%rdi), %r10
+        movq	536(%rdi), %r11
+        vpunpcklqdq	%ymm1, %ymm0, %ymm8
+        vpunpckhqdq	%ymm1, %ymm0, %ymm9
+        vpunpcklqdq	%ymm3, %ymm2, %ymm10
+        vpunpckhqdq	%ymm3, %ymm2, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm0
+        vperm2i128	$32, %ymm11, %ymm9, %ymm1
+        vperm2i128	$49, %ymm10, %ymm8, %ymm2
+        vperm2i128	$49, %ymm11, %ymm9, %ymm3
+        vpunpcklqdq	%ymm5, %ymm4, %ymm8
+        vpunpckhqdq	%ymm5, %ymm4, %ymm9
+        vpunpcklqdq	%ymm7, %ymm6, %ymm10
+        vpunpckhqdq	%ymm7, %ymm6, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm4
+        vperm2i128	$32, %ymm11, %ymm9, %ymm5
+        vperm2i128	$49, %ymm10, %ymm8, %ymm6
+        vperm2i128	$49, %ymm11, %ymm9, %ymm7
+        vmovdqu	%ymm0, 64(%rsi)
+        vmovdqu	%ymm4, 96(%rsi)
+        movq	%rax, 128(%rsi)
+        vmovdqu	%ymm1, 64(%rdx)
+        vmovdqu	%ymm5, 96(%rdx)
+        movq	%r9, 128(%rdx)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm6, 96(%rcx)
+        movq	%r10, 128(%rcx)
+        vmovdqu	%ymm3, 64(%r8)
+        vmovdqu	%ymm7, 96(%r8)
+        movq	%r11, 128(%r8)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_redistribute_17_rand_avx2,.-kyber_redistribute_17_rand_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.text
+.globl	kyber_redistribute_16_rand_avx2
+.type	kyber_redistribute_16_rand_avx2,@function
+.align	16
+kyber_redistribute_16_rand_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_redistribute_16_rand_avx2
+.p2align	4
+_kyber_redistribute_16_rand_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	(%rdi), %ymm0
+        vmovdqu	32(%rdi), %ymm1
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vmovdqu	128(%rdi), %ymm4
+        vmovdqu	160(%rdi), %ymm5
+        vmovdqu	192(%rdi), %ymm6
+        vmovdqu	224(%rdi), %ymm7
+        vpunpcklqdq	%ymm1, %ymm0, %ymm8
+        vpunpckhqdq	%ymm1, %ymm0, %ymm9
+        vpunpcklqdq	%ymm3, %ymm2, %ymm10
+        vpunpckhqdq	%ymm3, %ymm2, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm0
+        vperm2i128	$32, %ymm11, %ymm9, %ymm1
+        vperm2i128	$49, %ymm10, %ymm8, %ymm2
+        vperm2i128	$49, %ymm11, %ymm9, %ymm3
+        vpunpcklqdq	%ymm5, %ymm4, %ymm8
+        vpunpckhqdq	%ymm5, %ymm4, %ymm9
+        vpunpcklqdq	%ymm7, %ymm6, %ymm10
+        vpunpckhqdq	%ymm7, %ymm6, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm4
+        vperm2i128	$32, %ymm11, %ymm9, %ymm5
+        vperm2i128	$49, %ymm10, %ymm8, %ymm6
+        vperm2i128	$49, %ymm11, %ymm9, %ymm7
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm4, 32(%rsi)
+        vmovdqu	%ymm1, (%rdx)
+        vmovdqu	%ymm5, 32(%rdx)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm6, 32(%rcx)
+        vmovdqu	%ymm3, (%r8)
+        vmovdqu	%ymm7, 32(%r8)
+        vmovdqu	256(%rdi), %ymm0
+        vmovdqu	288(%rdi), %ymm1
+        vmovdqu	320(%rdi), %ymm2
+        vmovdqu	352(%rdi), %ymm3
+        vmovdqu	384(%rdi), %ymm4
+        vmovdqu	416(%rdi), %ymm5
+        vmovdqu	448(%rdi), %ymm6
+        vmovdqu	480(%rdi), %ymm7
+        vpunpcklqdq	%ymm1, %ymm0, %ymm8
+        vpunpckhqdq	%ymm1, %ymm0, %ymm9
+        vpunpcklqdq	%ymm3, %ymm2, %ymm10
+        vpunpckhqdq	%ymm3, %ymm2, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm0
+        vperm2i128	$32, %ymm11, %ymm9, %ymm1
+        vperm2i128	$49, %ymm10, %ymm8, %ymm2
+        vperm2i128	$49, %ymm11, %ymm9, %ymm3
+        vpunpcklqdq	%ymm5, %ymm4, %ymm8
+        vpunpckhqdq	%ymm5, %ymm4, %ymm9
+        vpunpcklqdq	%ymm7, %ymm6, %ymm10
+        vpunpckhqdq	%ymm7, %ymm6, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm4
+        vperm2i128	$32, %ymm11, %ymm9, %ymm5
+        vperm2i128	$49, %ymm10, %ymm8, %ymm6
+        vperm2i128	$49, %ymm11, %ymm9, %ymm7
+        vmovdqu	%ymm0, 64(%rsi)
+        vmovdqu	%ymm4, 96(%rsi)
+        vmovdqu	%ymm1, 64(%rdx)
+        vmovdqu	%ymm5, 96(%rdx)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm6, 96(%rcx)
+        vmovdqu	%ymm3, 64(%r8)
+        vmovdqu	%ymm7, 96(%r8)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_redistribute_16_rand_avx2,.-kyber_redistribute_16_rand_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.text
+.globl	kyber_redistribute_8_rand_avx2
+.type	kyber_redistribute_8_rand_avx2,@function
+.align	16
+kyber_redistribute_8_rand_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_redistribute_8_rand_avx2
+.p2align	4
+_kyber_redistribute_8_rand_avx2:
+#endif /* __APPLE__ */
+        vmovdqu	(%rdi), %ymm0
+        vmovdqu	32(%rdi), %ymm1
+        vmovdqu	64(%rdi), %ymm2
+        vmovdqu	96(%rdi), %ymm3
+        vmovdqu	128(%rdi), %ymm4
+        vmovdqu	160(%rdi), %ymm5
+        vmovdqu	192(%rdi), %ymm6
+        vmovdqu	224(%rdi), %ymm7
+        vpunpcklqdq	%ymm1, %ymm0, %ymm8
+        vpunpckhqdq	%ymm1, %ymm0, %ymm9
+        vpunpcklqdq	%ymm3, %ymm2, %ymm10
+        vpunpckhqdq	%ymm3, %ymm2, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm0
+        vperm2i128	$32, %ymm11, %ymm9, %ymm1
+        vperm2i128	$49, %ymm10, %ymm8, %ymm2
+        vperm2i128	$49, %ymm11, %ymm9, %ymm3
+        vpunpcklqdq	%ymm5, %ymm4, %ymm8
+        vpunpckhqdq	%ymm5, %ymm4, %ymm9
+        vpunpcklqdq	%ymm7, %ymm6, %ymm10
+        vpunpckhqdq	%ymm7, %ymm6, %ymm11
+        vperm2i128	$32, %ymm10, %ymm8, %ymm4
+        vperm2i128	$32, %ymm11, %ymm9, %ymm5
+        vperm2i128	$49, %ymm10, %ymm8, %ymm6
+        vperm2i128	$49, %ymm11, %ymm9, %ymm7
+        vmovdqu	%ymm0, (%rsi)
+        vmovdqu	%ymm4, 32(%rsi)
+        vmovdqu	%ymm1, (%rdx)
+        vmovdqu	%ymm5, 32(%rdx)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm6, 32(%rcx)
+        vmovdqu	%ymm3, (%r8)
+        vmovdqu	%ymm7, 32(%r8)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_redistribute_8_rand_avx2,.-kyber_redistribute_8_rand_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	16
+#else
+.p2align	4
+#endif /* __APPLE__ */
+L_sha3_parallel_4_r:
+.quad	0x1,0x1
+.quad	0x1,0x1
+.quad	0x8082,0x8082
+.quad	0x8082,0x8082
+.quad	0x800000000000808a,0x800000000000808a
+.quad	0x800000000000808a,0x800000000000808a
+.quad	0x8000000080008000,0x8000000080008000
+.quad	0x8000000080008000,0x8000000080008000
+.quad	0x808b,0x808b
+.quad	0x808b,0x808b
+.quad	0x80000001,0x80000001
+.quad	0x80000001,0x80000001
+.quad	0x8000000080008081,0x8000000080008081
+.quad	0x8000000080008081,0x8000000080008081
+.quad	0x8000000000008009,0x8000000000008009
+.quad	0x8000000000008009,0x8000000000008009
+.quad	0x8a,0x8a
+.quad	0x8a,0x8a
+.quad	0x88,0x88
+.quad	0x88,0x88
+.quad	0x80008009,0x80008009
+.quad	0x80008009,0x80008009
+.quad	0x8000000a,0x8000000a
+.quad	0x8000000a,0x8000000a
+.quad	0x8000808b,0x8000808b
+.quad	0x8000808b,0x8000808b
+.quad	0x800000000000008b,0x800000000000008b
+.quad	0x800000000000008b,0x800000000000008b
+.quad	0x8000000000008089,0x8000000000008089
+.quad	0x8000000000008089,0x8000000000008089
+.quad	0x8000000000008003,0x8000000000008003
+.quad	0x8000000000008003,0x8000000000008003
+.quad	0x8000000000008002,0x8000000000008002
+.quad	0x8000000000008002,0x8000000000008002
+.quad	0x8000000000000080,0x8000000000000080
+.quad	0x8000000000000080,0x8000000000000080
+.quad	0x800a,0x800a
+.quad	0x800a,0x800a
+.quad	0x800000008000000a,0x800000008000000a
+.quad	0x800000008000000a,0x800000008000000a
+.quad	0x8000000080008081,0x8000000080008081
+.quad	0x8000000080008081,0x8000000080008081
+.quad	0x8000000000008080,0x8000000000008080
+.quad	0x8000000000008080,0x8000000000008080
+.quad	0x80000001,0x80000001
+.quad	0x80000001,0x80000001
+.quad	0x8000000080008008,0x8000000080008008
+.quad	0x8000000080008008,0x8000000080008008
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_sha3_128_blockx4_seed_avx2_end_mark:
+.quad	0x8000000000000000, 0x8000000000000000
+.quad	0x8000000000000000, 0x8000000000000000
+#ifndef __APPLE__
+.text
+.globl	kyber_sha3_128_blocksx4_seed_avx2
+.type	kyber_sha3_128_blocksx4_seed_avx2,@function
+.align	16
+kyber_sha3_128_blocksx4_seed_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_sha3_128_blocksx4_seed_avx2
+.p2align	4
+_kyber_sha3_128_blocksx4_seed_avx2:
+#endif /* __APPLE__ */
+        leaq	L_sha3_parallel_4_r(%rip), %rdx
+        movq	%rdi, %rax
+        movq	%rdi, %rcx
+        vpbroadcastq	(%rsi), %ymm15
+        addq	$0x80, %rdi
+        vpbroadcastq	8(%rsi), %ymm11
+        addq	$0x180, %rax
+        vpbroadcastq	16(%rsi), %ymm12
+        addq	$0x280, %rcx
+        vpbroadcastq	24(%rsi), %ymm13
+        vmovdqu	L_sha3_128_blockx4_seed_avx2_end_mark(%rip), %ymm5
+        vpxor	%ymm6, %ymm6, %ymm6
+        vmovdqu	%ymm11, -96(%rdi)
+        vmovdqu	%ymm12, -64(%rdi)
+        vmovdqu	%ymm13, -32(%rdi)
+        vmovdqu	(%rdi), %ymm14
+        vmovdqu	%ymm6, 32(%rdi)
+        vmovdqu	%ymm6, 64(%rdi)
+        vmovdqu	%ymm6, 96(%rdi)
+        vmovdqu	%ymm6, 128(%rdi)
+        vmovdqu	%ymm6, -96(%rax)
+        vmovdqu	%ymm6, -64(%rax)
+        vmovdqu	%ymm6, -32(%rax)
+        vmovdqu	%ymm6, (%rax)
+        vmovdqu	%ymm6, 32(%rax)
+        vmovdqu	%ymm6, 64(%rax)
+        vmovdqu	%ymm6, 96(%rax)
+        vmovdqu	%ymm6, 128(%rax)
+        vmovdqu	%ymm6, -96(%rcx)
+        vmovdqu	%ymm6, -64(%rcx)
+        vmovdqu	%ymm6, -32(%rcx)
+        vmovdqu	%ymm5, (%rcx)
+        vmovdqu	%ymm6, 32(%rcx)
+        vmovdqu	%ymm6, 64(%rcx)
+        vmovdqu	%ymm6, 96(%rcx)
+        vmovdqu	%ymm6, 128(%rcx)
+        vpxor	%ymm5, %ymm15, %ymm10
+        # Round 0
+        # Calc b[0..4]
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	64(%rdi), %ymm6, %ymm11
+        vpxor	(%rax), %ymm7, %ymm12
+        vpxor	-64(%rcx), %ymm8, %ymm13
+        vpxor	128(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, 128(%rcx)
+        # Row 1
+        vpxor	-32(%rdi), %ymm8, %ymm10
+        vpxor	-96(%rax), %ymm9, %ymm11
+        vpxor	-64(%rax), %ymm5, %ymm12
+        vpxor	128(%rax), %ymm6, %ymm13
+        vpxor	64(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rdi)
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Row 2
+        vpxor	-96(%rdi), %ymm6, %ymm10
+        vpxor	96(%rdi), %ymm7, %ymm11
+        vpxor	32(%rax), %ymm8, %ymm12
+        vpxor	-32(%rcx), %ymm9, %ymm13
+        vpxor	(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rdi)
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, (%rcx)
+        # Row 3
+        vpxor	(%rdi), %ymm9, %ymm10
+        vpxor	32(%rdi), %ymm5, %ymm11
+        vpxor	-32(%rax), %ymm6, %ymm12
+        vpxor	-96(%rcx), %ymm7, %ymm13
+        vpxor	96(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Row 4
+        vpxor	-64(%rdi), %ymm7, %ymm10
+        vpxor	128(%rdi), %ymm8, %ymm11
+        vpxor	64(%rax), %ymm9, %ymm12
+        vpxor	96(%rax), %ymm5, %ymm13
+        vpxor	32(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rdi)
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Round 1
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm10, %ymm10
+        vpxor	-32(%rdi), %ymm10, %ymm10
+        vpxor	(%rdi), %ymm10, %ymm10
+        vpxor	32(%rdi), %ymm1, %ymm11
+        vpxor	64(%rdi), %ymm11, %ymm11
+        vpxor	96(%rdi), %ymm11, %ymm11
+        vpxor	-96(%rax), %ymm11, %ymm11
+        vpxor	-64(%rax), %ymm2, %ymm12
+        vpxor	-32(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm12, %ymm12
+        vpxor	32(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm3, %ymm13
+        vpxor	-96(%rcx), %ymm13, %ymm13
+        vpxor	-64(%rcx), %ymm13, %ymm13
+        vpxor	-32(%rcx), %ymm13, %ymm13
+        vpxor	(%rcx), %ymm4, %ymm14
+        vpxor	64(%rcx), %ymm14, %ymm14
+        vpxor	96(%rcx), %ymm14, %ymm14
+        vpxor	128(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-96(%rax), %ymm6, %ymm11
+        vpxor	32(%rax), %ymm7, %ymm12
+        vpxor	-96(%rcx), %ymm8, %ymm13
+        vpxor	32(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	32(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Row 1
+        vpxor	-64(%rcx), %ymm8, %ymm10
+        vpxor	64(%rcx), %ymm9, %ymm11
+        vpxor	-96(%rdi), %ymm5, %ymm12
+        vpxor	32(%rdi), %ymm6, %ymm13
+        vpxor	64(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rcx)
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, 64(%rax)
+        # Row 2
+        vpxor	64(%rdi), %ymm6, %ymm10
+        vpxor	-64(%rax), %ymm7, %ymm11
+        vpxor	-32(%rcx), %ymm8, %ymm12
+        vpxor	96(%rcx), %ymm9, %ymm13
+        vpxor	-64(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rdi)
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Row 3
+        vpxor	128(%rcx), %ymm9, %ymm10
+        vpxor	-32(%rdi), %ymm5, %ymm11
+        vpxor	96(%rdi), %ymm6, %ymm12
+        vpxor	-32(%rax), %ymm7, %ymm13
+        vpxor	96(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rcx)
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, 96(%rax)
+        # Row 4
+        vpxor	(%rax), %ymm7, %ymm10
+        vpxor	128(%rax), %ymm8, %ymm11
+        vpxor	(%rcx), %ymm9, %ymm12
+        vpxor	(%rdi), %ymm5, %ymm13
+        vpxor	128(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rax)
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Round 2
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm2, %ymm12
+        vpxor	-64(%rdi), %ymm4, %ymm14
+        vpxor	-32(%rdi), %ymm1, %ymm11
+        vpxor	32(%rdi), %ymm3, %ymm13
+        vpxor	64(%rdi), %ymm10, %ymm10
+        vpxor	96(%rdi), %ymm12, %ymm12
+        vpxor	-96(%rax), %ymm11, %ymm11
+        vpxor	-64(%rax), %ymm11, %ymm11
+        vpxor	-32(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm12, %ymm12
+        vpxor	64(%rax), %ymm14, %ymm14
+        vpxor	96(%rax), %ymm14, %ymm14
+        vpxor	-96(%rcx), %ymm13, %ymm13
+        vpxor	-64(%rcx), %ymm10, %ymm10
+        vpxor	-32(%rcx), %ymm12, %ymm12
+        vpxor	32(%rcx), %ymm14, %ymm14
+        vpxor	64(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm13, %ymm13
+        vpxor	128(%rcx), %ymm10, %ymm10
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	64(%rcx), %ymm6, %ymm11
+        vpxor	-32(%rcx), %ymm7, %ymm12
+        vpxor	-32(%rax), %ymm8, %ymm13
+        vpxor	128(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	64(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Row 1
+        vpxor	-96(%rcx), %ymm8, %ymm10
+        vpxor	64(%rax), %ymm9, %ymm11
+        vpxor	64(%rdi), %ymm5, %ymm12
+        vpxor	-32(%rdi), %ymm6, %ymm13
+        vpxor	(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rcx)
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, (%rcx)
+        # Row 2
+        vpxor	-96(%rax), %ymm6, %ymm10
+        vpxor	-96(%rdi), %ymm7, %ymm11
+        vpxor	96(%rcx), %ymm8, %ymm12
+        vpxor	96(%rax), %ymm9, %ymm13
+        vpxor	(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rax)
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, (%rax)
+        # Row 3
+        vpxor	32(%rcx), %ymm9, %ymm10
+        vpxor	-64(%rcx), %ymm5, %ymm11
+        vpxor	-64(%rax), %ymm6, %ymm12
+        vpxor	96(%rdi), %ymm7, %ymm13
+        vpxor	(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rcx)
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, (%rdi)
+        # Row 4
+        vpxor	32(%rax), %ymm7, %ymm10
+        vpxor	32(%rdi), %ymm8, %ymm11
+        vpxor	-64(%rdi), %ymm9, %ymm12
+        vpxor	128(%rcx), %ymm5, %ymm13
+        vpxor	128(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rax)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, 128(%rax)
+        # Round 3
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm1, %ymm11
+        vpxor	-32(%rdi), %ymm3, %ymm13
+        vpxor	(%rdi), %ymm4, %ymm14
+        vpxor	64(%rdi), %ymm2, %ymm12
+        vpxor	96(%rdi), %ymm13, %ymm13
+        vpxor	128(%rdi), %ymm14, %ymm14
+        vpxor	-96(%rax), %ymm10, %ymm10
+        vpxor	-64(%rax), %ymm12, %ymm12
+        vpxor	-32(%rax), %ymm13, %ymm13
+        vpxor	(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm11, %ymm11
+        vpxor	96(%rax), %ymm13, %ymm13
+        vpxor	-96(%rcx), %ymm10, %ymm10
+        vpxor	-64(%rcx), %ymm11, %ymm11
+        vpxor	-32(%rcx), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm14, %ymm14
+        vpxor	32(%rcx), %ymm10, %ymm10
+        vpxor	64(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	64(%rax), %ymm6, %ymm11
+        vpxor	96(%rcx), %ymm7, %ymm12
+        vpxor	96(%rdi), %ymm8, %ymm13
+        vpxor	128(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	96(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, 128(%rax)
+        # Row 1
+        vpxor	-32(%rax), %ymm8, %ymm10
+        vpxor	(%rcx), %ymm9, %ymm11
+        vpxor	-96(%rax), %ymm5, %ymm12
+        vpxor	-64(%rcx), %ymm6, %ymm13
+        vpxor	-64(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rax)
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Row 2
+        vpxor	64(%rcx), %ymm6, %ymm10
+        vpxor	64(%rdi), %ymm7, %ymm11
+        vpxor	96(%rax), %ymm8, %ymm12
+        vpxor	(%rdi), %ymm9, %ymm13
+        vpxor	32(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rcx)
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, 32(%rax)
+        # Row 3
+        vpxor	128(%rdi), %ymm9, %ymm10
+        vpxor	-96(%rcx), %ymm5, %ymm11
+        vpxor	-96(%rdi), %ymm6, %ymm12
+        vpxor	-64(%rax), %ymm7, %ymm13
+        vpxor	128(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, 128(%rcx)
+        # Row 4
+        vpxor	-32(%rcx), %ymm7, %ymm10
+        vpxor	-32(%rdi), %ymm8, %ymm11
+        vpxor	(%rax), %ymm9, %ymm12
+        vpxor	32(%rcx), %ymm5, %ymm13
+        vpxor	32(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rcx)
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Round 4
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm2, %ymm12
+        vpxor	-64(%rdi), %ymm4, %ymm14
+        vpxor	(%rdi), %ymm3, %ymm13
+        vpxor	64(%rdi), %ymm1, %ymm11
+        vpxor	96(%rdi), %ymm13, %ymm13
+        vpxor	128(%rdi), %ymm10, %ymm10
+        vpxor	-96(%rax), %ymm12, %ymm12
+        vpxor	-64(%rax), %ymm13, %ymm13
+        vpxor	-32(%rax), %ymm10, %ymm10
+        vpxor	32(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm11, %ymm11
+        vpxor	96(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm14, %ymm14
+        vpxor	-96(%rcx), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm13, %ymm13
+        vpxor	(%rcx), %ymm11, %ymm11
+        vpxor	64(%rcx), %ymm10, %ymm10
+        vpxor	96(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	(%rcx), %ymm6, %ymm11
+        vpxor	96(%rax), %ymm7, %ymm12
+        vpxor	-64(%rax), %ymm8, %ymm13
+        vpxor	32(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	128(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Row 1
+        vpxor	96(%rdi), %ymm8, %ymm10
+        vpxor	-64(%rdi), %ymm9, %ymm11
+        vpxor	64(%rcx), %ymm5, %ymm12
+        vpxor	-96(%rcx), %ymm6, %ymm13
+        vpxor	(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rdi)
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, (%rax)
+        # Row 2
+        vpxor	64(%rax), %ymm6, %ymm10
+        vpxor	-96(%rax), %ymm7, %ymm11
+        vpxor	(%rdi), %ymm8, %ymm12
+        vpxor	128(%rcx), %ymm9, %ymm13
+        vpxor	-32(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rax)
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Row 3
+        vpxor	128(%rax), %ymm9, %ymm10
+        vpxor	-32(%rax), %ymm5, %ymm11
+        vpxor	64(%rdi), %ymm6, %ymm12
+        vpxor	-96(%rdi), %ymm7, %ymm13
+        vpxor	32(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rax)
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Row 4
+        vpxor	96(%rcx), %ymm7, %ymm10
+        vpxor	-64(%rcx), %ymm8, %ymm11
+        vpxor	32(%rax), %ymm9, %ymm12
+        vpxor	128(%rdi), %ymm5, %ymm13
+        vpxor	-32(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rcx)
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Round 5
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm3, %ymm13
+        vpxor	-64(%rdi), %ymm1, %ymm11
+        vpxor	(%rdi), %ymm2, %ymm12
+        vpxor	32(%rdi), %ymm4, %ymm14
+        vpxor	64(%rdi), %ymm12, %ymm12
+        vpxor	96(%rdi), %ymm10, %ymm10
+        vpxor	-96(%rax), %ymm11, %ymm11
+        vpxor	-64(%rax), %ymm13, %ymm13
+        vpxor	-32(%rax), %ymm11, %ymm11
+        vpxor	(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm10, %ymm10
+        vpxor	96(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm10, %ymm10
+        vpxor	-96(%rcx), %ymm13, %ymm13
+        vpxor	-32(%rcx), %ymm14, %ymm14
+        vpxor	(%rcx), %ymm11, %ymm11
+        vpxor	32(%rcx), %ymm14, %ymm14
+        vpxor	64(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm13, %ymm13
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-64(%rdi), %ymm6, %ymm11
+        vpxor	(%rdi), %ymm7, %ymm12
+        vpxor	-96(%rdi), %ymm8, %ymm13
+        vpxor	-32(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	160(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Row 1
+        vpxor	-64(%rax), %ymm8, %ymm10
+        vpxor	(%rax), %ymm9, %ymm11
+        vpxor	64(%rax), %ymm5, %ymm12
+        vpxor	-32(%rax), %ymm6, %ymm13
+        vpxor	32(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rax)
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, 32(%rax)
+        # Row 2
+        vpxor	(%rcx), %ymm6, %ymm10
+        vpxor	64(%rcx), %ymm7, %ymm11
+        vpxor	128(%rcx), %ymm8, %ymm12
+        vpxor	32(%rcx), %ymm9, %ymm13
+        vpxor	96(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rcx)
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Row 3
+        vpxor	32(%rdi), %ymm9, %ymm10
+        vpxor	96(%rdi), %ymm5, %ymm11
+        vpxor	-96(%rax), %ymm6, %ymm12
+        vpxor	64(%rdi), %ymm7, %ymm13
+        vpxor	128(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rdi)
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Row 4
+        vpxor	96(%rax), %ymm7, %ymm10
+        vpxor	-96(%rcx), %ymm8, %ymm11
+        vpxor	-32(%rcx), %ymm9, %ymm12
+        vpxor	128(%rax), %ymm5, %ymm13
+        vpxor	-64(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rax)
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Round 6
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm3, %ymm13
+        vpxor	-64(%rdi), %ymm1, %ymm11
+        vpxor	-32(%rdi), %ymm4, %ymm14
+        vpxor	(%rdi), %ymm2, %ymm12
+        vpxor	32(%rdi), %ymm10, %ymm10
+        vpxor	64(%rdi), %ymm13, %ymm13
+        vpxor	96(%rdi), %ymm11, %ymm11
+        vpxor	128(%rdi), %ymm14, %ymm14
+        vpxor	-96(%rax), %ymm12, %ymm12
+        vpxor	-64(%rax), %ymm10, %ymm10
+        vpxor	-32(%rax), %ymm13, %ymm13
+        vpxor	(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm10, %ymm10
+        vpxor	32(%rcx), %ymm13, %ymm13
+        vpxor	64(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm14, %ymm14
+        vpxor	128(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	(%rax), %ymm6, %ymm11
+        vpxor	128(%rcx), %ymm7, %ymm12
+        vpxor	64(%rdi), %ymm8, %ymm13
+        vpxor	-64(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	192(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Row 1
+        vpxor	-96(%rdi), %ymm8, %ymm10
+        vpxor	32(%rax), %ymm9, %ymm11
+        vpxor	(%rcx), %ymm5, %ymm12
+        vpxor	96(%rdi), %ymm6, %ymm13
+        vpxor	-32(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rdi)
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Row 2
+        vpxor	-64(%rdi), %ymm6, %ymm10
+        vpxor	64(%rax), %ymm7, %ymm11
+        vpxor	32(%rcx), %ymm8, %ymm12
+        vpxor	128(%rdi), %ymm9, %ymm13
+        vpxor	96(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rdi)
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, 96(%rax)
+        # Row 3
+        vpxor	-32(%rdi), %ymm9, %ymm10
+        vpxor	-64(%rax), %ymm5, %ymm11
+        vpxor	64(%rcx), %ymm6, %ymm12
+        vpxor	-96(%rax), %ymm7, %ymm13
+        vpxor	128(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rdi)
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, 128(%rax)
+        # Row 4
+        vpxor	(%rdi), %ymm7, %ymm10
+        vpxor	-32(%rax), %ymm8, %ymm11
+        vpxor	96(%rcx), %ymm9, %ymm12
+        vpxor	32(%rdi), %ymm5, %ymm13
+        vpxor	-96(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Round 7
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm10, %ymm10
+        vpxor	-64(%rdi), %ymm10, %ymm10
+        vpxor	-32(%rdi), %ymm10, %ymm10
+        vpxor	64(%rdi), %ymm3, %ymm13
+        vpxor	96(%rdi), %ymm13, %ymm13
+        vpxor	128(%rdi), %ymm13, %ymm13
+        vpxor	-96(%rax), %ymm13, %ymm13
+        vpxor	-64(%rax), %ymm1, %ymm11
+        vpxor	(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm11, %ymm11
+        vpxor	64(%rax), %ymm11, %ymm11
+        vpxor	96(%rax), %ymm4, %ymm14
+        vpxor	128(%rax), %ymm14, %ymm14
+        vpxor	-64(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm14, %ymm14
+        vpxor	(%rcx), %ymm2, %ymm12
+        vpxor	32(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	32(%rax), %ymm6, %ymm11
+        vpxor	32(%rcx), %ymm7, %ymm12
+        vpxor	-96(%rax), %ymm8, %ymm13
+        vpxor	-96(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	224(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Row 1
+        vpxor	64(%rdi), %ymm8, %ymm10
+        vpxor	-32(%rcx), %ymm9, %ymm11
+        vpxor	-64(%rdi), %ymm5, %ymm12
+        vpxor	-64(%rax), %ymm6, %ymm13
+        vpxor	96(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rdi)
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Row 2
+        vpxor	(%rax), %ymm6, %ymm10
+        vpxor	(%rcx), %ymm7, %ymm11
+        vpxor	128(%rdi), %ymm8, %ymm12
+        vpxor	128(%rax), %ymm9, %ymm13
+        vpxor	(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rax)
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, (%rdi)
+        # Row 3
+        vpxor	-64(%rcx), %ymm9, %ymm10
+        vpxor	-96(%rdi), %ymm5, %ymm11
+        vpxor	64(%rax), %ymm6, %ymm12
+        vpxor	64(%rcx), %ymm7, %ymm13
+        vpxor	32(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rcx)
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Row 4
+        vpxor	128(%rcx), %ymm7, %ymm10
+        vpxor	96(%rdi), %ymm8, %ymm11
+        vpxor	96(%rax), %ymm9, %ymm12
+        vpxor	-32(%rdi), %ymm5, %ymm13
+        vpxor	-32(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rcx)
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, -32(%rax)
+        # Round 8
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm1, %ymm11
+        vpxor	-64(%rdi), %ymm2, %ymm12
+        vpxor	(%rdi), %ymm4, %ymm14
+        vpxor	32(%rdi), %ymm14, %ymm14
+        vpxor	64(%rdi), %ymm10, %ymm10
+        vpxor	128(%rdi), %ymm12, %ymm12
+        vpxor	-96(%rax), %ymm3, %ymm13
+        vpxor	-64(%rax), %ymm13, %ymm13
+        vpxor	(%rax), %ymm10, %ymm10
+        vpxor	32(%rax), %ymm11, %ymm11
+        vpxor	64(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm13, %ymm13
+        vpxor	-96(%rcx), %ymm14, %ymm14
+        vpxor	-64(%rcx), %ymm10, %ymm10
+        vpxor	-32(%rcx), %ymm11, %ymm11
+        vpxor	(%rcx), %ymm11, %ymm11
+        vpxor	32(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm13, %ymm13
+        vpxor	96(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-32(%rcx), %ymm6, %ymm11
+        vpxor	128(%rdi), %ymm7, %ymm12
+        vpxor	64(%rcx), %ymm8, %ymm13
+        vpxor	-32(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	256(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, -32(%rax)
+        # Row 1
+        vpxor	-96(%rax), %ymm8, %ymm10
+        vpxor	96(%rcx), %ymm9, %ymm11
+        vpxor	(%rax), %ymm5, %ymm12
+        vpxor	-96(%rdi), %ymm6, %ymm13
+        vpxor	96(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rax)
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, 96(%rax)
+        # Row 2
+        vpxor	32(%rax), %ymm6, %ymm10
+        vpxor	-64(%rdi), %ymm7, %ymm11
+        vpxor	128(%rax), %ymm8, %ymm12
+        vpxor	32(%rdi), %ymm9, %ymm13
+        vpxor	128(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rax)
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, 128(%rcx)
+        # Row 3
+        vpxor	-96(%rcx), %ymm9, %ymm10
+        vpxor	64(%rdi), %ymm5, %ymm11
+        vpxor	(%rcx), %ymm6, %ymm12
+        vpxor	64(%rax), %ymm7, %ymm13
+        vpxor	-32(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rcx)
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Row 4
+        vpxor	32(%rcx), %ymm7, %ymm10
+        vpxor	-64(%rax), %ymm8, %ymm11
+        vpxor	(%rdi), %ymm9, %ymm12
+        vpxor	-64(%rcx), %ymm5, %ymm13
+        vpxor	96(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rcx)
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Round 9
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm3, %ymm13
+        vpxor	-64(%rdi), %ymm1, %ymm11
+        vpxor	-32(%rdi), %ymm4, %ymm14
+        vpxor	32(%rdi), %ymm13, %ymm13
+        vpxor	64(%rdi), %ymm11, %ymm11
+        vpxor	128(%rdi), %ymm2, %ymm12
+        vpxor	-96(%rax), %ymm10, %ymm10
+        vpxor	-32(%rax), %ymm14, %ymm14
+        vpxor	(%rax), %ymm12, %ymm12
+        vpxor	32(%rax), %ymm10, %ymm10
+        vpxor	64(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm14, %ymm14
+        vpxor	128(%rax), %ymm12, %ymm12
+        vpxor	-96(%rcx), %ymm10, %ymm10
+        vpxor	-32(%rcx), %ymm11, %ymm11
+        vpxor	(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm13, %ymm13
+        vpxor	96(%rcx), %ymm11, %ymm11
+        vpxor	128(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	96(%rcx), %ymm6, %ymm11
+        vpxor	128(%rax), %ymm7, %ymm12
+        vpxor	64(%rax), %ymm8, %ymm13
+        vpxor	96(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	288(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Row 1
+        vpxor	64(%rcx), %ymm8, %ymm10
+        vpxor	96(%rax), %ymm9, %ymm11
+        vpxor	32(%rax), %ymm5, %ymm12
+        vpxor	64(%rdi), %ymm6, %ymm13
+        vpxor	(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rcx)
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, (%rdi)
+        # Row 2
+        vpxor	-32(%rcx), %ymm6, %ymm10
+        vpxor	(%rax), %ymm7, %ymm11
+        vpxor	32(%rdi), %ymm8, %ymm12
+        vpxor	-32(%rdi), %ymm9, %ymm13
+        vpxor	32(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rcx)
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Row 3
+        vpxor	-32(%rax), %ymm9, %ymm10
+        vpxor	-96(%rax), %ymm5, %ymm11
+        vpxor	-64(%rdi), %ymm6, %ymm12
+        vpxor	(%rcx), %ymm7, %ymm13
+        vpxor	-64(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rax)
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Row 4
+        vpxor	128(%rdi), %ymm7, %ymm10
+        vpxor	-96(%rdi), %ymm8, %ymm11
+        vpxor	128(%rcx), %ymm9, %ymm12
+        vpxor	-96(%rcx), %ymm5, %ymm13
+        vpxor	-64(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, -64(%rax)
+        # Round 10
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm2, %ymm12
+        vpxor	-32(%rdi), %ymm3, %ymm13
+        vpxor	(%rdi), %ymm4, %ymm14
+        vpxor	32(%rdi), %ymm12, %ymm12
+        vpxor	64(%rdi), %ymm13, %ymm13
+        vpxor	96(%rdi), %ymm14, %ymm14
+        vpxor	-96(%rax), %ymm1, %ymm11
+        vpxor	-32(%rax), %ymm10, %ymm10
+        vpxor	(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm12, %ymm12
+        vpxor	64(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm11, %ymm11
+        vpxor	128(%rax), %ymm12, %ymm12
+        vpxor	-64(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm10, %ymm10
+        vpxor	(%rcx), %ymm13, %ymm13
+        vpxor	32(%rcx), %ymm14, %ymm14
+        vpxor	64(%rcx), %ymm10, %ymm10
+        vpxor	96(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	96(%rax), %ymm6, %ymm11
+        vpxor	32(%rdi), %ymm7, %ymm12
+        vpxor	(%rcx), %ymm8, %ymm13
+        vpxor	-64(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	320(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, -64(%rax)
+        # Row 1
+        vpxor	64(%rax), %ymm8, %ymm10
+        vpxor	(%rdi), %ymm9, %ymm11
+        vpxor	-32(%rcx), %ymm5, %ymm12
+        vpxor	-96(%rax), %ymm6, %ymm13
+        vpxor	128(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rax)
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, 128(%rcx)
+        # Row 2
+        vpxor	96(%rcx), %ymm6, %ymm10
+        vpxor	32(%rax), %ymm7, %ymm11
+        vpxor	-32(%rdi), %ymm8, %ymm12
+        vpxor	-64(%rcx), %ymm9, %ymm13
+        vpxor	128(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rcx)
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Row 3
+        vpxor	96(%rdi), %ymm9, %ymm10
+        vpxor	64(%rcx), %ymm5, %ymm11
+        vpxor	(%rax), %ymm6, %ymm12
+        vpxor	-64(%rdi), %ymm7, %ymm13
+        vpxor	-96(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rdi)
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Row 4
+        vpxor	128(%rax), %ymm7, %ymm10
+        vpxor	64(%rdi), %ymm8, %ymm11
+        vpxor	32(%rcx), %ymm9, %ymm12
+        vpxor	-32(%rax), %ymm5, %ymm13
+        vpxor	-96(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rax)
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Round 11
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm3, %ymm13
+        vpxor	-32(%rdi), %ymm2, %ymm12
+        vpxor	(%rdi), %ymm1, %ymm11
+        vpxor	32(%rdi), %ymm12, %ymm12
+        vpxor	96(%rdi), %ymm10, %ymm10
+        vpxor	128(%rdi), %ymm4, %ymm14
+        vpxor	-96(%rax), %ymm13, %ymm13
+        vpxor	-64(%rax), %ymm14, %ymm14
+        vpxor	(%rax), %ymm12, %ymm12
+        vpxor	32(%rax), %ymm11, %ymm11
+        vpxor	64(%rax), %ymm10, %ymm10
+        vpxor	96(%rax), %ymm11, %ymm11
+        vpxor	-96(%rcx), %ymm14, %ymm14
+        vpxor	-64(%rcx), %ymm13, %ymm13
+        vpxor	-32(%rcx), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm13, %ymm13
+        vpxor	64(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm10, %ymm10
+        vpxor	128(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	(%rdi), %ymm6, %ymm11
+        vpxor	-32(%rdi), %ymm7, %ymm12
+        vpxor	-64(%rdi), %ymm8, %ymm13
+        vpxor	-96(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	352(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Row 1
+        vpxor	(%rcx), %ymm8, %ymm10
+        vpxor	128(%rcx), %ymm9, %ymm11
+        vpxor	96(%rcx), %ymm5, %ymm12
+        vpxor	64(%rcx), %ymm6, %ymm13
+        vpxor	32(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rcx)
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Row 2
+        vpxor	96(%rax), %ymm6, %ymm10
+        vpxor	-32(%rcx), %ymm7, %ymm11
+        vpxor	-64(%rcx), %ymm8, %ymm12
+        vpxor	-96(%rcx), %ymm9, %ymm13
+        vpxor	128(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rax)
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, 128(%rax)
+        # Row 3
+        vpxor	-64(%rax), %ymm9, %ymm10
+        vpxor	64(%rax), %ymm5, %ymm11
+        vpxor	32(%rax), %ymm6, %ymm12
+        vpxor	(%rax), %ymm7, %ymm13
+        vpxor	-32(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rax)
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, -32(%rax)
+        # Row 4
+        vpxor	32(%rdi), %ymm7, %ymm10
+        vpxor	-96(%rax), %ymm8, %ymm11
+        vpxor	128(%rdi), %ymm9, %ymm12
+        vpxor	96(%rdi), %ymm5, %ymm13
+        vpxor	64(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rdi)
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Round 12
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm4, %ymm14
+        vpxor	-64(%rdi), %ymm3, %ymm13
+        vpxor	-32(%rdi), %ymm2, %ymm12
+        vpxor	(%rdi), %ymm1, %ymm11
+        vpxor	-64(%rax), %ymm10, %ymm10
+        vpxor	-32(%rax), %ymm14, %ymm14
+        vpxor	(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm12, %ymm12
+        vpxor	64(%rax), %ymm11, %ymm11
+        vpxor	96(%rax), %ymm10, %ymm10
+        vpxor	128(%rax), %ymm14, %ymm14
+        vpxor	-96(%rcx), %ymm13, %ymm13
+        vpxor	-64(%rcx), %ymm12, %ymm12
+        vpxor	-32(%rcx), %ymm11, %ymm11
+        vpxor	(%rcx), %ymm10, %ymm10
+        vpxor	32(%rcx), %ymm14, %ymm14
+        vpxor	64(%rcx), %ymm13, %ymm13
+        vpxor	96(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	128(%rcx), %ymm6, %ymm11
+        vpxor	-64(%rcx), %ymm7, %ymm12
+        vpxor	(%rax), %ymm8, %ymm13
+        vpxor	64(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	384(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Row 1
+        vpxor	-64(%rdi), %ymm8, %ymm10
+        vpxor	32(%rcx), %ymm9, %ymm11
+        vpxor	96(%rax), %ymm5, %ymm12
+        vpxor	64(%rax), %ymm6, %ymm13
+        vpxor	128(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rdi)
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Row 2
+        vpxor	(%rdi), %ymm6, %ymm10
+        vpxor	96(%rcx), %ymm7, %ymm11
+        vpxor	-96(%rcx), %ymm8, %ymm12
+        vpxor	-32(%rax), %ymm9, %ymm13
+        vpxor	32(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Row 3
+        vpxor	-96(%rdi), %ymm9, %ymm10
+        vpxor	(%rcx), %ymm5, %ymm11
+        vpxor	-32(%rcx), %ymm6, %ymm12
+        vpxor	32(%rax), %ymm7, %ymm13
+        vpxor	96(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rdi)
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Row 4
+        vpxor	-32(%rdi), %ymm7, %ymm10
+        vpxor	64(%rcx), %ymm8, %ymm11
+        vpxor	128(%rax), %ymm9, %ymm12
+        vpxor	-64(%rax), %ymm5, %ymm13
+        vpxor	-96(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rdi)
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, -96(%rax)
+        # Round 13
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm10, %ymm10
+        vpxor	-64(%rdi), %ymm10, %ymm10
+        vpxor	(%rdi), %ymm10, %ymm10
+        vpxor	32(%rdi), %ymm4, %ymm14
+        vpxor	64(%rdi), %ymm14, %ymm14
+        vpxor	96(%rdi), %ymm14, %ymm14
+        vpxor	128(%rdi), %ymm14, %ymm14
+        vpxor	-32(%rax), %ymm3, %ymm13
+        vpxor	(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm13, %ymm13
+        vpxor	64(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm2, %ymm12
+        vpxor	-96(%rcx), %ymm12, %ymm12
+        vpxor	-64(%rcx), %ymm12, %ymm12
+        vpxor	-32(%rcx), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm1, %ymm11
+        vpxor	32(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm11, %ymm11
+        vpxor	128(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	32(%rcx), %ymm6, %ymm11
+        vpxor	-96(%rcx), %ymm7, %ymm12
+        vpxor	32(%rax), %ymm8, %ymm13
+        vpxor	-96(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	416(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, -96(%rax)
+        # Row 1
+        vpxor	(%rax), %ymm8, %ymm10
+        vpxor	128(%rdi), %ymm9, %ymm11
+        vpxor	(%rdi), %ymm5, %ymm12
+        vpxor	(%rcx), %ymm6, %ymm13
+        vpxor	128(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rax)
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, 128(%rax)
+        # Row 2
+        vpxor	128(%rcx), %ymm6, %ymm10
+        vpxor	96(%rax), %ymm7, %ymm11
+        vpxor	-32(%rax), %ymm8, %ymm12
+        vpxor	96(%rdi), %ymm9, %ymm13
+        vpxor	-32(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rcx)
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Row 3
+        vpxor	64(%rdi), %ymm9, %ymm10
+        vpxor	-64(%rdi), %ymm5, %ymm11
+        vpxor	96(%rcx), %ymm6, %ymm12
+        vpxor	-32(%rcx), %ymm7, %ymm13
+        vpxor	-64(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rdi)
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, -64(%rax)
+        # Row 4
+        vpxor	-64(%rcx), %ymm7, %ymm10
+        vpxor	64(%rax), %ymm8, %ymm11
+        vpxor	32(%rdi), %ymm9, %ymm12
+        vpxor	-96(%rdi), %ymm5, %ymm13
+        vpxor	64(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rcx)
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Round 14
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm1, %ymm11
+        vpxor	-32(%rdi), %ymm4, %ymm14
+        vpxor	(%rdi), %ymm2, %ymm12
+        vpxor	64(%rdi), %ymm10, %ymm10
+        vpxor	96(%rdi), %ymm3, %ymm13
+        vpxor	128(%rdi), %ymm11, %ymm11
+        vpxor	-96(%rax), %ymm14, %ymm14
+        vpxor	-64(%rax), %ymm14, %ymm14
+        vpxor	-32(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm10, %ymm10
+        vpxor	32(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm11, %ymm11
+        vpxor	128(%rax), %ymm14, %ymm14
+        vpxor	-96(%rcx), %ymm12, %ymm12
+        vpxor	-32(%rcx), %ymm13, %ymm13
+        vpxor	(%rcx), %ymm13, %ymm13
+        vpxor	32(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm10, %ymm10
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	128(%rdi), %ymm6, %ymm11
+        vpxor	-32(%rax), %ymm7, %ymm12
+        vpxor	-32(%rcx), %ymm8, %ymm13
+        vpxor	64(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	448(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Row 1
+        vpxor	32(%rax), %ymm8, %ymm10
+        vpxor	128(%rax), %ymm9, %ymm11
+        vpxor	128(%rcx), %ymm5, %ymm12
+        vpxor	-64(%rdi), %ymm6, %ymm13
+        vpxor	32(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rax)
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Row 2
+        vpxor	32(%rcx), %ymm6, %ymm10
+        vpxor	(%rdi), %ymm7, %ymm11
+        vpxor	96(%rdi), %ymm8, %ymm12
+        vpxor	-64(%rax), %ymm9, %ymm13
+        vpxor	-64(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rcx)
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Row 3
+        vpxor	-96(%rax), %ymm9, %ymm10
+        vpxor	(%rax), %ymm5, %ymm11
+        vpxor	96(%rax), %ymm6, %ymm12
+        vpxor	96(%rcx), %ymm7, %ymm13
+        vpxor	-96(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rax)
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Row 4
+        vpxor	-96(%rcx), %ymm7, %ymm10
+        vpxor	(%rcx), %ymm8, %ymm11
+        vpxor	-32(%rdi), %ymm9, %ymm12
+        vpxor	64(%rdi), %ymm5, %ymm13
+        vpxor	64(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rcx)
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, 64(%rax)
+        # Round 15
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm4, %ymm14
+        vpxor	-64(%rdi), %ymm3, %ymm13
+        vpxor	(%rdi), %ymm1, %ymm11
+        vpxor	32(%rdi), %ymm14, %ymm14
+        vpxor	96(%rdi), %ymm2, %ymm12
+        vpxor	128(%rdi), %ymm11, %ymm11
+        vpxor	-96(%rax), %ymm10, %ymm10
+        vpxor	-64(%rax), %ymm13, %ymm13
+        vpxor	-32(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm10, %ymm10
+        vpxor	96(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm13, %ymm13
+        vpxor	32(%rcx), %ymm10, %ymm10
+        vpxor	64(%rcx), %ymm14, %ymm14
+        vpxor	96(%rcx), %ymm13, %ymm13
+        vpxor	128(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	128(%rax), %ymm6, %ymm11
+        vpxor	96(%rdi), %ymm7, %ymm12
+        vpxor	96(%rcx), %ymm8, %ymm13
+        vpxor	64(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	480(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, 64(%rax)
+        # Row 1
+        vpxor	-32(%rcx), %ymm8, %ymm10
+        vpxor	32(%rdi), %ymm9, %ymm11
+        vpxor	32(%rcx), %ymm5, %ymm12
+        vpxor	(%rax), %ymm6, %ymm13
+        vpxor	-32(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rcx)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Row 2
+        vpxor	128(%rdi), %ymm6, %ymm10
+        vpxor	128(%rcx), %ymm7, %ymm11
+        vpxor	-64(%rax), %ymm8, %ymm12
+        vpxor	-96(%rdi), %ymm9, %ymm13
+        vpxor	-96(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Row 3
+        vpxor	64(%rcx), %ymm9, %ymm10
+        vpxor	32(%rax), %ymm5, %ymm11
+        vpxor	(%rdi), %ymm6, %ymm12
+        vpxor	96(%rax), %ymm7, %ymm13
+        vpxor	64(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rcx)
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Row 4
+        vpxor	-32(%rax), %ymm7, %ymm10
+        vpxor	-64(%rdi), %ymm8, %ymm11
+        vpxor	-64(%rcx), %ymm9, %ymm12
+        vpxor	-96(%rax), %ymm5, %ymm13
+        vpxor	(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rax)
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, (%rcx)
+        # Round 16
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm3, %ymm13
+        vpxor	-32(%rdi), %ymm4, %ymm14
+        vpxor	(%rdi), %ymm2, %ymm12
+        vpxor	32(%rdi), %ymm1, %ymm11
+        vpxor	64(%rdi), %ymm14, %ymm14
+        vpxor	96(%rdi), %ymm12, %ymm12
+        vpxor	128(%rdi), %ymm10, %ymm10
+        vpxor	-64(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm11, %ymm11
+        vpxor	64(%rax), %ymm14, %ymm14
+        vpxor	96(%rax), %ymm13, %ymm13
+        vpxor	128(%rax), %ymm11, %ymm11
+        vpxor	-96(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm10, %ymm10
+        vpxor	32(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm10, %ymm10
+        vpxor	96(%rcx), %ymm13, %ymm13
+        vpxor	128(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	32(%rdi), %ymm6, %ymm11
+        vpxor	-64(%rax), %ymm7, %ymm12
+        vpxor	96(%rax), %ymm8, %ymm13
+        vpxor	(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	512(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, (%rcx)
+        # Row 1
+        vpxor	96(%rcx), %ymm8, %ymm10
+        vpxor	-32(%rdi), %ymm9, %ymm11
+        vpxor	128(%rdi), %ymm5, %ymm12
+        vpxor	32(%rax), %ymm6, %ymm13
+        vpxor	-64(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rcx)
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Row 2
+        vpxor	128(%rax), %ymm6, %ymm10
+        vpxor	32(%rcx), %ymm7, %ymm11
+        vpxor	-96(%rdi), %ymm8, %ymm12
+        vpxor	64(%rdi), %ymm9, %ymm13
+        vpxor	-32(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rax)
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, -32(%rax)
+        # Row 3
+        vpxor	64(%rax), %ymm9, %ymm10
+        vpxor	-32(%rcx), %ymm5, %ymm11
+        vpxor	128(%rcx), %ymm6, %ymm12
+        vpxor	(%rdi), %ymm7, %ymm13
+        vpxor	-96(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rax)
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, -96(%rax)
+        # Row 4
+        vpxor	96(%rdi), %ymm7, %ymm10
+        vpxor	(%rax), %ymm8, %ymm11
+        vpxor	-96(%rcx), %ymm9, %ymm12
+        vpxor	64(%rcx), %ymm5, %ymm13
+        vpxor	-64(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rdi)
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Round 17
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm2, %ymm12
+        vpxor	-32(%rdi), %ymm1, %ymm11
+        vpxor	(%rdi), %ymm3, %ymm13
+        vpxor	32(%rdi), %ymm11, %ymm11
+        vpxor	64(%rdi), %ymm13, %ymm13
+        vpxor	128(%rdi), %ymm12, %ymm12
+        vpxor	-96(%rax), %ymm4, %ymm14
+        vpxor	-64(%rax), %ymm12, %ymm12
+        vpxor	-32(%rax), %ymm14, %ymm14
+        vpxor	32(%rax), %ymm13, %ymm13
+        vpxor	64(%rax), %ymm10, %ymm10
+        vpxor	96(%rax), %ymm13, %ymm13
+        vpxor	128(%rax), %ymm10, %ymm10
+        vpxor	-64(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm11, %ymm11
+        vpxor	(%rcx), %ymm14, %ymm14
+        vpxor	32(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm10, %ymm10
+        vpxor	128(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-32(%rdi), %ymm6, %ymm11
+        vpxor	-96(%rdi), %ymm7, %ymm12
+        vpxor	(%rdi), %ymm8, %ymm13
+        vpxor	-64(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	544(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Row 1
+        vpxor	96(%rax), %ymm8, %ymm10
+        vpxor	-64(%rcx), %ymm9, %ymm11
+        vpxor	128(%rax), %ymm5, %ymm12
+        vpxor	-32(%rcx), %ymm6, %ymm13
+        vpxor	-96(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rax)
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Row 2
+        vpxor	32(%rdi), %ymm6, %ymm10
+        vpxor	128(%rdi), %ymm7, %ymm11
+        vpxor	64(%rdi), %ymm8, %ymm12
+        vpxor	-96(%rax), %ymm9, %ymm13
+        vpxor	96(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rdi)
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Row 3
+        vpxor	(%rcx), %ymm9, %ymm10
+        vpxor	96(%rcx), %ymm5, %ymm11
+        vpxor	32(%rcx), %ymm6, %ymm12
+        vpxor	128(%rcx), %ymm7, %ymm13
+        vpxor	64(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rcx)
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Row 4
+        vpxor	-64(%rax), %ymm7, %ymm10
+        vpxor	32(%rax), %ymm8, %ymm11
+        vpxor	-32(%rax), %ymm9, %ymm12
+        vpxor	64(%rax), %ymm5, %ymm13
+        vpxor	(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rax)
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, (%rax)
+        # Round 18
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm2, %ymm12
+        vpxor	-64(%rdi), %ymm4, %ymm14
+        vpxor	-32(%rdi), %ymm1, %ymm11
+        vpxor	(%rdi), %ymm3, %ymm13
+        vpxor	32(%rdi), %ymm10, %ymm10
+        vpxor	64(%rdi), %ymm12, %ymm12
+        vpxor	96(%rdi), %ymm14, %ymm14
+        vpxor	128(%rdi), %ymm11, %ymm11
+        vpxor	-96(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm10, %ymm10
+        vpxor	128(%rax), %ymm12, %ymm12
+        vpxor	-96(%rcx), %ymm14, %ymm14
+        vpxor	-64(%rcx), %ymm11, %ymm11
+        vpxor	-32(%rcx), %ymm13, %ymm13
+        vpxor	(%rcx), %ymm10, %ymm10
+        vpxor	32(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm14, %ymm14
+        vpxor	96(%rcx), %ymm11, %ymm11
+        vpxor	128(%rcx), %ymm13, %ymm13
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-64(%rcx), %ymm6, %ymm11
+        vpxor	64(%rdi), %ymm7, %ymm12
+        vpxor	128(%rcx), %ymm8, %ymm13
+        vpxor	(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	576(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, (%rax)
+        # Row 1
+        vpxor	(%rdi), %ymm8, %ymm10
+        vpxor	-96(%rcx), %ymm9, %ymm11
+        vpxor	32(%rdi), %ymm5, %ymm12
+        vpxor	96(%rcx), %ymm6, %ymm13
+        vpxor	-32(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, -32(%rax)
+        # Row 2
+        vpxor	-32(%rdi), %ymm6, %ymm10
+        vpxor	128(%rax), %ymm7, %ymm11
+        vpxor	-96(%rax), %ymm8, %ymm12
+        vpxor	64(%rcx), %ymm9, %ymm13
+        vpxor	-64(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rdi)
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, -64(%rax)
+        # Row 3
+        vpxor	-64(%rdi), %ymm9, %ymm10
+        vpxor	96(%rax), %ymm5, %ymm11
+        vpxor	128(%rdi), %ymm6, %ymm12
+        vpxor	32(%rcx), %ymm7, %ymm13
+        vpxor	64(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rdi)
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 64(%rax)
+        # Row 4
+        vpxor	-96(%rdi), %ymm7, %ymm10
+        vpxor	-32(%rcx), %ymm8, %ymm11
+        vpxor	96(%rdi), %ymm9, %ymm12
+        vpxor	(%rcx), %ymm5, %ymm13
+        vpxor	32(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rdi)
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, 32(%rax)
+        # Round 19
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm10, %ymm10
+        vpxor	-32(%rdi), %ymm10, %ymm10
+        vpxor	(%rdi), %ymm10, %ymm10
+        vpxor	32(%rdi), %ymm2, %ymm12
+        vpxor	64(%rdi), %ymm12, %ymm12
+        vpxor	128(%rdi), %ymm12, %ymm12
+        vpxor	-96(%rax), %ymm12, %ymm12
+        vpxor	-64(%rax), %ymm4, %ymm14
+        vpxor	-32(%rax), %ymm14, %ymm14
+        vpxor	(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm14, %ymm14
+        vpxor	96(%rax), %ymm1, %ymm11
+        vpxor	128(%rax), %ymm11, %ymm11
+        vpxor	-96(%rcx), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm11, %ymm11
+        vpxor	32(%rcx), %ymm3, %ymm13
+        vpxor	64(%rcx), %ymm13, %ymm13
+        vpxor	96(%rcx), %ymm13, %ymm13
+        vpxor	128(%rcx), %ymm13, %ymm13
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-96(%rcx), %ymm6, %ymm11
+        vpxor	-96(%rax), %ymm7, %ymm12
+        vpxor	32(%rcx), %ymm8, %ymm13
+        vpxor	32(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	608(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 32(%rax)
+        # Row 1
+        vpxor	128(%rcx), %ymm8, %ymm10
+        vpxor	-32(%rax), %ymm9, %ymm11
+        vpxor	-32(%rdi), %ymm5, %ymm12
+        vpxor	96(%rax), %ymm6, %ymm13
+        vpxor	96(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rcx)
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Row 2
+        vpxor	-64(%rcx), %ymm6, %ymm10
+        vpxor	32(%rdi), %ymm7, %ymm11
+        vpxor	64(%rcx), %ymm8, %ymm12
+        vpxor	64(%rax), %ymm9, %ymm13
+        vpxor	-96(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rcx)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Row 3
+        vpxor	(%rax), %ymm9, %ymm10
+        vpxor	(%rdi), %ymm5, %ymm11
+        vpxor	128(%rax), %ymm6, %ymm12
+        vpxor	128(%rdi), %ymm7, %ymm13
+        vpxor	(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rax)
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, (%rcx)
+        # Row 4
+        vpxor	64(%rdi), %ymm7, %ymm10
+        vpxor	96(%rcx), %ymm8, %ymm11
+        vpxor	-64(%rax), %ymm9, %ymm12
+        vpxor	-64(%rdi), %ymm5, %ymm13
+        vpxor	-32(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rdi)
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Round 20
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm4, %ymm14
+        vpxor	-32(%rdi), %ymm2, %ymm12
+        vpxor	(%rdi), %ymm1, %ymm11
+        vpxor	32(%rdi), %ymm11, %ymm11
+        vpxor	96(%rdi), %ymm14, %ymm14
+        vpxor	128(%rdi), %ymm3, %ymm13
+        vpxor	-96(%rax), %ymm12, %ymm12
+        vpxor	-32(%rax), %ymm11, %ymm11
+        vpxor	(%rax), %ymm10, %ymm10
+        vpxor	32(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm13, %ymm13
+        vpxor	128(%rax), %ymm12, %ymm12
+        vpxor	-96(%rcx), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm10, %ymm10
+        vpxor	(%rcx), %ymm14, %ymm14
+        vpxor	32(%rcx), %ymm13, %ymm13
+        vpxor	64(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm10, %ymm10
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-32(%rax), %ymm6, %ymm11
+        vpxor	64(%rcx), %ymm7, %ymm12
+        vpxor	128(%rdi), %ymm8, %ymm13
+        vpxor	-32(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	640(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Row 1
+        vpxor	32(%rcx), %ymm8, %ymm10
+        vpxor	96(%rdi), %ymm9, %ymm11
+        vpxor	-64(%rcx), %ymm5, %ymm12
+        vpxor	(%rdi), %ymm6, %ymm13
+        vpxor	-64(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rcx)
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, -64(%rax)
+        # Row 2
+        vpxor	-96(%rcx), %ymm6, %ymm10
+        vpxor	-32(%rdi), %ymm7, %ymm11
+        vpxor	64(%rax), %ymm8, %ymm12
+        vpxor	(%rcx), %ymm9, %ymm13
+        vpxor	64(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rcx)
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Row 3
+        vpxor	32(%rax), %ymm9, %ymm10
+        vpxor	128(%rcx), %ymm5, %ymm11
+        vpxor	32(%rdi), %ymm6, %ymm12
+        vpxor	128(%rax), %ymm7, %ymm13
+        vpxor	-64(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rax)
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Row 4
+        vpxor	-96(%rax), %ymm7, %ymm10
+        vpxor	96(%rax), %ymm8, %ymm11
+        vpxor	-96(%rdi), %ymm9, %ymm12
+        vpxor	(%rax), %ymm5, %ymm13
+        vpxor	96(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rax)
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Round 21
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm4, %ymm14
+        vpxor	-32(%rdi), %ymm1, %ymm11
+        vpxor	(%rdi), %ymm3, %ymm13
+        vpxor	32(%rdi), %ymm2, %ymm12
+        vpxor	64(%rdi), %ymm14, %ymm14
+        vpxor	96(%rdi), %ymm11, %ymm11
+        vpxor	128(%rdi), %ymm13, %ymm13
+        vpxor	-64(%rax), %ymm14, %ymm14
+        vpxor	-32(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm10, %ymm10
+        vpxor	64(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm13, %ymm13
+        vpxor	-96(%rcx), %ymm10, %ymm10
+        vpxor	-64(%rcx), %ymm12, %ymm12
+        vpxor	-32(%rcx), %ymm14, %ymm14
+        vpxor	(%rcx), %ymm13, %ymm13
+        vpxor	32(%rcx), %ymm10, %ymm10
+        vpxor	64(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	96(%rdi), %ymm6, %ymm11
+        vpxor	64(%rax), %ymm7, %ymm12
+        vpxor	128(%rax), %ymm8, %ymm13
+        vpxor	96(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	672(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Row 1
+        vpxor	128(%rdi), %ymm8, %ymm10
+        vpxor	-64(%rax), %ymm9, %ymm11
+        vpxor	-96(%rcx), %ymm5, %ymm12
+        vpxor	128(%rcx), %ymm6, %ymm13
+        vpxor	-96(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Row 2
+        vpxor	-32(%rax), %ymm6, %ymm10
+        vpxor	-64(%rcx), %ymm7, %ymm11
+        vpxor	(%rcx), %ymm8, %ymm12
+        vpxor	-64(%rdi), %ymm9, %ymm13
+        vpxor	-96(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rax)
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, -96(%rax)
+        # Row 3
+        vpxor	-32(%rcx), %ymm9, %ymm10
+        vpxor	32(%rcx), %ymm5, %ymm11
+        vpxor	-32(%rdi), %ymm6, %ymm12
+        vpxor	32(%rdi), %ymm7, %ymm13
+        vpxor	(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rcx)
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, (%rax)
+        # Row 4
+        vpxor	64(%rcx), %ymm7, %ymm10
+        vpxor	(%rdi), %ymm8, %ymm11
+        vpxor	64(%rdi), %ymm9, %ymm12
+        vpxor	32(%rax), %ymm5, %ymm13
+        vpxor	96(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rcx)
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, 96(%rax)
+        # Round 22
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm4, %ymm14
+        vpxor	-64(%rdi), %ymm3, %ymm13
+        vpxor	-32(%rdi), %ymm2, %ymm12
+        vpxor	32(%rdi), %ymm13, %ymm13
+        vpxor	96(%rdi), %ymm1, %ymm11
+        vpxor	128(%rdi), %ymm10, %ymm10
+        vpxor	-96(%rax), %ymm14, %ymm14
+        vpxor	-64(%rax), %ymm11, %ymm11
+        vpxor	-32(%rax), %ymm10, %ymm10
+        vpxor	(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm13, %ymm13
+        vpxor	-96(%rcx), %ymm12, %ymm12
+        vpxor	-64(%rcx), %ymm11, %ymm11
+        vpxor	-32(%rcx), %ymm10, %ymm10
+        vpxor	(%rcx), %ymm12, %ymm12
+        vpxor	32(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm14, %ymm14
+        vpxor	128(%rcx), %ymm13, %ymm13
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-64(%rax), %ymm6, %ymm11
+        vpxor	(%rcx), %ymm7, %ymm12
+        vpxor	32(%rdi), %ymm8, %ymm13
+        vpxor	96(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	704(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, 96(%rax)
+        # Row 1
+        vpxor	128(%rax), %ymm8, %ymm10
+        vpxor	-96(%rdi), %ymm9, %ymm11
+        vpxor	-32(%rax), %ymm5, %ymm12
+        vpxor	32(%rcx), %ymm6, %ymm13
+        vpxor	64(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rax)
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Row 2
+        vpxor	96(%rdi), %ymm6, %ymm10
+        vpxor	-96(%rcx), %ymm7, %ymm11
+        vpxor	-64(%rdi), %ymm8, %ymm12
+        vpxor	(%rax), %ymm9, %ymm13
+        vpxor	64(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rdi)
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Row 3
+        vpxor	96(%rcx), %ymm9, %ymm10
+        vpxor	128(%rdi), %ymm5, %ymm11
+        vpxor	-64(%rcx), %ymm6, %ymm12
+        vpxor	-32(%rdi), %ymm7, %ymm13
+        vpxor	32(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rcx)
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, 32(%rax)
+        # Row 4
+        vpxor	64(%rax), %ymm7, %ymm10
+        vpxor	128(%rcx), %ymm8, %ymm11
+        vpxor	-96(%rax), %ymm9, %ymm12
+        vpxor	-32(%rcx), %ymm5, %ymm13
+        vpxor	(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rax)
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, (%rdi)
+        # Round 23
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm1, %ymm11
+        vpxor	-64(%rdi), %ymm2, %ymm12
+        vpxor	-32(%rdi), %ymm3, %ymm13
+        vpxor	32(%rdi), %ymm13, %ymm13
+        vpxor	64(%rdi), %ymm4, %ymm14
+        vpxor	96(%rdi), %ymm10, %ymm10
+        vpxor	128(%rdi), %ymm11, %ymm11
+        vpxor	-64(%rax), %ymm11, %ymm11
+        vpxor	-32(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm14, %ymm14
+        vpxor	96(%rax), %ymm14, %ymm14
+        vpxor	128(%rax), %ymm10, %ymm10
+        vpxor	-96(%rcx), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm12, %ymm12
+        vpxor	32(%rcx), %ymm13, %ymm13
+        vpxor	64(%rcx), %ymm14, %ymm14
+        vpxor	96(%rcx), %ymm10, %ymm10
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-96(%rdi), %ymm6, %ymm11
+        vpxor	-64(%rdi), %ymm7, %ymm12
+        vpxor	-32(%rdi), %ymm8, %ymm13
+        vpxor	(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	736(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, (%rdi)
+        # Row 1
+        vpxor	32(%rdi), %ymm8, %ymm10
+        vpxor	64(%rdi), %ymm9, %ymm11
+        vpxor	96(%rdi), %ymm5, %ymm12
+        vpxor	128(%rdi), %ymm6, %ymm13
+        vpxor	-96(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rdi)
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, -96(%rax)
+        # Row 2
+        vpxor	-64(%rax), %ymm6, %ymm10
+        vpxor	-32(%rax), %ymm7, %ymm11
+        vpxor	(%rax), %ymm8, %ymm12
+        vpxor	32(%rax), %ymm9, %ymm13
+        vpxor	64(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rax)
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, 64(%rax)
+        # Row 3
+        vpxor	96(%rax), %ymm9, %ymm10
+        vpxor	128(%rax), %ymm5, %ymm11
+        vpxor	-96(%rcx), %ymm6, %ymm12
+        vpxor	-64(%rcx), %ymm7, %ymm13
+        vpxor	-32(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rax)
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Row 4
+        vpxor	(%rcx), %ymm7, %ymm10
+        vpxor	32(%rcx), %ymm8, %ymm11
+        vpxor	64(%rcx), %ymm9, %ymm12
+        vpxor	96(%rcx), %ymm5, %ymm13
+        vpxor	128(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rcx)
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, 128(%rcx)
+        subq	$0x80, %rdi
+        vmovdqu	%ymm15, (%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_sha3_128_blocksx4_seed_avx2,.-kyber_sha3_128_blocksx4_seed_avx2
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.data
+#else
+.section	__DATA,__data
+#endif /* __APPLE__ */
+#ifndef __APPLE__
+.align	32
+#else
+.p2align	5
+#endif /* __APPLE__ */
+L_sha3_256_blockx4_seed_avx2_end_mark:
+.quad	0x8000000000000000, 0x8000000000000000
+.quad	0x8000000000000000, 0x8000000000000000
+#ifndef __APPLE__
+.text
+.globl	kyber_sha3_256_blocksx4_seed_avx2
+.type	kyber_sha3_256_blocksx4_seed_avx2,@function
+.align	16
+kyber_sha3_256_blocksx4_seed_avx2:
+#else
+.section	__TEXT,__text
+.globl	_kyber_sha3_256_blocksx4_seed_avx2
+.p2align	4
+_kyber_sha3_256_blocksx4_seed_avx2:
+#endif /* __APPLE__ */
+        leaq	L_sha3_parallel_4_r(%rip), %rdx
+        movq	%rdi, %rax
+        movq	%rdi, %rcx
+        vpbroadcastq	(%rsi), %ymm15
+        addq	$0x80, %rdi
+        vpbroadcastq	8(%rsi), %ymm11
+        addq	$0x180, %rax
+        vpbroadcastq	16(%rsi), %ymm12
+        addq	$0x280, %rcx
+        vpbroadcastq	24(%rsi), %ymm13
+        vmovdqu	L_sha3_256_blockx4_seed_avx2_end_mark(%rip), %ymm5
+        vpxor	%ymm6, %ymm6, %ymm6
+        vmovdqu	%ymm11, -96(%rdi)
+        vmovdqu	%ymm12, -64(%rdi)
+        vmovdqu	%ymm13, -32(%rdi)
+        vmovdqu	(%rdi), %ymm14
+        vmovdqu	%ymm6, 32(%rdi)
+        vmovdqu	%ymm6, 64(%rdi)
+        vmovdqu	%ymm6, 96(%rdi)
+        vmovdqu	%ymm6, 128(%rdi)
+        vmovdqu	%ymm6, -96(%rax)
+        vmovdqu	%ymm6, -64(%rax)
+        vmovdqu	%ymm6, -32(%rax)
+        vmovdqu	%ymm6, (%rax)
+        vmovdqu	%ymm6, 32(%rax)
+        vmovdqu	%ymm6, 64(%rax)
+        vmovdqu	%ymm6, 96(%rax)
+        vmovdqu	%ymm5, 128(%rax)
+        vmovdqu	%ymm6, -96(%rcx)
+        vmovdqu	%ymm6, -64(%rcx)
+        vmovdqu	%ymm6, -32(%rcx)
+        vmovdqu	%ymm6, (%rcx)
+        vmovdqu	%ymm6, 32(%rcx)
+        vmovdqu	%ymm6, 64(%rcx)
+        vmovdqu	%ymm6, 96(%rcx)
+        vmovdqu	%ymm6, 128(%rcx)
+        vmovdqu	%ymm15, %ymm10
+        vpxor	%ymm5, %ymm11, %ymm11
+        # Round 0
+        # Calc b[0..4]
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	64(%rdi), %ymm6, %ymm11
+        vpxor	(%rax), %ymm7, %ymm12
+        vpxor	-64(%rcx), %ymm8, %ymm13
+        vpxor	128(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, 128(%rcx)
+        # Row 1
+        vpxor	-32(%rdi), %ymm8, %ymm10
+        vpxor	-96(%rax), %ymm9, %ymm11
+        vpxor	-64(%rax), %ymm5, %ymm12
+        vpxor	128(%rax), %ymm6, %ymm13
+        vpxor	64(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rdi)
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Row 2
+        vpxor	-96(%rdi), %ymm6, %ymm10
+        vpxor	96(%rdi), %ymm7, %ymm11
+        vpxor	32(%rax), %ymm8, %ymm12
+        vpxor	-32(%rcx), %ymm9, %ymm13
+        vpxor	(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rdi)
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, (%rcx)
+        # Row 3
+        vpxor	(%rdi), %ymm9, %ymm10
+        vpxor	32(%rdi), %ymm5, %ymm11
+        vpxor	-32(%rax), %ymm6, %ymm12
+        vpxor	-96(%rcx), %ymm7, %ymm13
+        vpxor	96(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Row 4
+        vpxor	-64(%rdi), %ymm7, %ymm10
+        vpxor	128(%rdi), %ymm8, %ymm11
+        vpxor	64(%rax), %ymm9, %ymm12
+        vpxor	96(%rax), %ymm5, %ymm13
+        vpxor	32(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rdi)
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Round 1
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm10, %ymm10
+        vpxor	-32(%rdi), %ymm10, %ymm10
+        vpxor	(%rdi), %ymm10, %ymm10
+        vpxor	32(%rdi), %ymm1, %ymm11
+        vpxor	64(%rdi), %ymm11, %ymm11
+        vpxor	96(%rdi), %ymm11, %ymm11
+        vpxor	-96(%rax), %ymm11, %ymm11
+        vpxor	-64(%rax), %ymm2, %ymm12
+        vpxor	-32(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm12, %ymm12
+        vpxor	32(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm3, %ymm13
+        vpxor	-96(%rcx), %ymm13, %ymm13
+        vpxor	-64(%rcx), %ymm13, %ymm13
+        vpxor	-32(%rcx), %ymm13, %ymm13
+        vpxor	(%rcx), %ymm4, %ymm14
+        vpxor	64(%rcx), %ymm14, %ymm14
+        vpxor	96(%rcx), %ymm14, %ymm14
+        vpxor	128(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-96(%rax), %ymm6, %ymm11
+        vpxor	32(%rax), %ymm7, %ymm12
+        vpxor	-96(%rcx), %ymm8, %ymm13
+        vpxor	32(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	32(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Row 1
+        vpxor	-64(%rcx), %ymm8, %ymm10
+        vpxor	64(%rcx), %ymm9, %ymm11
+        vpxor	-96(%rdi), %ymm5, %ymm12
+        vpxor	32(%rdi), %ymm6, %ymm13
+        vpxor	64(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rcx)
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, 64(%rax)
+        # Row 2
+        vpxor	64(%rdi), %ymm6, %ymm10
+        vpxor	-64(%rax), %ymm7, %ymm11
+        vpxor	-32(%rcx), %ymm8, %ymm12
+        vpxor	96(%rcx), %ymm9, %ymm13
+        vpxor	-64(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rdi)
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Row 3
+        vpxor	128(%rcx), %ymm9, %ymm10
+        vpxor	-32(%rdi), %ymm5, %ymm11
+        vpxor	96(%rdi), %ymm6, %ymm12
+        vpxor	-32(%rax), %ymm7, %ymm13
+        vpxor	96(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rcx)
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, 96(%rax)
+        # Row 4
+        vpxor	(%rax), %ymm7, %ymm10
+        vpxor	128(%rax), %ymm8, %ymm11
+        vpxor	(%rcx), %ymm9, %ymm12
+        vpxor	(%rdi), %ymm5, %ymm13
+        vpxor	128(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rax)
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Round 2
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm2, %ymm12
+        vpxor	-64(%rdi), %ymm4, %ymm14
+        vpxor	-32(%rdi), %ymm1, %ymm11
+        vpxor	32(%rdi), %ymm3, %ymm13
+        vpxor	64(%rdi), %ymm10, %ymm10
+        vpxor	96(%rdi), %ymm12, %ymm12
+        vpxor	-96(%rax), %ymm11, %ymm11
+        vpxor	-64(%rax), %ymm11, %ymm11
+        vpxor	-32(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm12, %ymm12
+        vpxor	64(%rax), %ymm14, %ymm14
+        vpxor	96(%rax), %ymm14, %ymm14
+        vpxor	-96(%rcx), %ymm13, %ymm13
+        vpxor	-64(%rcx), %ymm10, %ymm10
+        vpxor	-32(%rcx), %ymm12, %ymm12
+        vpxor	32(%rcx), %ymm14, %ymm14
+        vpxor	64(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm13, %ymm13
+        vpxor	128(%rcx), %ymm10, %ymm10
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	64(%rcx), %ymm6, %ymm11
+        vpxor	-32(%rcx), %ymm7, %ymm12
+        vpxor	-32(%rax), %ymm8, %ymm13
+        vpxor	128(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	64(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Row 1
+        vpxor	-96(%rcx), %ymm8, %ymm10
+        vpxor	64(%rax), %ymm9, %ymm11
+        vpxor	64(%rdi), %ymm5, %ymm12
+        vpxor	-32(%rdi), %ymm6, %ymm13
+        vpxor	(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rcx)
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, (%rcx)
+        # Row 2
+        vpxor	-96(%rax), %ymm6, %ymm10
+        vpxor	-96(%rdi), %ymm7, %ymm11
+        vpxor	96(%rcx), %ymm8, %ymm12
+        vpxor	96(%rax), %ymm9, %ymm13
+        vpxor	(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rax)
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, (%rax)
+        # Row 3
+        vpxor	32(%rcx), %ymm9, %ymm10
+        vpxor	-64(%rcx), %ymm5, %ymm11
+        vpxor	-64(%rax), %ymm6, %ymm12
+        vpxor	96(%rdi), %ymm7, %ymm13
+        vpxor	(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rcx)
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, (%rdi)
+        # Row 4
+        vpxor	32(%rax), %ymm7, %ymm10
+        vpxor	32(%rdi), %ymm8, %ymm11
+        vpxor	-64(%rdi), %ymm9, %ymm12
+        vpxor	128(%rcx), %ymm5, %ymm13
+        vpxor	128(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rax)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, 128(%rax)
+        # Round 3
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm1, %ymm11
+        vpxor	-32(%rdi), %ymm3, %ymm13
+        vpxor	(%rdi), %ymm4, %ymm14
+        vpxor	64(%rdi), %ymm2, %ymm12
+        vpxor	96(%rdi), %ymm13, %ymm13
+        vpxor	128(%rdi), %ymm14, %ymm14
+        vpxor	-96(%rax), %ymm10, %ymm10
+        vpxor	-64(%rax), %ymm12, %ymm12
+        vpxor	-32(%rax), %ymm13, %ymm13
+        vpxor	(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm11, %ymm11
+        vpxor	96(%rax), %ymm13, %ymm13
+        vpxor	-96(%rcx), %ymm10, %ymm10
+        vpxor	-64(%rcx), %ymm11, %ymm11
+        vpxor	-32(%rcx), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm14, %ymm14
+        vpxor	32(%rcx), %ymm10, %ymm10
+        vpxor	64(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	64(%rax), %ymm6, %ymm11
+        vpxor	96(%rcx), %ymm7, %ymm12
+        vpxor	96(%rdi), %ymm8, %ymm13
+        vpxor	128(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	96(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, 128(%rax)
+        # Row 1
+        vpxor	-32(%rax), %ymm8, %ymm10
+        vpxor	(%rcx), %ymm9, %ymm11
+        vpxor	-96(%rax), %ymm5, %ymm12
+        vpxor	-64(%rcx), %ymm6, %ymm13
+        vpxor	-64(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rax)
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Row 2
+        vpxor	64(%rcx), %ymm6, %ymm10
+        vpxor	64(%rdi), %ymm7, %ymm11
+        vpxor	96(%rax), %ymm8, %ymm12
+        vpxor	(%rdi), %ymm9, %ymm13
+        vpxor	32(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rcx)
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, 32(%rax)
+        # Row 3
+        vpxor	128(%rdi), %ymm9, %ymm10
+        vpxor	-96(%rcx), %ymm5, %ymm11
+        vpxor	-96(%rdi), %ymm6, %ymm12
+        vpxor	-64(%rax), %ymm7, %ymm13
+        vpxor	128(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, 128(%rcx)
+        # Row 4
+        vpxor	-32(%rcx), %ymm7, %ymm10
+        vpxor	-32(%rdi), %ymm8, %ymm11
+        vpxor	(%rax), %ymm9, %ymm12
+        vpxor	32(%rcx), %ymm5, %ymm13
+        vpxor	32(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rcx)
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Round 4
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm2, %ymm12
+        vpxor	-64(%rdi), %ymm4, %ymm14
+        vpxor	(%rdi), %ymm3, %ymm13
+        vpxor	64(%rdi), %ymm1, %ymm11
+        vpxor	96(%rdi), %ymm13, %ymm13
+        vpxor	128(%rdi), %ymm10, %ymm10
+        vpxor	-96(%rax), %ymm12, %ymm12
+        vpxor	-64(%rax), %ymm13, %ymm13
+        vpxor	-32(%rax), %ymm10, %ymm10
+        vpxor	32(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm11, %ymm11
+        vpxor	96(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm14, %ymm14
+        vpxor	-96(%rcx), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm13, %ymm13
+        vpxor	(%rcx), %ymm11, %ymm11
+        vpxor	64(%rcx), %ymm10, %ymm10
+        vpxor	96(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	(%rcx), %ymm6, %ymm11
+        vpxor	96(%rax), %ymm7, %ymm12
+        vpxor	-64(%rax), %ymm8, %ymm13
+        vpxor	32(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	128(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Row 1
+        vpxor	96(%rdi), %ymm8, %ymm10
+        vpxor	-64(%rdi), %ymm9, %ymm11
+        vpxor	64(%rcx), %ymm5, %ymm12
+        vpxor	-96(%rcx), %ymm6, %ymm13
+        vpxor	(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rdi)
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, (%rax)
+        # Row 2
+        vpxor	64(%rax), %ymm6, %ymm10
+        vpxor	-96(%rax), %ymm7, %ymm11
+        vpxor	(%rdi), %ymm8, %ymm12
+        vpxor	128(%rcx), %ymm9, %ymm13
+        vpxor	-32(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rax)
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Row 3
+        vpxor	128(%rax), %ymm9, %ymm10
+        vpxor	-32(%rax), %ymm5, %ymm11
+        vpxor	64(%rdi), %ymm6, %ymm12
+        vpxor	-96(%rdi), %ymm7, %ymm13
+        vpxor	32(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rax)
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Row 4
+        vpxor	96(%rcx), %ymm7, %ymm10
+        vpxor	-64(%rcx), %ymm8, %ymm11
+        vpxor	32(%rax), %ymm9, %ymm12
+        vpxor	128(%rdi), %ymm5, %ymm13
+        vpxor	-32(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rcx)
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Round 5
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm3, %ymm13
+        vpxor	-64(%rdi), %ymm1, %ymm11
+        vpxor	(%rdi), %ymm2, %ymm12
+        vpxor	32(%rdi), %ymm4, %ymm14
+        vpxor	64(%rdi), %ymm12, %ymm12
+        vpxor	96(%rdi), %ymm10, %ymm10
+        vpxor	-96(%rax), %ymm11, %ymm11
+        vpxor	-64(%rax), %ymm13, %ymm13
+        vpxor	-32(%rax), %ymm11, %ymm11
+        vpxor	(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm10, %ymm10
+        vpxor	96(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm10, %ymm10
+        vpxor	-96(%rcx), %ymm13, %ymm13
+        vpxor	-32(%rcx), %ymm14, %ymm14
+        vpxor	(%rcx), %ymm11, %ymm11
+        vpxor	32(%rcx), %ymm14, %ymm14
+        vpxor	64(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm13, %ymm13
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-64(%rdi), %ymm6, %ymm11
+        vpxor	(%rdi), %ymm7, %ymm12
+        vpxor	-96(%rdi), %ymm8, %ymm13
+        vpxor	-32(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	160(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Row 1
+        vpxor	-64(%rax), %ymm8, %ymm10
+        vpxor	(%rax), %ymm9, %ymm11
+        vpxor	64(%rax), %ymm5, %ymm12
+        vpxor	-32(%rax), %ymm6, %ymm13
+        vpxor	32(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rax)
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, 32(%rax)
+        # Row 2
+        vpxor	(%rcx), %ymm6, %ymm10
+        vpxor	64(%rcx), %ymm7, %ymm11
+        vpxor	128(%rcx), %ymm8, %ymm12
+        vpxor	32(%rcx), %ymm9, %ymm13
+        vpxor	96(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rcx)
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Row 3
+        vpxor	32(%rdi), %ymm9, %ymm10
+        vpxor	96(%rdi), %ymm5, %ymm11
+        vpxor	-96(%rax), %ymm6, %ymm12
+        vpxor	64(%rdi), %ymm7, %ymm13
+        vpxor	128(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rdi)
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Row 4
+        vpxor	96(%rax), %ymm7, %ymm10
+        vpxor	-96(%rcx), %ymm8, %ymm11
+        vpxor	-32(%rcx), %ymm9, %ymm12
+        vpxor	128(%rax), %ymm5, %ymm13
+        vpxor	-64(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rax)
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Round 6
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm3, %ymm13
+        vpxor	-64(%rdi), %ymm1, %ymm11
+        vpxor	-32(%rdi), %ymm4, %ymm14
+        vpxor	(%rdi), %ymm2, %ymm12
+        vpxor	32(%rdi), %ymm10, %ymm10
+        vpxor	64(%rdi), %ymm13, %ymm13
+        vpxor	96(%rdi), %ymm11, %ymm11
+        vpxor	128(%rdi), %ymm14, %ymm14
+        vpxor	-96(%rax), %ymm12, %ymm12
+        vpxor	-64(%rax), %ymm10, %ymm10
+        vpxor	-32(%rax), %ymm13, %ymm13
+        vpxor	(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm10, %ymm10
+        vpxor	32(%rcx), %ymm13, %ymm13
+        vpxor	64(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm14, %ymm14
+        vpxor	128(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	(%rax), %ymm6, %ymm11
+        vpxor	128(%rcx), %ymm7, %ymm12
+        vpxor	64(%rdi), %ymm8, %ymm13
+        vpxor	-64(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	192(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Row 1
+        vpxor	-96(%rdi), %ymm8, %ymm10
+        vpxor	32(%rax), %ymm9, %ymm11
+        vpxor	(%rcx), %ymm5, %ymm12
+        vpxor	96(%rdi), %ymm6, %ymm13
+        vpxor	-32(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rdi)
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Row 2
+        vpxor	-64(%rdi), %ymm6, %ymm10
+        vpxor	64(%rax), %ymm7, %ymm11
+        vpxor	32(%rcx), %ymm8, %ymm12
+        vpxor	128(%rdi), %ymm9, %ymm13
+        vpxor	96(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rdi)
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, 96(%rax)
+        # Row 3
+        vpxor	-32(%rdi), %ymm9, %ymm10
+        vpxor	-64(%rax), %ymm5, %ymm11
+        vpxor	64(%rcx), %ymm6, %ymm12
+        vpxor	-96(%rax), %ymm7, %ymm13
+        vpxor	128(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rdi)
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, 128(%rax)
+        # Row 4
+        vpxor	(%rdi), %ymm7, %ymm10
+        vpxor	-32(%rax), %ymm8, %ymm11
+        vpxor	96(%rcx), %ymm9, %ymm12
+        vpxor	32(%rdi), %ymm5, %ymm13
+        vpxor	-96(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Round 7
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm10, %ymm10
+        vpxor	-64(%rdi), %ymm10, %ymm10
+        vpxor	-32(%rdi), %ymm10, %ymm10
+        vpxor	64(%rdi), %ymm3, %ymm13
+        vpxor	96(%rdi), %ymm13, %ymm13
+        vpxor	128(%rdi), %ymm13, %ymm13
+        vpxor	-96(%rax), %ymm13, %ymm13
+        vpxor	-64(%rax), %ymm1, %ymm11
+        vpxor	(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm11, %ymm11
+        vpxor	64(%rax), %ymm11, %ymm11
+        vpxor	96(%rax), %ymm4, %ymm14
+        vpxor	128(%rax), %ymm14, %ymm14
+        vpxor	-64(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm14, %ymm14
+        vpxor	(%rcx), %ymm2, %ymm12
+        vpxor	32(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	32(%rax), %ymm6, %ymm11
+        vpxor	32(%rcx), %ymm7, %ymm12
+        vpxor	-96(%rax), %ymm8, %ymm13
+        vpxor	-96(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	224(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Row 1
+        vpxor	64(%rdi), %ymm8, %ymm10
+        vpxor	-32(%rcx), %ymm9, %ymm11
+        vpxor	-64(%rdi), %ymm5, %ymm12
+        vpxor	-64(%rax), %ymm6, %ymm13
+        vpxor	96(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rdi)
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Row 2
+        vpxor	(%rax), %ymm6, %ymm10
+        vpxor	(%rcx), %ymm7, %ymm11
+        vpxor	128(%rdi), %ymm8, %ymm12
+        vpxor	128(%rax), %ymm9, %ymm13
+        vpxor	(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rax)
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, (%rdi)
+        # Row 3
+        vpxor	-64(%rcx), %ymm9, %ymm10
+        vpxor	-96(%rdi), %ymm5, %ymm11
+        vpxor	64(%rax), %ymm6, %ymm12
+        vpxor	64(%rcx), %ymm7, %ymm13
+        vpxor	32(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rcx)
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Row 4
+        vpxor	128(%rcx), %ymm7, %ymm10
+        vpxor	96(%rdi), %ymm8, %ymm11
+        vpxor	96(%rax), %ymm9, %ymm12
+        vpxor	-32(%rdi), %ymm5, %ymm13
+        vpxor	-32(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rcx)
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, -32(%rax)
+        # Round 8
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm1, %ymm11
+        vpxor	-64(%rdi), %ymm2, %ymm12
+        vpxor	(%rdi), %ymm4, %ymm14
+        vpxor	32(%rdi), %ymm14, %ymm14
+        vpxor	64(%rdi), %ymm10, %ymm10
+        vpxor	128(%rdi), %ymm12, %ymm12
+        vpxor	-96(%rax), %ymm3, %ymm13
+        vpxor	-64(%rax), %ymm13, %ymm13
+        vpxor	(%rax), %ymm10, %ymm10
+        vpxor	32(%rax), %ymm11, %ymm11
+        vpxor	64(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm13, %ymm13
+        vpxor	-96(%rcx), %ymm14, %ymm14
+        vpxor	-64(%rcx), %ymm10, %ymm10
+        vpxor	-32(%rcx), %ymm11, %ymm11
+        vpxor	(%rcx), %ymm11, %ymm11
+        vpxor	32(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm13, %ymm13
+        vpxor	96(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-32(%rcx), %ymm6, %ymm11
+        vpxor	128(%rdi), %ymm7, %ymm12
+        vpxor	64(%rcx), %ymm8, %ymm13
+        vpxor	-32(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	256(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, -32(%rax)
+        # Row 1
+        vpxor	-96(%rax), %ymm8, %ymm10
+        vpxor	96(%rcx), %ymm9, %ymm11
+        vpxor	(%rax), %ymm5, %ymm12
+        vpxor	-96(%rdi), %ymm6, %ymm13
+        vpxor	96(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rax)
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, 96(%rax)
+        # Row 2
+        vpxor	32(%rax), %ymm6, %ymm10
+        vpxor	-64(%rdi), %ymm7, %ymm11
+        vpxor	128(%rax), %ymm8, %ymm12
+        vpxor	32(%rdi), %ymm9, %ymm13
+        vpxor	128(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rax)
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, 128(%rcx)
+        # Row 3
+        vpxor	-96(%rcx), %ymm9, %ymm10
+        vpxor	64(%rdi), %ymm5, %ymm11
+        vpxor	(%rcx), %ymm6, %ymm12
+        vpxor	64(%rax), %ymm7, %ymm13
+        vpxor	-32(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rcx)
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Row 4
+        vpxor	32(%rcx), %ymm7, %ymm10
+        vpxor	-64(%rax), %ymm8, %ymm11
+        vpxor	(%rdi), %ymm9, %ymm12
+        vpxor	-64(%rcx), %ymm5, %ymm13
+        vpxor	96(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rcx)
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Round 9
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm3, %ymm13
+        vpxor	-64(%rdi), %ymm1, %ymm11
+        vpxor	-32(%rdi), %ymm4, %ymm14
+        vpxor	32(%rdi), %ymm13, %ymm13
+        vpxor	64(%rdi), %ymm11, %ymm11
+        vpxor	128(%rdi), %ymm2, %ymm12
+        vpxor	-96(%rax), %ymm10, %ymm10
+        vpxor	-32(%rax), %ymm14, %ymm14
+        vpxor	(%rax), %ymm12, %ymm12
+        vpxor	32(%rax), %ymm10, %ymm10
+        vpxor	64(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm14, %ymm14
+        vpxor	128(%rax), %ymm12, %ymm12
+        vpxor	-96(%rcx), %ymm10, %ymm10
+        vpxor	-32(%rcx), %ymm11, %ymm11
+        vpxor	(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm13, %ymm13
+        vpxor	96(%rcx), %ymm11, %ymm11
+        vpxor	128(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	96(%rcx), %ymm6, %ymm11
+        vpxor	128(%rax), %ymm7, %ymm12
+        vpxor	64(%rax), %ymm8, %ymm13
+        vpxor	96(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	288(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Row 1
+        vpxor	64(%rcx), %ymm8, %ymm10
+        vpxor	96(%rax), %ymm9, %ymm11
+        vpxor	32(%rax), %ymm5, %ymm12
+        vpxor	64(%rdi), %ymm6, %ymm13
+        vpxor	(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rcx)
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, (%rdi)
+        # Row 2
+        vpxor	-32(%rcx), %ymm6, %ymm10
+        vpxor	(%rax), %ymm7, %ymm11
+        vpxor	32(%rdi), %ymm8, %ymm12
+        vpxor	-32(%rdi), %ymm9, %ymm13
+        vpxor	32(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rcx)
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Row 3
+        vpxor	-32(%rax), %ymm9, %ymm10
+        vpxor	-96(%rax), %ymm5, %ymm11
+        vpxor	-64(%rdi), %ymm6, %ymm12
+        vpxor	(%rcx), %ymm7, %ymm13
+        vpxor	-64(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rax)
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Row 4
+        vpxor	128(%rdi), %ymm7, %ymm10
+        vpxor	-96(%rdi), %ymm8, %ymm11
+        vpxor	128(%rcx), %ymm9, %ymm12
+        vpxor	-96(%rcx), %ymm5, %ymm13
+        vpxor	-64(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, -64(%rax)
+        # Round 10
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm2, %ymm12
+        vpxor	-32(%rdi), %ymm3, %ymm13
+        vpxor	(%rdi), %ymm4, %ymm14
+        vpxor	32(%rdi), %ymm12, %ymm12
+        vpxor	64(%rdi), %ymm13, %ymm13
+        vpxor	96(%rdi), %ymm14, %ymm14
+        vpxor	-96(%rax), %ymm1, %ymm11
+        vpxor	-32(%rax), %ymm10, %ymm10
+        vpxor	(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm12, %ymm12
+        vpxor	64(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm11, %ymm11
+        vpxor	128(%rax), %ymm12, %ymm12
+        vpxor	-64(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm10, %ymm10
+        vpxor	(%rcx), %ymm13, %ymm13
+        vpxor	32(%rcx), %ymm14, %ymm14
+        vpxor	64(%rcx), %ymm10, %ymm10
+        vpxor	96(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	96(%rax), %ymm6, %ymm11
+        vpxor	32(%rdi), %ymm7, %ymm12
+        vpxor	(%rcx), %ymm8, %ymm13
+        vpxor	-64(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	320(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, -64(%rax)
+        # Row 1
+        vpxor	64(%rax), %ymm8, %ymm10
+        vpxor	(%rdi), %ymm9, %ymm11
+        vpxor	-32(%rcx), %ymm5, %ymm12
+        vpxor	-96(%rax), %ymm6, %ymm13
+        vpxor	128(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rax)
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, 128(%rcx)
+        # Row 2
+        vpxor	96(%rcx), %ymm6, %ymm10
+        vpxor	32(%rax), %ymm7, %ymm11
+        vpxor	-32(%rdi), %ymm8, %ymm12
+        vpxor	-64(%rcx), %ymm9, %ymm13
+        vpxor	128(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rcx)
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Row 3
+        vpxor	96(%rdi), %ymm9, %ymm10
+        vpxor	64(%rcx), %ymm5, %ymm11
+        vpxor	(%rax), %ymm6, %ymm12
+        vpxor	-64(%rdi), %ymm7, %ymm13
+        vpxor	-96(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rdi)
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Row 4
+        vpxor	128(%rax), %ymm7, %ymm10
+        vpxor	64(%rdi), %ymm8, %ymm11
+        vpxor	32(%rcx), %ymm9, %ymm12
+        vpxor	-32(%rax), %ymm5, %ymm13
+        vpxor	-96(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rax)
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Round 11
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm3, %ymm13
+        vpxor	-32(%rdi), %ymm2, %ymm12
+        vpxor	(%rdi), %ymm1, %ymm11
+        vpxor	32(%rdi), %ymm12, %ymm12
+        vpxor	96(%rdi), %ymm10, %ymm10
+        vpxor	128(%rdi), %ymm4, %ymm14
+        vpxor	-96(%rax), %ymm13, %ymm13
+        vpxor	-64(%rax), %ymm14, %ymm14
+        vpxor	(%rax), %ymm12, %ymm12
+        vpxor	32(%rax), %ymm11, %ymm11
+        vpxor	64(%rax), %ymm10, %ymm10
+        vpxor	96(%rax), %ymm11, %ymm11
+        vpxor	-96(%rcx), %ymm14, %ymm14
+        vpxor	-64(%rcx), %ymm13, %ymm13
+        vpxor	-32(%rcx), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm13, %ymm13
+        vpxor	64(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm10, %ymm10
+        vpxor	128(%rcx), %ymm14, %ymm14
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	(%rdi), %ymm6, %ymm11
+        vpxor	-32(%rdi), %ymm7, %ymm12
+        vpxor	-64(%rdi), %ymm8, %ymm13
+        vpxor	-96(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	352(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Row 1
+        vpxor	(%rcx), %ymm8, %ymm10
+        vpxor	128(%rcx), %ymm9, %ymm11
+        vpxor	96(%rcx), %ymm5, %ymm12
+        vpxor	64(%rcx), %ymm6, %ymm13
+        vpxor	32(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rcx)
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, 32(%rcx)
+        # Row 2
+        vpxor	96(%rax), %ymm6, %ymm10
+        vpxor	-32(%rcx), %ymm7, %ymm11
+        vpxor	-64(%rcx), %ymm8, %ymm12
+        vpxor	-96(%rcx), %ymm9, %ymm13
+        vpxor	128(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rax)
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, -96(%rcx)
+        vmovdqu	%ymm4, 128(%rax)
+        # Row 3
+        vpxor	-64(%rax), %ymm9, %ymm10
+        vpxor	64(%rax), %ymm5, %ymm11
+        vpxor	32(%rax), %ymm6, %ymm12
+        vpxor	(%rax), %ymm7, %ymm13
+        vpxor	-32(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rax)
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 32(%rax)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, -32(%rax)
+        # Row 4
+        vpxor	32(%rdi), %ymm7, %ymm10
+        vpxor	-96(%rax), %ymm8, %ymm11
+        vpxor	128(%rdi), %ymm9, %ymm12
+        vpxor	96(%rdi), %ymm5, %ymm13
+        vpxor	64(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rdi)
+        vmovdqu	%ymm1, -96(%rax)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Round 12
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm4, %ymm14
+        vpxor	-64(%rdi), %ymm3, %ymm13
+        vpxor	-32(%rdi), %ymm2, %ymm12
+        vpxor	(%rdi), %ymm1, %ymm11
+        vpxor	-64(%rax), %ymm10, %ymm10
+        vpxor	-32(%rax), %ymm14, %ymm14
+        vpxor	(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm12, %ymm12
+        vpxor	64(%rax), %ymm11, %ymm11
+        vpxor	96(%rax), %ymm10, %ymm10
+        vpxor	128(%rax), %ymm14, %ymm14
+        vpxor	-96(%rcx), %ymm13, %ymm13
+        vpxor	-64(%rcx), %ymm12, %ymm12
+        vpxor	-32(%rcx), %ymm11, %ymm11
+        vpxor	(%rcx), %ymm10, %ymm10
+        vpxor	32(%rcx), %ymm14, %ymm14
+        vpxor	64(%rcx), %ymm13, %ymm13
+        vpxor	96(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	128(%rcx), %ymm6, %ymm11
+        vpxor	-64(%rcx), %ymm7, %ymm12
+        vpxor	(%rax), %ymm8, %ymm13
+        vpxor	64(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	384(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Row 1
+        vpxor	-64(%rdi), %ymm8, %ymm10
+        vpxor	32(%rcx), %ymm9, %ymm11
+        vpxor	96(%rax), %ymm5, %ymm12
+        vpxor	64(%rax), %ymm6, %ymm13
+        vpxor	128(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rdi)
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, 128(%rdi)
+        # Row 2
+        vpxor	(%rdi), %ymm6, %ymm10
+        vpxor	96(%rcx), %ymm7, %ymm11
+        vpxor	-96(%rcx), %ymm8, %ymm12
+        vpxor	-32(%rax), %ymm9, %ymm13
+        vpxor	32(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, -32(%rax)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Row 3
+        vpxor	-96(%rdi), %ymm9, %ymm10
+        vpxor	(%rcx), %ymm5, %ymm11
+        vpxor	-32(%rcx), %ymm6, %ymm12
+        vpxor	32(%rax), %ymm7, %ymm13
+        vpxor	96(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rdi)
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, -32(%rcx)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Row 4
+        vpxor	-32(%rdi), %ymm7, %ymm10
+        vpxor	64(%rcx), %ymm8, %ymm11
+        vpxor	128(%rax), %ymm9, %ymm12
+        vpxor	-64(%rax), %ymm5, %ymm13
+        vpxor	-96(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rdi)
+        vmovdqu	%ymm1, 64(%rcx)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, -96(%rax)
+        # Round 13
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm10, %ymm10
+        vpxor	-64(%rdi), %ymm10, %ymm10
+        vpxor	(%rdi), %ymm10, %ymm10
+        vpxor	32(%rdi), %ymm4, %ymm14
+        vpxor	64(%rdi), %ymm14, %ymm14
+        vpxor	96(%rdi), %ymm14, %ymm14
+        vpxor	128(%rdi), %ymm14, %ymm14
+        vpxor	-32(%rax), %ymm3, %ymm13
+        vpxor	(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm13, %ymm13
+        vpxor	64(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm2, %ymm12
+        vpxor	-96(%rcx), %ymm12, %ymm12
+        vpxor	-64(%rcx), %ymm12, %ymm12
+        vpxor	-32(%rcx), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm1, %ymm11
+        vpxor	32(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm11, %ymm11
+        vpxor	128(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	32(%rcx), %ymm6, %ymm11
+        vpxor	-96(%rcx), %ymm7, %ymm12
+        vpxor	32(%rax), %ymm8, %ymm13
+        vpxor	-96(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	416(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, -96(%rax)
+        # Row 1
+        vpxor	(%rax), %ymm8, %ymm10
+        vpxor	128(%rdi), %ymm9, %ymm11
+        vpxor	(%rdi), %ymm5, %ymm12
+        vpxor	(%rcx), %ymm6, %ymm13
+        vpxor	128(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rax)
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, 128(%rax)
+        # Row 2
+        vpxor	128(%rcx), %ymm6, %ymm10
+        vpxor	96(%rax), %ymm7, %ymm11
+        vpxor	-32(%rax), %ymm8, %ymm12
+        vpxor	96(%rdi), %ymm9, %ymm13
+        vpxor	-32(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rcx)
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, 96(%rdi)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Row 3
+        vpxor	64(%rdi), %ymm9, %ymm10
+        vpxor	-64(%rdi), %ymm5, %ymm11
+        vpxor	96(%rcx), %ymm6, %ymm12
+        vpxor	-32(%rcx), %ymm7, %ymm13
+        vpxor	-64(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rdi)
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, 96(%rcx)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, -64(%rax)
+        # Row 4
+        vpxor	-64(%rcx), %ymm7, %ymm10
+        vpxor	64(%rax), %ymm8, %ymm11
+        vpxor	32(%rdi), %ymm9, %ymm12
+        vpxor	-96(%rdi), %ymm5, %ymm13
+        vpxor	64(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rcx)
+        vmovdqu	%ymm1, 64(%rax)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Round 14
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm1, %ymm11
+        vpxor	-32(%rdi), %ymm4, %ymm14
+        vpxor	(%rdi), %ymm2, %ymm12
+        vpxor	64(%rdi), %ymm10, %ymm10
+        vpxor	96(%rdi), %ymm3, %ymm13
+        vpxor	128(%rdi), %ymm11, %ymm11
+        vpxor	-96(%rax), %ymm14, %ymm14
+        vpxor	-64(%rax), %ymm14, %ymm14
+        vpxor	-32(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm10, %ymm10
+        vpxor	32(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm11, %ymm11
+        vpxor	128(%rax), %ymm14, %ymm14
+        vpxor	-96(%rcx), %ymm12, %ymm12
+        vpxor	-32(%rcx), %ymm13, %ymm13
+        vpxor	(%rcx), %ymm13, %ymm13
+        vpxor	32(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm10, %ymm10
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	128(%rdi), %ymm6, %ymm11
+        vpxor	-32(%rax), %ymm7, %ymm12
+        vpxor	-32(%rcx), %ymm8, %ymm13
+        vpxor	64(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	448(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Row 1
+        vpxor	32(%rax), %ymm8, %ymm10
+        vpxor	128(%rax), %ymm9, %ymm11
+        vpxor	128(%rcx), %ymm5, %ymm12
+        vpxor	-64(%rdi), %ymm6, %ymm13
+        vpxor	32(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rax)
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, 32(%rdi)
+        # Row 2
+        vpxor	32(%rcx), %ymm6, %ymm10
+        vpxor	(%rdi), %ymm7, %ymm11
+        vpxor	96(%rdi), %ymm8, %ymm12
+        vpxor	-64(%rax), %ymm9, %ymm13
+        vpxor	-64(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rcx)
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, -64(%rax)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Row 3
+        vpxor	-96(%rax), %ymm9, %ymm10
+        vpxor	(%rax), %ymm5, %ymm11
+        vpxor	96(%rax), %ymm6, %ymm12
+        vpxor	96(%rcx), %ymm7, %ymm13
+        vpxor	-96(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rax)
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, 96(%rax)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Row 4
+        vpxor	-96(%rcx), %ymm7, %ymm10
+        vpxor	(%rcx), %ymm8, %ymm11
+        vpxor	-32(%rdi), %ymm9, %ymm12
+        vpxor	64(%rdi), %ymm5, %ymm13
+        vpxor	64(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rcx)
+        vmovdqu	%ymm1, (%rcx)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, 64(%rax)
+        # Round 15
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm4, %ymm14
+        vpxor	-64(%rdi), %ymm3, %ymm13
+        vpxor	(%rdi), %ymm1, %ymm11
+        vpxor	32(%rdi), %ymm14, %ymm14
+        vpxor	96(%rdi), %ymm2, %ymm12
+        vpxor	128(%rdi), %ymm11, %ymm11
+        vpxor	-96(%rax), %ymm10, %ymm10
+        vpxor	-64(%rax), %ymm13, %ymm13
+        vpxor	-32(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm10, %ymm10
+        vpxor	96(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm13, %ymm13
+        vpxor	32(%rcx), %ymm10, %ymm10
+        vpxor	64(%rcx), %ymm14, %ymm14
+        vpxor	96(%rcx), %ymm13, %ymm13
+        vpxor	128(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	128(%rax), %ymm6, %ymm11
+        vpxor	96(%rdi), %ymm7, %ymm12
+        vpxor	96(%rcx), %ymm8, %ymm13
+        vpxor	64(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	480(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, 64(%rax)
+        # Row 1
+        vpxor	-32(%rcx), %ymm8, %ymm10
+        vpxor	32(%rdi), %ymm9, %ymm11
+        vpxor	32(%rcx), %ymm5, %ymm12
+        vpxor	(%rax), %ymm6, %ymm13
+        vpxor	-32(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rcx)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, -32(%rdi)
+        # Row 2
+        vpxor	128(%rdi), %ymm6, %ymm10
+        vpxor	128(%rcx), %ymm7, %ymm11
+        vpxor	-64(%rax), %ymm8, %ymm12
+        vpxor	-96(%rdi), %ymm9, %ymm13
+        vpxor	-96(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, -96(%rdi)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Row 3
+        vpxor	64(%rcx), %ymm9, %ymm10
+        vpxor	32(%rax), %ymm5, %ymm11
+        vpxor	(%rdi), %ymm6, %ymm12
+        vpxor	96(%rax), %ymm7, %ymm13
+        vpxor	64(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rcx)
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, (%rdi)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Row 4
+        vpxor	-32(%rax), %ymm7, %ymm10
+        vpxor	-64(%rdi), %ymm8, %ymm11
+        vpxor	-64(%rcx), %ymm9, %ymm12
+        vpxor	-96(%rax), %ymm5, %ymm13
+        vpxor	(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rax)
+        vmovdqu	%ymm1, -64(%rdi)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, (%rcx)
+        # Round 16
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm3, %ymm13
+        vpxor	-32(%rdi), %ymm4, %ymm14
+        vpxor	(%rdi), %ymm2, %ymm12
+        vpxor	32(%rdi), %ymm1, %ymm11
+        vpxor	64(%rdi), %ymm14, %ymm14
+        vpxor	96(%rdi), %ymm12, %ymm12
+        vpxor	128(%rdi), %ymm10, %ymm10
+        vpxor	-64(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm11, %ymm11
+        vpxor	64(%rax), %ymm14, %ymm14
+        vpxor	96(%rax), %ymm13, %ymm13
+        vpxor	128(%rax), %ymm11, %ymm11
+        vpxor	-96(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm10, %ymm10
+        vpxor	32(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm10, %ymm10
+        vpxor	96(%rcx), %ymm13, %ymm13
+        vpxor	128(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	32(%rdi), %ymm6, %ymm11
+        vpxor	-64(%rax), %ymm7, %ymm12
+        vpxor	96(%rax), %ymm8, %ymm13
+        vpxor	(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	512(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, (%rcx)
+        # Row 1
+        vpxor	96(%rcx), %ymm8, %ymm10
+        vpxor	-32(%rdi), %ymm9, %ymm11
+        vpxor	128(%rdi), %ymm5, %ymm12
+        vpxor	32(%rax), %ymm6, %ymm13
+        vpxor	-64(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rcx)
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, -64(%rcx)
+        # Row 2
+        vpxor	128(%rax), %ymm6, %ymm10
+        vpxor	32(%rcx), %ymm7, %ymm11
+        vpxor	-96(%rdi), %ymm8, %ymm12
+        vpxor	64(%rdi), %ymm9, %ymm13
+        vpxor	-32(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rax)
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, 64(%rdi)
+        vmovdqu	%ymm4, -32(%rax)
+        # Row 3
+        vpxor	64(%rax), %ymm9, %ymm10
+        vpxor	-32(%rcx), %ymm5, %ymm11
+        vpxor	128(%rcx), %ymm6, %ymm12
+        vpxor	(%rdi), %ymm7, %ymm13
+        vpxor	-96(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rax)
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, 128(%rcx)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, -96(%rax)
+        # Row 4
+        vpxor	96(%rdi), %ymm7, %ymm10
+        vpxor	(%rax), %ymm8, %ymm11
+        vpxor	-96(%rcx), %ymm9, %ymm12
+        vpxor	64(%rcx), %ymm5, %ymm13
+        vpxor	-64(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rdi)
+        vmovdqu	%ymm1, (%rax)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Round 17
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm2, %ymm12
+        vpxor	-32(%rdi), %ymm1, %ymm11
+        vpxor	(%rdi), %ymm3, %ymm13
+        vpxor	32(%rdi), %ymm11, %ymm11
+        vpxor	64(%rdi), %ymm13, %ymm13
+        vpxor	128(%rdi), %ymm12, %ymm12
+        vpxor	-96(%rax), %ymm4, %ymm14
+        vpxor	-64(%rax), %ymm12, %ymm12
+        vpxor	-32(%rax), %ymm14, %ymm14
+        vpxor	32(%rax), %ymm13, %ymm13
+        vpxor	64(%rax), %ymm10, %ymm10
+        vpxor	96(%rax), %ymm13, %ymm13
+        vpxor	128(%rax), %ymm10, %ymm10
+        vpxor	-64(%rcx), %ymm14, %ymm14
+        vpxor	-32(%rcx), %ymm11, %ymm11
+        vpxor	(%rcx), %ymm14, %ymm14
+        vpxor	32(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm10, %ymm10
+        vpxor	128(%rcx), %ymm12, %ymm12
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-32(%rdi), %ymm6, %ymm11
+        vpxor	-96(%rdi), %ymm7, %ymm12
+        vpxor	(%rdi), %ymm8, %ymm13
+        vpxor	-64(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	544(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Row 1
+        vpxor	96(%rax), %ymm8, %ymm10
+        vpxor	-64(%rcx), %ymm9, %ymm11
+        vpxor	128(%rax), %ymm5, %ymm12
+        vpxor	-32(%rcx), %ymm6, %ymm13
+        vpxor	-96(%rcx), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rax)
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, -96(%rcx)
+        # Row 2
+        vpxor	32(%rdi), %ymm6, %ymm10
+        vpxor	128(%rdi), %ymm7, %ymm11
+        vpxor	64(%rdi), %ymm8, %ymm12
+        vpxor	-96(%rax), %ymm9, %ymm13
+        vpxor	96(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rdi)
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, -96(%rax)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Row 3
+        vpxor	(%rcx), %ymm9, %ymm10
+        vpxor	96(%rcx), %ymm5, %ymm11
+        vpxor	32(%rcx), %ymm6, %ymm12
+        vpxor	128(%rcx), %ymm7, %ymm13
+        vpxor	64(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rcx)
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, 32(%rcx)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Row 4
+        vpxor	-64(%rax), %ymm7, %ymm10
+        vpxor	32(%rax), %ymm8, %ymm11
+        vpxor	-32(%rax), %ymm9, %ymm12
+        vpxor	64(%rax), %ymm5, %ymm13
+        vpxor	(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rax)
+        vmovdqu	%ymm1, 32(%rax)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, (%rax)
+        # Round 18
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm2, %ymm12
+        vpxor	-64(%rdi), %ymm4, %ymm14
+        vpxor	-32(%rdi), %ymm1, %ymm11
+        vpxor	(%rdi), %ymm3, %ymm13
+        vpxor	32(%rdi), %ymm10, %ymm10
+        vpxor	64(%rdi), %ymm12, %ymm12
+        vpxor	96(%rdi), %ymm14, %ymm14
+        vpxor	128(%rdi), %ymm11, %ymm11
+        vpxor	-96(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm10, %ymm10
+        vpxor	128(%rax), %ymm12, %ymm12
+        vpxor	-96(%rcx), %ymm14, %ymm14
+        vpxor	-64(%rcx), %ymm11, %ymm11
+        vpxor	-32(%rcx), %ymm13, %ymm13
+        vpxor	(%rcx), %ymm10, %ymm10
+        vpxor	32(%rcx), %ymm12, %ymm12
+        vpxor	64(%rcx), %ymm14, %ymm14
+        vpxor	96(%rcx), %ymm11, %ymm11
+        vpxor	128(%rcx), %ymm13, %ymm13
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-64(%rcx), %ymm6, %ymm11
+        vpxor	64(%rdi), %ymm7, %ymm12
+        vpxor	128(%rcx), %ymm8, %ymm13
+        vpxor	(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	576(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, (%rax)
+        # Row 1
+        vpxor	(%rdi), %ymm8, %ymm10
+        vpxor	-96(%rcx), %ymm9, %ymm11
+        vpxor	32(%rdi), %ymm5, %ymm12
+        vpxor	96(%rcx), %ymm6, %ymm13
+        vpxor	-32(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rdi)
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, -32(%rax)
+        # Row 2
+        vpxor	-32(%rdi), %ymm6, %ymm10
+        vpxor	128(%rax), %ymm7, %ymm11
+        vpxor	-96(%rax), %ymm8, %ymm12
+        vpxor	64(%rcx), %ymm9, %ymm13
+        vpxor	-64(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rdi)
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, 64(%rcx)
+        vmovdqu	%ymm4, -64(%rax)
+        # Row 3
+        vpxor	-64(%rdi), %ymm9, %ymm10
+        vpxor	96(%rax), %ymm5, %ymm11
+        vpxor	128(%rdi), %ymm6, %ymm12
+        vpxor	32(%rcx), %ymm7, %ymm13
+        vpxor	64(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rdi)
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, 128(%rdi)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 64(%rax)
+        # Row 4
+        vpxor	-96(%rdi), %ymm7, %ymm10
+        vpxor	-32(%rcx), %ymm8, %ymm11
+        vpxor	96(%rdi), %ymm9, %ymm12
+        vpxor	(%rcx), %ymm5, %ymm13
+        vpxor	32(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rdi)
+        vmovdqu	%ymm1, -32(%rcx)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, 32(%rax)
+        # Round 19
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm10, %ymm10
+        vpxor	-32(%rdi), %ymm10, %ymm10
+        vpxor	(%rdi), %ymm10, %ymm10
+        vpxor	32(%rdi), %ymm2, %ymm12
+        vpxor	64(%rdi), %ymm12, %ymm12
+        vpxor	128(%rdi), %ymm12, %ymm12
+        vpxor	-96(%rax), %ymm12, %ymm12
+        vpxor	-64(%rax), %ymm4, %ymm14
+        vpxor	-32(%rax), %ymm14, %ymm14
+        vpxor	(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm14, %ymm14
+        vpxor	96(%rax), %ymm1, %ymm11
+        vpxor	128(%rax), %ymm11, %ymm11
+        vpxor	-96(%rcx), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm11, %ymm11
+        vpxor	32(%rcx), %ymm3, %ymm13
+        vpxor	64(%rcx), %ymm13, %ymm13
+        vpxor	96(%rcx), %ymm13, %ymm13
+        vpxor	128(%rcx), %ymm13, %ymm13
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-96(%rcx), %ymm6, %ymm11
+        vpxor	-96(%rax), %ymm7, %ymm12
+        vpxor	32(%rcx), %ymm8, %ymm13
+        vpxor	32(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	608(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 32(%rax)
+        # Row 1
+        vpxor	128(%rcx), %ymm8, %ymm10
+        vpxor	-32(%rax), %ymm9, %ymm11
+        vpxor	-32(%rdi), %ymm5, %ymm12
+        vpxor	96(%rax), %ymm6, %ymm13
+        vpxor	96(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rcx)
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, 96(%rax)
+        vmovdqu	%ymm4, 96(%rdi)
+        # Row 2
+        vpxor	-64(%rcx), %ymm6, %ymm10
+        vpxor	32(%rdi), %ymm7, %ymm11
+        vpxor	64(%rcx), %ymm8, %ymm12
+        vpxor	64(%rax), %ymm9, %ymm13
+        vpxor	-96(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rcx)
+        vmovdqu	%ymm1, 32(%rdi)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, 64(%rax)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Row 3
+        vpxor	(%rax), %ymm9, %ymm10
+        vpxor	(%rdi), %ymm5, %ymm11
+        vpxor	128(%rax), %ymm6, %ymm12
+        vpxor	128(%rdi), %ymm7, %ymm13
+        vpxor	(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rax)
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, 128(%rax)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, (%rcx)
+        # Row 4
+        vpxor	64(%rdi), %ymm7, %ymm10
+        vpxor	96(%rcx), %ymm8, %ymm11
+        vpxor	-64(%rax), %ymm9, %ymm12
+        vpxor	-64(%rdi), %ymm5, %ymm13
+        vpxor	-32(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rdi)
+        vmovdqu	%ymm1, 96(%rcx)
+        vmovdqu	%ymm2, -64(%rax)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Round 20
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm4, %ymm14
+        vpxor	-32(%rdi), %ymm2, %ymm12
+        vpxor	(%rdi), %ymm1, %ymm11
+        vpxor	32(%rdi), %ymm11, %ymm11
+        vpxor	96(%rdi), %ymm14, %ymm14
+        vpxor	128(%rdi), %ymm3, %ymm13
+        vpxor	-96(%rax), %ymm12, %ymm12
+        vpxor	-32(%rax), %ymm11, %ymm11
+        vpxor	(%rax), %ymm10, %ymm10
+        vpxor	32(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm13, %ymm13
+        vpxor	96(%rax), %ymm13, %ymm13
+        vpxor	128(%rax), %ymm12, %ymm12
+        vpxor	-96(%rcx), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm10, %ymm10
+        vpxor	(%rcx), %ymm14, %ymm14
+        vpxor	32(%rcx), %ymm13, %ymm13
+        vpxor	64(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm10, %ymm10
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-32(%rax), %ymm6, %ymm11
+        vpxor	64(%rcx), %ymm7, %ymm12
+        vpxor	128(%rdi), %ymm8, %ymm13
+        vpxor	-32(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	640(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Row 1
+        vpxor	32(%rcx), %ymm8, %ymm10
+        vpxor	96(%rdi), %ymm9, %ymm11
+        vpxor	-64(%rcx), %ymm5, %ymm12
+        vpxor	(%rdi), %ymm6, %ymm13
+        vpxor	-64(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rcx)
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, (%rdi)
+        vmovdqu	%ymm4, -64(%rax)
+        # Row 2
+        vpxor	-96(%rcx), %ymm6, %ymm10
+        vpxor	-32(%rdi), %ymm7, %ymm11
+        vpxor	64(%rax), %ymm8, %ymm12
+        vpxor	(%rcx), %ymm9, %ymm13
+        vpxor	64(%rdi), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rcx)
+        vmovdqu	%ymm1, -32(%rdi)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, (%rcx)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Row 3
+        vpxor	32(%rax), %ymm9, %ymm10
+        vpxor	128(%rcx), %ymm5, %ymm11
+        vpxor	32(%rdi), %ymm6, %ymm12
+        vpxor	128(%rax), %ymm7, %ymm13
+        vpxor	-64(%rdi), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rax)
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, 32(%rdi)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, -64(%rdi)
+        # Row 4
+        vpxor	-96(%rax), %ymm7, %ymm10
+        vpxor	96(%rax), %ymm8, %ymm11
+        vpxor	-96(%rdi), %ymm9, %ymm12
+        vpxor	(%rax), %ymm5, %ymm13
+        vpxor	96(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -96(%rax)
+        vmovdqu	%ymm1, 96(%rax)
+        vmovdqu	%ymm2, -96(%rdi)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Round 21
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-64(%rdi), %ymm4, %ymm14
+        vpxor	-32(%rdi), %ymm1, %ymm11
+        vpxor	(%rdi), %ymm3, %ymm13
+        vpxor	32(%rdi), %ymm2, %ymm12
+        vpxor	64(%rdi), %ymm14, %ymm14
+        vpxor	96(%rdi), %ymm11, %ymm11
+        vpxor	128(%rdi), %ymm13, %ymm13
+        vpxor	-64(%rax), %ymm14, %ymm14
+        vpxor	-32(%rax), %ymm11, %ymm11
+        vpxor	32(%rax), %ymm10, %ymm10
+        vpxor	64(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm13, %ymm13
+        vpxor	-96(%rcx), %ymm10, %ymm10
+        vpxor	-64(%rcx), %ymm12, %ymm12
+        vpxor	-32(%rcx), %ymm14, %ymm14
+        vpxor	(%rcx), %ymm13, %ymm13
+        vpxor	32(%rcx), %ymm10, %ymm10
+        vpxor	64(%rcx), %ymm12, %ymm12
+        vpxor	128(%rcx), %ymm11, %ymm11
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	96(%rdi), %ymm6, %ymm11
+        vpxor	64(%rax), %ymm7, %ymm12
+        vpxor	128(%rax), %ymm8, %ymm13
+        vpxor	96(%rcx), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	672(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, 96(%rdi)
+        vmovdqu	%ymm2, 64(%rax)
+        vmovdqu	%ymm3, 128(%rax)
+        vmovdqu	%ymm4, 96(%rcx)
+        # Row 1
+        vpxor	128(%rdi), %ymm8, %ymm10
+        vpxor	-64(%rax), %ymm9, %ymm11
+        vpxor	-96(%rcx), %ymm5, %ymm12
+        vpxor	128(%rcx), %ymm6, %ymm13
+        vpxor	-96(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rdi)
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, 128(%rcx)
+        vmovdqu	%ymm4, -96(%rdi)
+        # Row 2
+        vpxor	-32(%rax), %ymm6, %ymm10
+        vpxor	-64(%rcx), %ymm7, %ymm11
+        vpxor	(%rcx), %ymm8, %ymm12
+        vpxor	-64(%rdi), %ymm9, %ymm13
+        vpxor	-96(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rax)
+        vmovdqu	%ymm1, -64(%rcx)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, -64(%rdi)
+        vmovdqu	%ymm4, -96(%rax)
+        # Row 3
+        vpxor	-32(%rcx), %ymm9, %ymm10
+        vpxor	32(%rcx), %ymm5, %ymm11
+        vpxor	-32(%rdi), %ymm6, %ymm12
+        vpxor	32(%rdi), %ymm7, %ymm13
+        vpxor	(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -32(%rcx)
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, -32(%rdi)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, (%rax)
+        # Row 4
+        vpxor	64(%rcx), %ymm7, %ymm10
+        vpxor	(%rdi), %ymm8, %ymm11
+        vpxor	64(%rdi), %ymm9, %ymm12
+        vpxor	32(%rax), %ymm5, %ymm13
+        vpxor	96(%rax), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rcx)
+        vmovdqu	%ymm1, (%rdi)
+        vmovdqu	%ymm2, 64(%rdi)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, 96(%rax)
+        # Round 22
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm4, %ymm14
+        vpxor	-64(%rdi), %ymm3, %ymm13
+        vpxor	-32(%rdi), %ymm2, %ymm12
+        vpxor	32(%rdi), %ymm13, %ymm13
+        vpxor	96(%rdi), %ymm1, %ymm11
+        vpxor	128(%rdi), %ymm10, %ymm10
+        vpxor	-96(%rax), %ymm14, %ymm14
+        vpxor	-64(%rax), %ymm11, %ymm11
+        vpxor	-32(%rax), %ymm10, %ymm10
+        vpxor	(%rax), %ymm14, %ymm14
+        vpxor	64(%rax), %ymm12, %ymm12
+        vpxor	128(%rax), %ymm13, %ymm13
+        vpxor	-96(%rcx), %ymm12, %ymm12
+        vpxor	-64(%rcx), %ymm11, %ymm11
+        vpxor	-32(%rcx), %ymm10, %ymm10
+        vpxor	(%rcx), %ymm12, %ymm12
+        vpxor	32(%rcx), %ymm11, %ymm11
+        vpxor	96(%rcx), %ymm14, %ymm14
+        vpxor	128(%rcx), %ymm13, %ymm13
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-64(%rax), %ymm6, %ymm11
+        vpxor	(%rcx), %ymm7, %ymm12
+        vpxor	32(%rdi), %ymm8, %ymm13
+        vpxor	96(%rax), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	704(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -64(%rax)
+        vmovdqu	%ymm2, (%rcx)
+        vmovdqu	%ymm3, 32(%rdi)
+        vmovdqu	%ymm4, 96(%rax)
+        # Row 1
+        vpxor	128(%rax), %ymm8, %ymm10
+        vpxor	-96(%rdi), %ymm9, %ymm11
+        vpxor	-32(%rax), %ymm5, %ymm12
+        vpxor	32(%rcx), %ymm6, %ymm13
+        vpxor	64(%rdi), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 128(%rax)
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, -32(%rax)
+        vmovdqu	%ymm3, 32(%rcx)
+        vmovdqu	%ymm4, 64(%rdi)
+        # Row 2
+        vpxor	96(%rdi), %ymm6, %ymm10
+        vpxor	-96(%rcx), %ymm7, %ymm11
+        vpxor	-64(%rdi), %ymm8, %ymm12
+        vpxor	(%rax), %ymm9, %ymm13
+        vpxor	64(%rcx), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rdi)
+        vmovdqu	%ymm1, -96(%rcx)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, (%rax)
+        vmovdqu	%ymm4, 64(%rcx)
+        # Row 3
+        vpxor	96(%rcx), %ymm9, %ymm10
+        vpxor	128(%rdi), %ymm5, %ymm11
+        vpxor	-64(%rcx), %ymm6, %ymm12
+        vpxor	-32(%rdi), %ymm7, %ymm13
+        vpxor	32(%rax), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rcx)
+        vmovdqu	%ymm1, 128(%rdi)
+        vmovdqu	%ymm2, -64(%rcx)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, 32(%rax)
+        # Row 4
+        vpxor	64(%rax), %ymm7, %ymm10
+        vpxor	128(%rcx), %ymm8, %ymm11
+        vpxor	-96(%rax), %ymm9, %ymm12
+        vpxor	-32(%rcx), %ymm5, %ymm13
+        vpxor	(%rdi), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 64(%rax)
+        vmovdqu	%ymm1, 128(%rcx)
+        vmovdqu	%ymm2, -96(%rax)
+        vmovdqu	%ymm3, -32(%rcx)
+        vmovdqu	%ymm4, (%rdi)
+        # Round 23
+        # Calc b[0..4]
+        vpxor	%ymm15, %ymm0, %ymm10
+        vpxor	-96(%rdi), %ymm1, %ymm11
+        vpxor	-64(%rdi), %ymm2, %ymm12
+        vpxor	-32(%rdi), %ymm3, %ymm13
+        vpxor	32(%rdi), %ymm13, %ymm13
+        vpxor	64(%rdi), %ymm4, %ymm14
+        vpxor	96(%rdi), %ymm10, %ymm10
+        vpxor	128(%rdi), %ymm11, %ymm11
+        vpxor	-64(%rax), %ymm11, %ymm11
+        vpxor	-32(%rax), %ymm12, %ymm12
+        vpxor	(%rax), %ymm13, %ymm13
+        vpxor	32(%rax), %ymm14, %ymm14
+        vpxor	96(%rax), %ymm14, %ymm14
+        vpxor	128(%rax), %ymm10, %ymm10
+        vpxor	-96(%rcx), %ymm11, %ymm11
+        vpxor	-64(%rcx), %ymm12, %ymm12
+        vpxor	(%rcx), %ymm12, %ymm12
+        vpxor	32(%rcx), %ymm13, %ymm13
+        vpxor	64(%rcx), %ymm14, %ymm14
+        vpxor	96(%rcx), %ymm10, %ymm10
+        # Calc t[0..4]
+        vpsrlq	$63, %ymm11, %ymm0
+        vpsrlq	$63, %ymm12, %ymm1
+        vpsrlq	$63, %ymm13, %ymm2
+        vpsrlq	$63, %ymm14, %ymm3
+        vpsrlq	$63, %ymm10, %ymm4
+        vpaddq	%ymm11, %ymm11, %ymm5
+        vpaddq	%ymm12, %ymm12, %ymm6
+        vpaddq	%ymm13, %ymm13, %ymm7
+        vpaddq	%ymm14, %ymm14, %ymm8
+        vpaddq	%ymm10, %ymm10, %ymm9
+        vpor	%ymm0, %ymm5, %ymm5
+        vpor	%ymm1, %ymm6, %ymm6
+        vpor	%ymm2, %ymm7, %ymm7
+        vpor	%ymm3, %ymm8, %ymm8
+        vpor	%ymm4, %ymm9, %ymm9
+        vpxor	%ymm14, %ymm5, %ymm5
+        vpxor	%ymm10, %ymm6, %ymm6
+        vpxor	%ymm11, %ymm7, %ymm7
+        vpxor	%ymm12, %ymm8, %ymm8
+        vpxor	%ymm13, %ymm9, %ymm9
+        # Row Mix
+        # Row 0
+        vpxor	%ymm15, %ymm5, %ymm10
+        vpxor	-96(%rdi), %ymm6, %ymm11
+        vpxor	-64(%rdi), %ymm7, %ymm12
+        vpxor	-32(%rdi), %ymm8, %ymm13
+        vpxor	(%rdi), %ymm9, %ymm14
+        vpsrlq	$20, %ymm11, %ymm0
+        vpsrlq	$21, %ymm12, %ymm1
+        vpsrlq	$43, %ymm13, %ymm2
+        vpsrlq	$50, %ymm14, %ymm3
+        vpsllq	$44, %ymm11, %ymm11
+        vpsllq	$43, %ymm12, %ymm12
+        vpsllq	$21, %ymm13, %ymm13
+        vpsllq	$14, %ymm14, %ymm14
+        vpor	%ymm0, %ymm11, %ymm11
+        vpor	%ymm1, %ymm12, %ymm12
+        vpor	%ymm2, %ymm13, %ymm13
+        vpor	%ymm3, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm15
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm15, %ymm15
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        # XOR in constant
+        vpxor	736(%rdx), %ymm15, %ymm15
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm1, -96(%rdi)
+        vmovdqu	%ymm2, -64(%rdi)
+        vmovdqu	%ymm3, -32(%rdi)
+        vmovdqu	%ymm4, (%rdi)
+        # Row 1
+        vpxor	32(%rdi), %ymm8, %ymm10
+        vpxor	64(%rdi), %ymm9, %ymm11
+        vpxor	96(%rdi), %ymm5, %ymm12
+        vpxor	128(%rdi), %ymm6, %ymm13
+        vpxor	-96(%rax), %ymm7, %ymm14
+        vpsrlq	$36, %ymm10, %ymm0
+        vpsrlq	$44, %ymm11, %ymm1
+        vpsrlq	$61, %ymm12, %ymm2
+        vpsrlq	$19, %ymm13, %ymm3
+        vpsrlq	$3, %ymm14, %ymm4
+        vpsllq	$28, %ymm10, %ymm10
+        vpsllq	$20, %ymm11, %ymm11
+        vpsllq	$3, %ymm12, %ymm12
+        vpsllq	$45, %ymm13, %ymm13
+        vpsllq	$61, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 32(%rdi)
+        vmovdqu	%ymm1, 64(%rdi)
+        vmovdqu	%ymm2, 96(%rdi)
+        vmovdqu	%ymm3, 128(%rdi)
+        vmovdqu	%ymm4, -96(%rax)
+        # Row 2
+        vpxor	-64(%rax), %ymm6, %ymm10
+        vpxor	-32(%rax), %ymm7, %ymm11
+        vpxor	(%rax), %ymm8, %ymm12
+        vpxor	32(%rax), %ymm9, %ymm13
+        vpxor	64(%rax), %ymm5, %ymm14
+        vpsrlq	$63, %ymm10, %ymm0
+        vpsrlq	$58, %ymm11, %ymm1
+        vpsrlq	$39, %ymm12, %ymm2
+        vpsrlq	$56, %ymm13, %ymm3
+        vpsrlq	$46, %ymm14, %ymm4
+        vpaddq	%ymm10, %ymm10, %ymm10
+        vpsllq	$6, %ymm11, %ymm11
+        vpsllq	$25, %ymm12, %ymm12
+        vpsllq	$8, %ymm13, %ymm13
+        vpsllq	$18, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, -64(%rax)
+        vmovdqu	%ymm1, -32(%rax)
+        vmovdqu	%ymm2, (%rax)
+        vmovdqu	%ymm3, 32(%rax)
+        vmovdqu	%ymm4, 64(%rax)
+        # Row 3
+        vpxor	96(%rax), %ymm9, %ymm10
+        vpxor	128(%rax), %ymm5, %ymm11
+        vpxor	-96(%rcx), %ymm6, %ymm12
+        vpxor	-64(%rcx), %ymm7, %ymm13
+        vpxor	-32(%rcx), %ymm8, %ymm14
+        vpsrlq	$37, %ymm10, %ymm0
+        vpsrlq	$28, %ymm11, %ymm1
+        vpsrlq	$54, %ymm12, %ymm2
+        vpsrlq	$49, %ymm13, %ymm3
+        vpsrlq	$8, %ymm14, %ymm4
+        vpsllq	$27, %ymm10, %ymm10
+        vpsllq	$36, %ymm11, %ymm11
+        vpsllq	$10, %ymm12, %ymm12
+        vpsllq	$15, %ymm13, %ymm13
+        vpsllq	$56, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, 96(%rax)
+        vmovdqu	%ymm1, 128(%rax)
+        vmovdqu	%ymm2, -96(%rcx)
+        vmovdqu	%ymm3, -64(%rcx)
+        vmovdqu	%ymm4, -32(%rcx)
+        # Row 4
+        vpxor	(%rcx), %ymm7, %ymm10
+        vpxor	32(%rcx), %ymm8, %ymm11
+        vpxor	64(%rcx), %ymm9, %ymm12
+        vpxor	96(%rcx), %ymm5, %ymm13
+        vpxor	128(%rcx), %ymm6, %ymm14
+        vpsrlq	$2, %ymm10, %ymm0
+        vpsrlq	$9, %ymm11, %ymm1
+        vpsrlq	$25, %ymm12, %ymm2
+        vpsrlq	$23, %ymm13, %ymm3
+        vpsrlq	$62, %ymm14, %ymm4
+        vpsllq	$62, %ymm10, %ymm10
+        vpsllq	$55, %ymm11, %ymm11
+        vpsllq	$39, %ymm12, %ymm12
+        vpsllq	$41, %ymm13, %ymm13
+        vpsllq	$2, %ymm14, %ymm14
+        vpor	%ymm0, %ymm10, %ymm10
+        vpor	%ymm1, %ymm11, %ymm11
+        vpor	%ymm2, %ymm12, %ymm12
+        vpor	%ymm3, %ymm13, %ymm13
+        vpor	%ymm4, %ymm14, %ymm14
+        vpandn	%ymm12, %ymm11, %ymm0
+        vpandn	%ymm13, %ymm12, %ymm1
+        vpandn	%ymm14, %ymm13, %ymm2
+        vpandn	%ymm10, %ymm14, %ymm3
+        vpandn	%ymm11, %ymm10, %ymm4
+        vpxor	%ymm10, %ymm0, %ymm0
+        vpxor	%ymm11, %ymm1, %ymm1
+        vpxor	%ymm12, %ymm2, %ymm2
+        vpxor	%ymm13, %ymm3, %ymm3
+        vpxor	%ymm14, %ymm4, %ymm4
+        vmovdqu	%ymm0, (%rcx)
+        vmovdqu	%ymm1, 32(%rcx)
+        vmovdqu	%ymm2, 64(%rcx)
+        vmovdqu	%ymm3, 96(%rcx)
+        vmovdqu	%ymm4, 128(%rcx)
+        subq	$0x80, %rdi
+        vmovdqu	%ymm15, (%rdi)
+        vzeroupper
+        repz retq
+#ifndef __APPLE__
+.size	kyber_sha3_256_blocksx4_seed_avx2,.-kyber_sha3_256_blocksx4_seed_avx2
+#endif /* __APPLE__ */
+#endif /* HAVE_INTEL_AVX2 */
+#endif /* WOLFSSL_WC_KYBER */
 
+#if defined(__linux__) && defined(__ELF__)
+.section	.note.GNU-stack,"",%progbits
+#endif

+ 3017 - 4
wolfcrypt/src/wc_kyber_poly.c

@@ -1,6 +1,6 @@
 /* wc_kyber_poly.c
  *
- * Copyright (C) 2006-2023 wolfSSL Inc.
+ * Copyright (C) 2006-2024 wolfSSL Inc.
  *
  * This file is part of wolfSSL.
  *
@@ -19,8 +19,3021 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  */
 
-#include <wolfssl/wolfcrypt/settings.h>
+/* Implementation based on NIST 3rd Round submission package.
+ * See link at:
+ *   https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization/round-3-submissions
+ */
+
+/* Implementation of the functions that operate on polynomials or vectors of
+ * polynomials.
+ */
+
+#include <wolfssl/wolfcrypt/wc_kyber.h>
+#include <wolfssl/wolfcrypt/cpuid.h>
+#include <wolfssl/wolfcrypt/error-crypt.h>
+
+#ifdef WOLFSSL_WC_KYBER
+
+#ifdef USE_INTEL_SPEEDUP
+static word32 cpuid_flags = 0;
+#endif
+
+/* Half of Q plus one. Converted message bit value of 1. */
+#define KYBER_Q_1_HALF      ((KYBER_Q + 1) / 2)
+/* Half of Q */
+#define KYBER_Q_HALF        (KYBER_Q / 2)
+
+
+/* q^-1 mod 2^16 (inverse of 3329 mod 16384) */
+#define KYBER_QINV       62209
+
+/* Used in Barrett Reduction:
+ *    r = a mod q
+ * => r = a - ((V * a) >> 26) * q), as V based on 2^26
+ * V is the mulitplier that gets the quotient after shifting.
+ */
+#define KYBER_V          (((1U << 26) + (KYBER_Q / 2)) / KYBER_Q)
+
+/* Used in converting to Montgomery form.
+ * f is the normalizer = 2^k % m.
+ * 16-bit value cast to sword32 in use.
+ */
+#define KYBER_F          ((1ULL << 32) % KYBER_Q)
+
+/* Number of bytes in an output block of SHA-3-128 */
+#define SHA3_128_BYTES   (WC_SHA3_128_COUNT * 8)
+/* Number of bytes in an output block of SHA-3-256 */
+#define SHA3_256_BYTES   (WC_SHA3_256_COUNT * 8)
+
+/* Number of blocks to generate for matrix. */
+#define GEN_MATRIX_NBLOCKS \
+    ((12 * KYBER_N / 8 * (1 << 12) / KYBER_Q + XOF_BLOCK_SIZE) / XOF_BLOCK_SIZE)
+/* Number of bytes to generate for matrix. */
+#define GEN_MATRIX_SIZE     GEN_MATRIX_NBLOCKS * XOF_BLOCK_SIZE
+
+
+/* Number of random bytes to generate for ETA3. */
+#define ETA3_RAND_SIZE     ((3 * KYBER_N) / 4)
+/* Number of random bytes to generate for ETA2. */
+#define ETA2_RAND_SIZE     ((2 * KYBER_N) / 4)
+
+
+/* Montgomery reduce a.
+ *
+ * @param  [in]  a  32-bit value to be reduced.
+ * @return  Montgomery reduction result.
+ */
+#define KYBER_MONT_RED(a) \
+    (sword16)(((a) - (sword32)(((sword16)((sword16)(a) * \
+                                (sword16)KYBER_QINV)) * \
+                               (sword32)KYBER_Q)) >> 16)
+
+/* Barrett reduce a. r = a mod q.
+ *
+ * Converted division to multiplication.
+ *
+ * @param  [in]  a  16-bit value to be reduced to range of q.
+ * @return  Modulo result.
+ */
+#define KYBER_BARRETT_RED(a) \
+    (sword16)((sword16)(a) - (sword16)((sword16)( \
+        ((sword32)((sword32)KYBER_V * (sword16)(a))) >> 26) * (word16)KYBER_Q))
+
+
+/* Zetas for NTT. */
+const sword16 zetas[KYBER_N / 2] = {
+    2285, 2571, 2970, 1812, 1493, 1422,  287,  202, 3158,  622, 1577,  182,
+     962, 2127, 1855, 1468,  573, 2004,  264,  383, 2500, 1458, 1727, 3199,
+    2648, 1017,  732,  608, 1787,  411, 3124, 1758, 1223,  652, 2777, 1015,
+    2036, 1491, 3047, 1785,  516, 3321, 3009, 2663, 1711, 2167,  126, 1469,
+    2476, 3239, 3058,  830,  107, 1908, 3082, 2378, 2931,  961, 1821, 2604,
+     448, 2264,  677, 2054, 2226,  430,  555,  843, 2078,  871, 1550,  105,
+     422,  587,  177, 3094, 3038, 2869, 1574, 1653, 3083,  778, 1159, 3182,
+    2552, 1483, 2727, 1119, 1739,  644, 2457,  349,  418,  329, 3173, 3254,
+     817, 1097,  603,  610, 1322, 2044, 1864,  384, 2114, 3193, 1218, 1994,
+    2455,  220, 2142, 1670, 2144, 1799, 2051,  794, 1819, 2475, 2459,  478,
+     3221, 3021,  996,  991,  958, 1869, 1522, 1628
+};
+
+/* Zetas for inverse NTT. */
+const sword16 zetas_inv[KYBER_N / 2] = {
+    1701, 1807, 1460, 2371, 2338, 2333,  308,  108, 2851,  870,  854, 1510,
+    2535, 1278, 1530, 1185, 1659, 1187, 3109,  874, 1335, 2111,  136, 1215,
+    2945, 1465, 1285, 2007, 2719, 2726, 2232, 2512,   75,  156, 3000, 2911,
+    2980,  872, 2685, 1590, 2210,  602, 1846,  777,  147, 2170, 2551,  246,
+    1676, 1755,  460,  291,  235, 3152, 2742, 2907, 3224, 1779, 2458, 1251,
+    2486, 2774, 2899, 1103, 1275, 2652, 1065, 2881,  725, 1508, 2368,  398,
+     951,  247, 1421, 3222, 2499,  271,   90,  853, 1860, 3203, 1162, 1618,
+     666,  320,    8, 2813, 1544,  282, 1838, 1293, 2314,  552, 2677, 2106,
+    1571,  205, 2918, 1542, 2721, 2597, 2312,  681,  130, 1602, 1871,  829,
+    2946, 3065, 1325, 2756, 1861, 1474, 1202, 2367, 3147, 1752, 2707,  171,
+    3127, 3042, 1907, 1836, 1517,  359,  758, 1441
+};
+
+
+/* Number-Theoretic Transform.
+ *
+ * @param  [in, out]  r  Polynomial to transform.
+ */
+static void kyber_ntt(sword16* r)
+{
+#ifdef WOLFSSL_KYBER_SMALL
+    unsigned int len;
+    unsigned int k;
+    unsigned int j;
+
+    k = 1;
+    for (len = KYBER_N / 2; len >= 2; len >>= 1) {
+        unsigned int start;
+        for (start = 0; start < KYBER_N; start = j + len) {
+            sword16 zeta = zetas[k++];
+            for (j = start; j < start + len; ++j) {
+                sword32 p = (sword32)zeta * r[j + len];
+                sword16 t = KYBER_MONT_RED(p);
+                sword16 rj = r[j];
+                r[j + len] = rj - t;
+                r[j] = rj + t;
+            }
+        }
+    }
+
+    /* Reduce coefficients with quick algorithm. */
+    for (j = 0; j < KYBER_N; ++j) {
+        r[j] = KYBER_BARRETT_RED(r[j]);
+    }
+#else
+    unsigned int len;
+    unsigned int k = 1;
+    unsigned int j;
+    unsigned int start;
+    sword16 zeta = zetas[k++];
+
+    for (j = 0; j < KYBER_N / 2; ++j) {
+        sword32 p = (sword32)zeta * r[j + KYBER_N / 2];
+        sword16 t = KYBER_MONT_RED(p);
+        sword16 rj = r[j];
+        r[j + KYBER_N / 2] = rj - t;
+        r[j] = rj + t;
+    }
+    for (len = KYBER_N / 4; len >= 2; len >>= 1) {
+        for (start = 0; start < KYBER_N; start = j + len) {
+            zeta = zetas[k++];
+            for (j = start; j < start + len; ++j) {
+                sword32 p = (sword32)zeta * r[j + len];
+                sword16 t = KYBER_MONT_RED(p);
+                sword16 rj = r[j];
+                r[j + len] = rj - t;
+                r[j] = rj + t;
+            }
+        }
+    }
+
+    /* Reduce coefficients with quick algorithm. */
+    for (j = 0; j < KYBER_N; ++j) {
+        r[j] = KYBER_BARRETT_RED(r[j]);
+    }
+#endif
+}
+
+/* Inverse Number-Theoretic Transform.
+ *
+ * @param  [in, out]  r  Polynomial to transform.
+ */
+static void kyber_invntt(sword16* r)
+{
+#ifdef WOLFSSL_KYBER_SMALL
+    unsigned int len;
+    unsigned int k;
+    unsigned int j;
+    sword16 zeta;
+
+    k = 0;
+    for (len = 2; len <= KYBER_N / 2; len <<= 1) {
+        unsigned int start;
+        for (start = 0; start < KYBER_N; start = j + len) {
+            zeta = zetas_inv[k++];
+            for (j = start; j < start + len; ++j) {
+                sword32 p;
+                sword16 rj = r[j];
+                sword16 rjl = r[j + len];
+                sword16 t = rj + rjl;
+                r[j] = KYBER_BARRETT_RED(t);
+                rjl = rj - rjl;
+                p = (sword32)zeta * rjl;
+                r[j + len] = KYBER_MONT_RED(p);
+            }
+        }
+    }
+
+    zeta = zetas_inv[127];
+    for (j = 0; j < KYBER_N; ++j) {
+        sword32 p = (sword32)zeta * r[j];
+        r[j] = KYBER_MONT_RED(p);
+    }
+#else
+    unsigned int k;
+    unsigned int j;
+    unsigned int start;
+    sword16 zeta;
+    sword16 zeta2;
+
+    k = 0;
+    for (start = 0; start < KYBER_N; start += 2 * 2) {
+        zeta = zetas_inv[k++];
+        for (j = 0; j < 2; ++j) {
+            sword32 p;
+            sword16 rj = r[start + j];
+            sword16 rjl = r[start + j + 2];
+            sword16 t = rj + rjl;
+            r[start + j] = t;
+            rjl = rj - rjl;
+            p = (sword32)zeta * rjl;
+            r[start + j + 2] = KYBER_MONT_RED(p);
+        }
+    }
+    for (start = 0; start < KYBER_N; start += 2 * 4) {
+        zeta = zetas_inv[k++];
+        for (j = 0; j < 4; ++j) {
+            sword32 p;
+            sword16 rj = r[start + j];
+            sword16 rjl = r[start + j + 4];
+            sword16 t = rj + rjl;
+            r[start + j] = t;
+            rjl = rj - rjl;
+            p = (sword32)zeta * rjl;
+            r[start + j + 4] = KYBER_MONT_RED(p);
+        }
+    }
+    for (start = 0; start < KYBER_N; start += 2 * 8) {
+        zeta = zetas_inv[k++];
+        for (j = 0; j < 8; ++j) {
+            sword32 p;
+            sword16 rj = r[start + j];
+            sword16 rjl = r[start + j + 8];
+            sword16 t = rj + rjl;
+            /* Reduce. */
+            r[start + j] = KYBER_BARRETT_RED(t);
+            rjl = rj - rjl;
+            p = (sword32)zeta * rjl;
+            r[start + j + 8] = KYBER_MONT_RED(p);
+        }
+    }
+    for (start = 0; start < KYBER_N; start += 2 * 16) {
+        zeta = zetas_inv[k++];
+        for (j = 0; j < 16; ++j) {
+            sword32 p;
+            sword16 rj = r[start + j];
+            sword16 rjl = r[start + j + 16];
+            sword16 t = rj + rjl;
+            r[start + j] = t;
+            rjl = rj - rjl;
+            p = (sword32)zeta * rjl;
+            r[start + j + 16] = KYBER_MONT_RED(p);
+        }
+    }
+    for (start = 0; start < KYBER_N; start += 2 * 32) {
+        zeta = zetas_inv[k++];
+        for (j = 0; j < 32; ++j) {
+            sword32 p;
+            sword16 rj = r[start + j];
+            sword16 rjl = r[start + j + 32];
+            sword16 t = rj + rjl;
+            r[start + j] = t;
+            rjl = rj - rjl;
+            p = (sword32)zeta * rjl;
+            r[start + j + 32] = KYBER_MONT_RED(p);
+        }
+    }
+    for (start = 0; start < KYBER_N; start += 2 * 64) {
+        zeta = zetas_inv[k++];
+        for (j = 0; j < 64; ++j) {
+            sword32 p;
+            sword16 rj = r[start + j];
+            sword16 rjl = r[start + j + 64];
+            sword16 t = rj + rjl;
+            /* Reduce. */
+            r[start + j] = KYBER_BARRETT_RED(t);
+            rjl = rj - rjl;
+            p = (sword32)zeta * rjl;
+            r[start + j + 64] = KYBER_MONT_RED(p);
+        }
+    }
+    zeta = zetas_inv[126];
+    zeta2 = zetas_inv[127];
+    for (j = 0; j < KYBER_N / 2; ++j) {
+        sword32 p;
+        sword16 rj = r[j];
+        sword16 rjl = r[j + KYBER_N / 2];
+        sword16 t = rj + rjl;
+        rjl = rj - rjl;
+        p = (sword32)zeta * rjl;
+        r[j] = t;
+        r[j + KYBER_N / 2] = KYBER_MONT_RED(p);
+
+        p = (sword32)zeta2 * r[j];
+        r[j] = KYBER_MONT_RED(p);
+        p = (sword32)zeta2 * r[j + KYBER_N / 2];
+        r[j + KYBER_N / 2] = KYBER_MONT_RED(p);
+    }
+#endif
+}
+
+/* Multiplication of polynomials in Zq[X]/(X^2-zeta).
+ *
+ * Used for multiplication of elements in Rq in NTT domain.
+ *
+ * @param  [out]  r     Result polynomial.
+ * @param  [in]   a     First factor.
+ * @param  [in]   b     Second factor.
+ * @param  [in]   zeta  Integer defining the reduction polynomial.
+ */
+static void kyber_basemul(sword16* r, const sword16* a, const sword16* b,
+    sword16 zeta)
+{
+    sword16 r0;
+    sword16 a0 = a[0];
+    sword16 a1 = a[1];
+    sword16 b0 = b[0];
+    sword16 b1 = b[1];
+    sword32 p1;
+    sword32 p2;
+
+    p1   = (sword32)a1 * b1;
+    p2   = (sword32)a0 * b0;
+    r0   = KYBER_MONT_RED(p1);
+    p1   = (sword32)zeta * r0;
+    p1  += p2;
+    r[0] = KYBER_MONT_RED(p1);
+
+    p1   = (sword32)a0 * b1;
+    p2   = (sword32)a1 * b0;
+    p1  += p2;
+    r[1] = KYBER_MONT_RED(p1);
+}
+
+/* Multiply two polynomials in NTT domain. r = a * b.
+ *
+ * @param  [out]  r  Result polynomial.
+ * @param  [in]   a  First polynomial multiplier.
+ * @param  [in]   b  Second polynomial multiplier.
+ */
+static void kyber_basemul_mont(sword16* r, const sword16* a, const sword16* b)
+{
+    unsigned int i;
+    const sword16* zeta = zetas + 64;
+
+#ifdef WOLFSSL_KYBER_SMALL
+    for (i = 0; i < KYBER_N; i += 4, zeta++) {
+        kyber_basemul(r + i + 0, a + i + 0, b + i + 0,  zeta[0]);
+        kyber_basemul(r + i + 2, a + i + 2, b + i + 2, -zeta[0]);
+    }
+#else
+    for (i = 0; i < KYBER_N; i += 8, zeta += 2) {
+        kyber_basemul(r + i + 0, a + i + 0, b + i + 0,  zeta[0]);
+        kyber_basemul(r + i + 2, a + i + 2, b + i + 2, -zeta[0]);
+        kyber_basemul(r + i + 4, a + i + 4, b + i + 4,  zeta[1]);
+        kyber_basemul(r + i + 6, a + i + 6, b + i + 6, -zeta[1]);
+    }
+#endif
+}
+
+/* Multiply two polynomials in NTT domain and add to result. r += a * b.
+ *
+ * @param  [in, out]  r  Result polynomial.
+ * @param  [in]       a  First polynomial multiplier.
+ * @param  [in]       b  Second polynomial multiplier.
+ */
+static void kyber_basemul_mont_add(sword16* r, const sword16* a,
+    const sword16* b)
+{
+    unsigned int i;
+    const sword16* zeta = zetas + 64;
+
+#ifdef WOLFSSL_KYBER_SMALL
+    for (i = 0; i < KYBER_N; i += 4, zeta++) {
+        sword16 t0[2];
+        sword16 t2[2];
+
+        kyber_basemul(t0, a + i + 0, b + i + 0,  zeta[0]);
+        kyber_basemul(t2, a + i + 2, b + i + 2, -zeta[0]);
+
+        r[i + 0] += t0[0];
+        r[i + 1] += t0[1];
+        r[i + 2] += t2[0];
+        r[i + 3] += t2[1];
+    }
+#else
+    for (i = 0; i < KYBER_N; i += 8, zeta += 2) {
+        sword16 t0[2];
+        sword16 t2[2];
+        sword16 t4[2];
+        sword16 t6[2];
+
+        kyber_basemul(t0, a + i + 0, b + i + 0,  zeta[0]);
+        kyber_basemul(t2, a + i + 2, b + i + 2, -zeta[0]);
+        kyber_basemul(t4, a + i + 4, b + i + 4,  zeta[1]);
+        kyber_basemul(t6, a + i + 6, b + i + 6, -zeta[1]);
+
+        r[i + 0] += t0[0];
+        r[i + 1] += t0[1];
+        r[i + 2] += t2[0];
+        r[i + 3] += t2[1];
+        r[i + 4] += t4[0];
+        r[i + 5] += t4[1];
+        r[i + 6] += t6[0];
+        r[i + 7] += t6[1];
+    }
+#endif
+}
+
+/* Pointwise multiply elements of a and b, into r, and multiply by 2^-16.
+ *
+ * @param  [out]  r   Result polynomial.
+ * @param  [in]   a   First vector polynomial to multiply with.
+ * @param  [in]   b   Second vector polynomial to multiply with.
+ * @param  [in]   kp  Number of polynomials in vector.
+ */
+static void kyber_pointwise_acc_mont(sword16* r, const sword16* a,
+    const sword16* b, unsigned int kp)
+{
+    unsigned int i;
+
+    kyber_basemul_mont(r, a, b);
+    for (i = 1; i < kp - 1; ++i) {
+        kyber_basemul_mont_add(r, a + i * KYBER_N, b + i * KYBER_N);
+    }
+    kyber_basemul_mont_add(r, a + (kp - 1) * KYBER_N, b + (kp - 1) * KYBER_N);
+}
+
+/******************************************************************************/
+
+/* Initialize Kyber implementation.
+ */
+void kyber_init(void)
+{
+#ifdef USE_INTEL_SPEEDUP
+    cpuid_flags = cpuid_get_flags();
+#endif
+}
+
+/******************************************************************************/
+
+/* Generate a public-private key pair from randomly generated data.
+ *
+ * @param  [in, out]  priv  Private key vector of polynomials.
+ * @param  [out]      pub   Public key vector of polynomials.
+ * @param  [in]       e     Error values as a vector of polynomials. Modified.
+ * @param  [in]       a     Random values in an array of vectors of polynomials.
+ * @param  [in]       kp    Number of polynomials in vector.
+ */
+static void kyber_keygen_c(sword16* priv, sword16* pub, sword16* e,
+    const sword16* a, int kp)
+{
+    int i;
+
+    /* Transform private key. All of result used in public key calculation */
+    for (i = 0; i < kp; ++i) {
+        kyber_ntt(priv + i * KYBER_N);
+    }
+
+    /* For each polynomial in the vectors. */
+    for (i = 0; i < kp; ++i) {
+        unsigned int j;
+
+        /* Multiply a by private into public polynomial. */
+        kyber_pointwise_acc_mont(pub + i * KYBER_N, a + i * kp * KYBER_N, priv,
+            kp);
+        /* Convert public polynomial to Montgomery form. */
+        for (j = 0; j < KYBER_N; ++j) {
+            sword32 t = pub[i * KYBER_N + j] * (sword32)KYBER_F;
+            pub[i * KYBER_N + j] = KYBER_MONT_RED(t);
+        }
+        /* Transform error values polynomial. */
+        kyber_ntt(e + i * KYBER_N);
+        /* Add errors to public key and reduce. */
+        for (j = 0; j < KYBER_N; ++j) {
+            sword16 t = pub[i * KYBER_N + j] + e[i * KYBER_N + j];
+            pub[i * KYBER_N + j] = KYBER_BARRETT_RED(t);
+        }
+    }
+}
+
+/* Generate a public-private key pair from randomly generated data.
+ *
+ * @param  [in, out]  priv  Private key vector of polynomials.
+ * @param  [out]      pub   Public key vector of polynomials.
+ * @param  [in]       e     Error values as a vector of polynomials. Modified.
+ * @param  [in]       a     Random values in an array of vectors of polynomials.
+ * @param  [in]       kp    Number of polynomials in vector.
+ */
+void kyber_keygen(sword16* priv, sword16* pub, sword16* e, const sword16* a,
+    int kp)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_keygen_avx2(priv, pub, e, a, kp);
+    }
+    else
+#endif
+    {
+        kyber_keygen_c(priv, pub, e, a, kp);
+    }
+}
+
+/* Encapsuluate message.
+ *
+ * @param  [in]   pub  Public key vector of polynomials.
+ * @param  [out]  bp   Vector of polynomials.
+ * @param  [out]  v    Polynomial.
+ * @param  [in]   at   Array of vector of polynomials.
+ * @param  [in]   sp   Vector of polynomials.
+ * @param  [in]   ep   Error Vector of polynomials.
+ * @param  [in]   epp  Error polynomial.
+ * @param  [in]   m    Message polynomial.
+ * @param  [in]   kp   Number of polynomials in vector.
+ */
+static void kyber_encapsulate_c(const sword16* pub, sword16* bp, sword16* v,
+    const sword16* at, sword16* sp, const sword16* ep, const sword16* epp,
+    const sword16* m, int kp)
+{
+    int i;
+
+    /* Transform sp. All of result used in calculation of bp and v. */
+    for (i = 0; i < kp; ++i) {
+        kyber_ntt(sp + i * KYBER_N);
+    }
+
+    /* For each polynomial in the vectors. */
+    for (i = 0; i < kp; ++i) {
+        unsigned int j;
+
+        /* Multiply at by sp into bp polynomial. */
+        kyber_pointwise_acc_mont(bp + i * KYBER_N, at +  i * kp * KYBER_N, sp,
+            kp);
+        /* Inverse transform bp polynomial. */
+        kyber_invntt(bp + i * KYBER_N);
+        /* Add errors to bp and reduce. */
+        for (j = 0; j < KYBER_N; ++j) {
+            sword16 t = bp[i * KYBER_N + j] + ep[i * KYBER_N + j];
+            bp[i * KYBER_N + j] = KYBER_BARRETT_RED(t);
+        }
+    }
+
+    /* Multiply public key by sp into v polynomial. */
+    kyber_pointwise_acc_mont(v, pub, sp, kp);
+    /* Inverse transform v. */
+    kyber_invntt(v);
+    /* Add errors and message to v and reduce. */
+    for (i = 0; i < KYBER_N; ++i) {
+        sword16 t = v[i] + epp[i] + m[i];
+        v[i] = KYBER_BARRETT_RED(t);
+    }
+}
+
+
+/* Encapsulate message.
+ *
+ * @param  [in]   pub  Public key vector of polynomials.
+ * @param  [out]  bp   Vector of polynomials.
+ * @param  [out]  v    Polynomial.
+ * @param  [in]   at   Array of vector of polynomials.
+ * @param  [in]   sp   Vector of polynomials.
+ * @param  [in]   ep   Error Vector of polynomials.
+ * @param  [in]   epp  Error polynomial.
+ * @param  [in]   m    Message polynomial.
+ * @param  [in]   kp   Number of polynomials in vector.
+ */
+void kyber_encapsulate(const sword16* pub, sword16* bp, sword16* v,
+    const sword16* at, sword16* sp, const sword16* ep, const sword16* epp,
+    const sword16* m, int kp)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_encapsulate_avx2(pub, bp, v, at, sp, ep, epp, m, kp);
+    }
+    else
+#endif
+    {
+        kyber_encapsulate_c(pub, bp, v, at, sp, ep, epp, m, kp);
+    }
+}
+
+/* Decapsulate message.
+ *
+ * @param  [in]   priv  Private key vector of polynomials.
+ * @param  [out]  mp    Message polynomial.
+ * @param  [in]   bp    Vector of polynomials containing error.
+ * @param  [in]   v     Encapsulated message polynomial.
+ * @param  [in]   kp    Number of polynomials in vector.
+ */
+static void kyber_decapsulate_c(const sword16* priv, sword16* mp, sword16* bp,
+    const sword16* v, int kp)
+{
+    int i;
+
+    /* Transform bp. All of result used in calculation of mp. */
+    for (i = 0; i < kp; ++i) {
+        kyber_ntt(bp + i * KYBER_N);
+    }
+
+    /* Multiply private key by bp into mp polynomial. */
+    kyber_pointwise_acc_mont(mp, priv, bp, kp);
+    /* Inverse transform mp. */
+    kyber_invntt(mp);
+    /* Subtract errors (mp) out of v and reduce into mp. */
+    for (i = 0; i < KYBER_N; ++i) {
+        sword16 t = v[i] - mp[i];
+        mp[i] = KYBER_BARRETT_RED(t);
+    }
+}
+
+/* Decapsulate message.
+ *
+ * @param  [in]   priv  Private key vector of polynomials.
+ * @param  [out]  mp    Message polynomial.
+ * @param  [in]   bp    Vector of polynomials containing error.
+ * @param  [in]   v     Encapsulated message polynomial.
+ * @param  [in]   kp    Number of polynomials in vector.
+ */
+void kyber_decapsulate(const sword16* priv, sword16* mp, sword16* bp,
+    const sword16* v, int kp)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_decapsulate_avx2(priv, mp, bp, v, kp);
+    }
+    else
+#endif
+    {
+        kyber_decapsulate_c(priv, mp, bp, v, kp);
+    }
+}
+
+/******************************************************************************/
+
+#ifdef USE_INTEL_SPEEDUP
+#ifdef WOLFSSL_KYBER512
+/* Deterministically generate a matrix (or transpose) of uniform integers mod q.
+ *
+ * Seed used with XOF to generate random bytes.
+ *
+ * @param  [out]  a           Matrix of uniform integers.
+ * @param  [in]   seed        Bytes to seed XOF generation.
+ * @param  [in]   transposed  Whether A or A^T is generated.
+ * @return  0 on success.
+ * @return  MEMORY_E when dynamic memory allocation fails. Only possible when
+ * WOLFSSL_SMALL_STACK is defined.
+ */
+static int kyber_gen_matrix_k2_avx2(sword16* a, byte* seed, int transposed)
+{
+    int i;
+    byte rand[4 * GEN_MATRIX_SIZE + 2];
+    word64 state[25 * 4];
+    unsigned int ctr0;
+    unsigned int ctr1;
+    unsigned int ctr2;
+    unsigned int ctr3;
+    byte* p;
+
+    /* Loading 64 bits, only using 48 bits. Loading 2 bytes more than used. */
+    rand[4 * GEN_MATRIX_SIZE + 0] = 0xff;
+    rand[4 * GEN_MATRIX_SIZE + 1] = 0xff;
+
+    if (!transposed) {
+        state[4*4 + 0] = 0x1f0000 + 0x000;
+        state[4*4 + 1] = 0x1f0000 + 0x001;
+        state[4*4 + 2] = 0x1f0000 + 0x100;
+        state[4*4 + 3] = 0x1f0000 + 0x101;
+    }
+    else {
+        state[4*4 + 0] = 0x1f0000 + 0x000;
+        state[4*4 + 1] = 0x1f0000 + 0x100;
+        state[4*4 + 2] = 0x1f0000 + 0x001;
+        state[4*4 + 3] = 0x1f0000 + 0x101;
+    }
+
+    kyber_sha3_128_blocksx4_seed_avx2(state, seed);
+    kyber_redistribute_21_rand_avx2(state, rand + 0 * GEN_MATRIX_SIZE,
+        rand + 1 * GEN_MATRIX_SIZE, rand + 2 * GEN_MATRIX_SIZE,
+        rand + 3 * GEN_MATRIX_SIZE);
+    for (i = SHA3_128_BYTES; i < GEN_MATRIX_SIZE; i += SHA3_128_BYTES) {
+        kyber_sha3_blocksx4_avx2(state);
+        kyber_redistribute_21_rand_avx2(state, rand + i + 0 * GEN_MATRIX_SIZE,
+            rand + i + 1 * GEN_MATRIX_SIZE, rand + i + 2 * GEN_MATRIX_SIZE,
+            rand + i + 3 * GEN_MATRIX_SIZE);
+    }
+
+    /* Sample random bytes to create a polynomial. */
+    p = rand;
+    ctr0 = kyber_rej_uniform_n_avx2(a + 0 * KYBER_N, KYBER_N, p,
+        GEN_MATRIX_SIZE);
+    p += GEN_MATRIX_SIZE;
+    ctr1 = kyber_rej_uniform_n_avx2(a + 1 * KYBER_N, KYBER_N, p,
+        GEN_MATRIX_SIZE);
+    p += GEN_MATRIX_SIZE;
+    ctr2 = kyber_rej_uniform_n_avx2(a + 2 * KYBER_N, KYBER_N, p,
+        GEN_MATRIX_SIZE);
+    p += GEN_MATRIX_SIZE;
+    ctr3 = kyber_rej_uniform_n_avx2(a + 3 * KYBER_N, KYBER_N, p,
+        GEN_MATRIX_SIZE);
+    /* Create more blocks if too many rejected. */
+    while ((ctr0 < KYBER_N) || (ctr1 < KYBER_N) || (ctr2 < KYBER_N) ||
+           (ctr3 < KYBER_N)) {
+        kyber_sha3_blocksx4_avx2(state);
+        kyber_redistribute_21_rand_avx2(state, rand + 0 * GEN_MATRIX_SIZE,
+            rand + 1 * GEN_MATRIX_SIZE, rand + 2 * GEN_MATRIX_SIZE,
+            rand + 3 * GEN_MATRIX_SIZE);
+
+        p = rand;
+        ctr0 += kyber_rej_uniform_avx2(a + 0 * KYBER_N + ctr0, KYBER_N - ctr0,
+            p, XOF_BLOCK_SIZE);
+        p += GEN_MATRIX_SIZE;
+        ctr1 += kyber_rej_uniform_avx2(a + 1 * KYBER_N + ctr1, KYBER_N - ctr1,
+            p, XOF_BLOCK_SIZE);
+        p += GEN_MATRIX_SIZE;
+        ctr2 += kyber_rej_uniform_avx2(a + 2 * KYBER_N + ctr2, KYBER_N - ctr2,
+            p, XOF_BLOCK_SIZE);
+        p += GEN_MATRIX_SIZE;
+        ctr3 += kyber_rej_uniform_avx2(a + 3 * KYBER_N + ctr3, KYBER_N - ctr3,
+            p, XOF_BLOCK_SIZE);
+    }
+
+    return 0;
+}
+#endif
+
+#ifdef WOLFSSL_KYBER768
+/* Deterministically generate a matrix (or transpose) of uniform integers mod q.
+ *
+ * Seed used with XOF to generate random bytes.
+ *
+ * @param  [out]  a           Matrix of uniform integers.
+ * @param  [in]   seed        Bytes to seed XOF generation.
+ * @param  [in]   transposed  Whether A or A^T is generated.
+ * @return  0 on success.
+ * @return  MEMORY_E when dynamic memory allocation fails. Only possible when
+ * WOLFSSL_SMALL_STACK is defined.
+ */
+static int kyber_gen_matrix_k3_avx2(sword16* a, byte* seed, int transposed)
+{
+    int i;
+    int k;
+    byte rand[4 * GEN_MATRIX_SIZE + 2];
+    word64 state[25 * 4];
+    unsigned int ctr0;
+    unsigned int ctr1;
+    unsigned int ctr2;
+    unsigned int ctr3;
+    byte* p;
+
+    /* Loading 64 bits, only using 48 bits. Loading 2 bytes more than used. */
+    rand[4 * GEN_MATRIX_SIZE + 0] = 0xff;
+    rand[4 * GEN_MATRIX_SIZE + 1] = 0xff;
+
+    for (k = 0; k < 2; k++) {
+        for (i = 0; i < 4; i++) {
+            if (!transposed) {
+                state[4*4 + i] = 0x1f0000 + (((k*4+i)/3) << 8) + ((k*4+i)%3);
+            }
+            else {
+                state[4*4 + i] = 0x1f0000 + (((k*4+i)%3) << 8) + ((k*4+i)/3);
+            }
+        }
+
+        kyber_sha3_128_blocksx4_seed_avx2(state, seed);
+        kyber_redistribute_21_rand_avx2(state,
+            rand + 0 * GEN_MATRIX_SIZE, rand + 1 * GEN_MATRIX_SIZE,
+            rand + 2 * GEN_MATRIX_SIZE, rand + 3 * GEN_MATRIX_SIZE);
+        for (i = SHA3_128_BYTES; i < GEN_MATRIX_SIZE; i += SHA3_128_BYTES) {
+            kyber_sha3_blocksx4_avx2(state);
+            kyber_redistribute_21_rand_avx2(state,
+                rand + i + 0 * GEN_MATRIX_SIZE, rand + i + 1 * GEN_MATRIX_SIZE,
+                rand + i + 2 * GEN_MATRIX_SIZE, rand + i + 3 * GEN_MATRIX_SIZE);
+        }
+
+        /* Sample random bytes to create a polynomial. */
+        p = rand;
+        ctr0 = kyber_rej_uniform_n_avx2(a + 0 * KYBER_N, KYBER_N, p,
+            GEN_MATRIX_SIZE);
+        p += GEN_MATRIX_SIZE;
+        ctr1 = kyber_rej_uniform_n_avx2(a + 1 * KYBER_N, KYBER_N, p,
+            GEN_MATRIX_SIZE);
+        p += GEN_MATRIX_SIZE;
+        ctr2 = kyber_rej_uniform_n_avx2(a + 2 * KYBER_N, KYBER_N, p,
+            GEN_MATRIX_SIZE);
+        p += GEN_MATRIX_SIZE;
+        ctr3 = kyber_rej_uniform_n_avx2(a + 3 * KYBER_N, KYBER_N, p,
+            GEN_MATRIX_SIZE);
+        /* Create more blocks if too many rejected. */
+        while ((ctr0 < KYBER_N) || (ctr1 < KYBER_N) || (ctr2 < KYBER_N) ||
+               (ctr3 < KYBER_N)) {
+            kyber_sha3_blocksx4_avx2(state);
+            kyber_redistribute_21_rand_avx2(state, rand + 0 * GEN_MATRIX_SIZE,
+                rand + 1 * GEN_MATRIX_SIZE, rand + 2 * GEN_MATRIX_SIZE,
+                rand + 3 * GEN_MATRIX_SIZE);
+
+            p = rand;
+            ctr0 += kyber_rej_uniform_avx2(a + 0 * KYBER_N + ctr0,
+                KYBER_N - ctr0, p, XOF_BLOCK_SIZE);
+            p += GEN_MATRIX_SIZE;
+            ctr1 += kyber_rej_uniform_avx2(a + 1 * KYBER_N + ctr1,
+                KYBER_N - ctr1, p, XOF_BLOCK_SIZE);
+            p += GEN_MATRIX_SIZE;
+            ctr2 += kyber_rej_uniform_avx2(a + 2 * KYBER_N + ctr2,
+                KYBER_N - ctr2, p, XOF_BLOCK_SIZE);
+            p += GEN_MATRIX_SIZE;
+            ctr3 += kyber_rej_uniform_avx2(a + 3 * KYBER_N + ctr3,
+                KYBER_N - ctr3, p, XOF_BLOCK_SIZE);
+        }
+
+        a += 4 * KYBER_N;
+    }
+
+    state[0] = ((word64*)seed)[0];
+    state[1] = ((word64*)seed)[1];
+    state[2] = ((word64*)seed)[2];
+    state[3] = ((word64*)seed)[3];
+    /* Transposed value same as not. */
+    state[4] = 0x1f0000 + (2 << 8) + 2;
+    XMEMSET(state + 5, 0, sizeof(*state) * (25 - 5));
+    state[20] = 0x8000000000000000UL;
+    for (i = 0; i < GEN_MATRIX_SIZE; i += SHA3_128_BYTES) {
+        if (IS_INTEL_BMI2(cpuid_flags)) {
+            sha3_block_bmi2(state);
+        }
+        else if (IS_INTEL_AVX2(cpuid_flags)) {
+            sha3_block_avx2(state);
+        }
+        else {
+            BlockSha3(state);
+        }
+        XMEMCPY(rand + i, state, SHA3_128_BYTES);
+    }
+    ctr0 = kyber_rej_uniform_n_avx2(a, KYBER_N, rand, GEN_MATRIX_SIZE);
+    while (ctr0 < KYBER_N) {
+        if (IS_INTEL_BMI2(cpuid_flags)) {
+            sha3_block_bmi2(state);
+        }
+        else if (IS_INTEL_AVX2(cpuid_flags)) {
+            sha3_block_avx2(state);
+        }
+        else {
+            BlockSha3(state);
+        }
+        XMEMCPY(rand, state, SHA3_128_BYTES);
+        ctr0 += kyber_rej_uniform_avx2(a + ctr0, KYBER_N - ctr0, rand,
+            XOF_BLOCK_SIZE);
+    }
+
+    return 0;
+}
+#endif
+#ifdef WOLFSSL_KYBER1024
+/* Deterministically generate a matrix (or transpose) of uniform integers mod q.
+ *
+ * Seed used with XOF to generate random bytes.
+ *
+ * @param  [out]  a           Matrix of uniform integers.
+ * @param  [in]   seed        Bytes to seed XOF generation.
+ * @param  [in]   transposed  Whether A or A^T is generated.
+ * @return  0 on success.
+ * @return  MEMORY_E when dynamic memory allocation fails. Only possible when
+ * WOLFSSL_SMALL_STACK is defined.
+ */
+static int kyber_gen_matrix_k4_avx2(sword16* a, byte* seed, int transposed)
+{
+    int i;
+    int k;
+    byte rand[4 * GEN_MATRIX_SIZE + 2];
+    word64 state[25 * 4];
+    unsigned int ctr0;
+    unsigned int ctr1;
+    unsigned int ctr2;
+    unsigned int ctr3;
+    byte* p;
+
+    /* Loading 64 bits, only using 48 bits. Loading 2 bytes more than used. */
+    rand[4 * GEN_MATRIX_SIZE + 0] = 0xff;
+    rand[4 * GEN_MATRIX_SIZE + 1] = 0xff;
+
+    for (k = 0; k < 4; k++) {
+        for (i = 0; i < 4; i++) {
+            if (!transposed) {
+                state[4*4 + i] = 0x1f0000 + (k << 8) + i;
+            }
+            else {
+                state[4*4 + i] = 0x1f0000 + (i << 8) + k;
+            }
+        }
+
+        kyber_sha3_128_blocksx4_seed_avx2(state, seed);
+        kyber_redistribute_21_rand_avx2(state,
+            rand + 0 * GEN_MATRIX_SIZE, rand + 1 * GEN_MATRIX_SIZE,
+            rand + 2 * GEN_MATRIX_SIZE, rand + 3 * GEN_MATRIX_SIZE);
+        for (i = SHA3_128_BYTES; i < GEN_MATRIX_SIZE; i += SHA3_128_BYTES) {
+            kyber_sha3_blocksx4_avx2(state);
+            kyber_redistribute_21_rand_avx2(state,
+                rand + i + 0 * GEN_MATRIX_SIZE, rand + i + 1 * GEN_MATRIX_SIZE,
+                rand + i + 2 * GEN_MATRIX_SIZE, rand + i + 3 * GEN_MATRIX_SIZE);
+        }
+
+        /* Sample random bytes to create a polynomial. */
+        p = rand;
+        ctr0 = kyber_rej_uniform_n_avx2(a + 0 * KYBER_N, KYBER_N, p,
+            GEN_MATRIX_SIZE);
+        p += GEN_MATRIX_SIZE;
+        ctr1 = kyber_rej_uniform_n_avx2(a + 1 * KYBER_N, KYBER_N, p,
+            GEN_MATRIX_SIZE);
+        p += GEN_MATRIX_SIZE;
+        ctr2 = kyber_rej_uniform_n_avx2(a + 2 * KYBER_N, KYBER_N, p,
+            GEN_MATRIX_SIZE);
+        p += GEN_MATRIX_SIZE;
+        ctr3 = kyber_rej_uniform_n_avx2(a + 3 * KYBER_N, KYBER_N, p,
+            GEN_MATRIX_SIZE);
+        /* Create more blocks if too many rejected. */
+        while ((ctr0 < KYBER_N) || (ctr1 < KYBER_N) || (ctr2 < KYBER_N) ||
+               (ctr3 < KYBER_N)) {
+            kyber_sha3_blocksx4_avx2(state);
+            kyber_redistribute_21_rand_avx2(state, rand + 0 * GEN_MATRIX_SIZE,
+                rand + 1 * GEN_MATRIX_SIZE, rand + 2 * GEN_MATRIX_SIZE,
+                rand + 3 * GEN_MATRIX_SIZE);
+
+            p = rand;
+            ctr0 += kyber_rej_uniform_avx2(a + 0 * KYBER_N + ctr0,
+                KYBER_N - ctr0, p, XOF_BLOCK_SIZE);
+            p += GEN_MATRIX_SIZE;
+            ctr1 += kyber_rej_uniform_avx2(a + 1 * KYBER_N + ctr1,
+                KYBER_N - ctr1, p, XOF_BLOCK_SIZE);
+            p += GEN_MATRIX_SIZE;
+            ctr2 += kyber_rej_uniform_avx2(a + 2 * KYBER_N + ctr2,
+                KYBER_N - ctr2, p, XOF_BLOCK_SIZE);
+            p += GEN_MATRIX_SIZE;
+            ctr3 += kyber_rej_uniform_avx2(a + 3 * KYBER_N + ctr3,
+                KYBER_N - ctr3, p, XOF_BLOCK_SIZE);
+        }
+
+        a += 4 * KYBER_N;
+    }
+
+    return 0;
+}
+#endif /* KYBER1024 */
+#endif /* USE_INTEL_SPEEDUP */
+
+/* Absorb the seed data for squeezing out pseudo-random data.
+ *
+ * @param  [in, out]  shake128  SHAKE-128 object.
+ * @param  [in]       seed      Data to absorb.
+ * @param  [in]       len       Length of data to absorb in bytes.
+ * @return  0 on success always.
+ */
+static int kyber_xof_absorb(wc_Shake* shake128, byte* seed, int len)
+{
+    int ret;
+
+    ret = wc_InitShake128(shake128, NULL, INVALID_DEVID);
+    if (ret == 0) {
+        ret = wc_Shake128_Absorb(shake128, seed, len);
+    }
+
+    return ret;
+}
+
+/* Squeeze the state to produce pseudo-random data.
+ *
+ * @param  [in, out]  shake128  SHAKE-128 object.
+ * @param  [out]      out       Buffer to write to.
+ * @param  [in]       blocks    Number of blocks to write.
+ * @return  0 on success always.
+ */
+static int kyber_xof_squeezeblocks(wc_Shake* shake128, byte* out, int blocks)
+{
+    return wc_Shake128_SqueezeBlocks(shake128, out, blocks);
+}
+
+/* Initialize SHAKE-256 object.
+ *
+ * @param  [in, out]  shake256  SHAKE-256 object.
+ */
+void kyber_prf_init(wc_Shake* shake256)
+{
+    XMEMSET(shake256->s, 0, sizeof(shake256->s));
+
+}
+
+/* New/Initialize SHAKE-256 object.
+ *
+ * @param  [in, out]  shake256  SHAKE-256 object.
+ * @param  [in]       heap      Dynamic memory allocator hint.
+ * @param  [in]       devId     Device id.
+ * @return  0 on success always.
+ */
+int kyber_prf_new(wc_Shake* shake256, void* heap, int devId)
+{
+    return wc_InitShake256(shake256, heap, devId);
+}
+
+/* Free SHAKE-256 object.
+ *
+ * @param  [in, out]  shake256  SHAKE-256 object.
+ */
+void kyber_prf_free(wc_Shake* shake256)
+{
+    wc_Shake256_Free(shake256);
+}
+
+/* Create pseudo-random data from the key using SHAKE-256.
+ *
+ * @param  [in, out]  shake256  SHAKE-256 object.
+ * @param  [out]      out       Buffer to write to.
+ * @param  [in]       outLen    Number of bytes to write.
+ * @param  [in]       key       Data to derive from. Must be KYBER_SYM_SZ + 1
+ *                              bytes in length.
+ * @return  0 on success always.
+ */
+static int kyber_prf(wc_Shake* shake256, byte* out, unsigned int outLen,
+    const byte* key)
+{
+#ifdef USE_INTEL_SPEEDUP
+    int i;
+    word64 state[25];
+
+    (void)shake256;
+
+    for (i = 0; i < KYBER_SYM_SZ / 8; i++) {
+        state[i] = ((word64*)key)[i];
+    }
+    state[KYBER_SYM_SZ / 8] = 0x1f00 | key[KYBER_SYM_SZ];
+    XMEMSET(state + KYBER_SYM_SZ / 8 + 1, 0,
+        (25 - KYBER_SYM_SZ / 8 - 1) * sizeof(word64));
+    state[WC_SHA3_256_COUNT - 1] = 0x8000000000000000UL;
+
+    if (IS_INTEL_BMI2(cpuid_flags)) {
+        sha3_block_bmi2(state);
+    }
+    else if (IS_INTEL_AVX2(cpuid_flags)) {
+        sha3_block_avx2(state);
+    }
+    else {
+        BlockSha3(state);
+    }
+    XMEMCPY(out, state, outLen);
+
+    return 0;
+#else
+    int ret;
+
+    ret = wc_Shake256_Update(shake256, key, KYBER_SYM_SZ + 1);
+    if (ret == 0) {
+        ret = wc_Shake256_Final(shake256, out, outLen);
+    }
+
+    return ret;
+#endif
+}
+
+#ifdef USE_INTEL_SPEEDUP
+/* Create pseudo-random key from the seed using SHAKE-256.
+ *
+ * @param  [in]  seed      Data to derive from.
+ * @param  [in]  seedLen   Length of data to derive from in bytes.
+ * @param  [out] out       Buffer to write to.
+ * @param  [in]  outLen    Number of bytes to derive.
+ * @return  0 on success always.
+ */
+int kyber_kdf(byte* seed, int seedLen, byte* out, int outLen)
+{
+    word64 state[25];
+    int i;
+    int len64 = seedLen / 8;
+
+    for (i = 0; i < len64; i++) {
+        state[i] = ((word64*)seed)[i];
+    }
+    state[len64] = 0x1f;
+    XMEMSET(state + len64 + 1, 0, (25 - len64 - 1) * sizeof(word64));
+    state[WC_SHA3_256_COUNT - 1] = 0x8000000000000000UL;
+
+    if (IS_INTEL_BMI2(cpuid_flags)) {
+        sha3_block_bmi2(state);
+    }
+    else if (IS_INTEL_AVX2(cpuid_flags)) {
+        sha3_block_avx2(state);
+    }
+    else {
+        BlockSha3(state);
+    }
+    XMEMCPY(out, state, outLen);
+
+    return 0;
+}
+#endif
+
+/* Rejection sampling on uniform random bytes to generate uniform random
+ * integers mod q.
+ *
+ * @param  [out]  p     Uniform random integers mod q.
+ * @param  [in]   len   Maximum number of integers.
+ * @param  [in]   r     Uniform random bytes buffer.
+ * @param  [in]   rLen  Length of random data in buffer.
+ * @return  Number of integers sampled.
+ */
+static unsigned int kyber_rej_uniform_c(sword16* p, unsigned int len,
+    const byte* r, unsigned int rLen)
+{
+    unsigned int i;
+    unsigned int j;
+
+    /* Keep sampling until maximum number of integers reached or buffer used up.
+     */
+    for (i = 0, j = 0; (i < len) && (j <= rLen - 3); j += 3) {
+        /* Use 24 bits (3 bytes) as two 12 bits integers. */
+        sword16 v0 = ((r[0] >> 0) | ((word16)r[1] << 8)) & 0xFFF;
+        sword16 v1 = ((r[1] >> 4) | ((word16)r[2] << 4)) & 0xFFF;
+
+        /* Reject first 12-bit integer if greater than or equal to q. */
+        if (v0 < KYBER_Q) {
+            p[i++] = v0;
+        }
+        /* Check second if we don't have enough integers yet.
+         * Reject second 12-bit integer if greater than or equal to q. */
+        if ((i < len) && (v1 < KYBER_Q)) {
+            p[i++] = v1;
+        }
+
+        /* Move over used bytes. */
+        r += 3;
+    }
+
+    return i;
+}
+
+/* Deterministically generate a matrix (or transpose) of uniform integers mod q.
+ *
+ * Seed used with XOF to generate random bytes.
+ *
+ * @param  [in]   prf         XOF object.
+ * @param  [out]  a           Matrix of uniform integers.
+ * @param  [in]   kp          Number of dimensions. kp x kp polynomials.
+ * @param  [in]   seed        Bytes to seed XOF generation.
+ * @param  [in]   transposed  Whether A or A^T is generated.
+ * @return  0 on success.
+ * @return  MEMORY_E when dynamic memory allocation fails. Only possible when
+ * WOLFSSL_SMALL_STACK is defined.
+ */
+static int kyber_gen_matrix_c(KYBER_PRF_T* prf, sword16* a, int kp, byte* seed,
+    int transposed)
+{
+#ifdef WOLFSSL_SMALL_STACK
+    byte* rand;
+#else
+    byte rand[GEN_MATRIX_SIZE + 2];
+#endif
+    byte extSeed[KYBER_SYM_SZ + 2];
+    int ret = 0;
+    int i;
+
+    XMEMCPY(extSeed, seed, KYBER_SYM_SZ);
+
+#ifdef WOLFSSL_SMALL_STACK
+    /* Allocate large amount of memory to hold random bytes to be samples. */
+    rand = (byte*)XMALLOC(GEN_MATRIX_SIZE + 2, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+    if (rand == NULL) {
+        ret = MEMORY_E;
+    }
+#endif
+
+    /* Generate each vector of polynomials. */
+    for (i = 0; (ret == 0) && (i < kp); i++, a += kp * KYBER_N) {
+        int j;
+        /* Generate each polynomial in vector from seed with indices. */
+        for (j = 0; (ret == 0) && (j < kp); j++) {
+            if (transposed) {
+                extSeed[KYBER_SYM_SZ + 0] = i;
+                extSeed[KYBER_SYM_SZ + 1] = j;
+            }
+            else {
+                extSeed[KYBER_SYM_SZ + 0] = j;
+                extSeed[KYBER_SYM_SZ + 1] = i;
+            }
+            /* Absorb the index specific seed. */
+            ret = kyber_xof_absorb(prf, extSeed, sizeof(extSeed));
+            if (ret == 0) {
+                /* Create out based on the seed. */
+                ret = kyber_xof_squeezeblocks(prf, rand, GEN_MATRIX_NBLOCKS);
+            }
+            if (ret == 0) {
+            #if (GEN_MATRIX_SIZE % 3) != 0
+                unsigned int randLen;
+            #endif
+                unsigned int ctr;
+
+                /* Sample random bytes to create a polynomial. */
+                ctr = kyber_rej_uniform_c(a + j * KYBER_N, KYBER_N, rand,
+                    GEN_MATRIX_SIZE);
+                /* Create more blocks if too many rejected. */
+            #if (GEN_MATRIX_SIZE % 3) != 0
+                randLen = GEN_MATRIX_SIZE;
+                while (ctr < KYBER_N) {
+                    int off = randLen % 3;
+                    int k;
+                    for (k = 0; k < off; k++) {
+                        rand[k] = rand[randLen - off + k];
+                    }
+                    kyber_xof_squeezeblocks(prf, rand + off, 1);
+                    randLen = off + XOF_BLOCK_SIZE;
+                    ctr += kyber_rej_uniform_c(a + j * KYBER_N + ctr,
+                        KYBER_N - ctr, rand, randLen);
+                }
+            #else
+                while (ctr < KYBER_N) {
+                    kyber_xof_squeezeblocks(prf, rand, 1);
+                    ctr += kyber_rej_uniform_c(a + j * KYBER_N + ctr,
+                        KYBER_N - ctr, rand, XOF_BLOCK_SIZE);
+                }
+            #endif
+            }
+        }
+    }
+
+#ifdef WOLFSSL_SMALL_STACK
+    /* Dispose of temporary buffer. */
+    XFREE(rand, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+#endif
+
+    return ret;
+}
+
+/* Deterministically generate a matrix (or transpose) of uniform integers mod q.
+ *
+ * Seed used with XOF to generate random bytes.
+ *
+ * @param  [in]   prf         XOF object.
+ * @param  [out]  a           Matrix of uniform integers.
+ * @param  [in]   kp          Number of dimensions. kp x kp polynomials.
+ * @param  [in]   seed        Bytes to seed XOF generation.
+ * @param  [in]   transposed  Whether A or A^T is generated.
+ * @return  0 on success.
+ * @return  MEMORY_E when dynamic memory allocation fails. Only possible when
+ * WOLFSSL_SMALL_STACK is defined.
+ */
+int kyber_gen_matrix(KYBER_PRF_T* prf, sword16* a, int kp, byte* seed,
+    int transposed)
+{
+    int ret;
+
+#ifdef WOLFSSL_KYBER512
+    if (kp == KYBER512_K) {
+    #ifdef USE_INTEL_SPEEDUP
+        if (IS_INTEL_AVX2(cpuid_flags)) {
+            ret = kyber_gen_matrix_k2_avx2(a, seed, transposed);
+        }
+        else
+    #endif
+        {
+            ret = kyber_gen_matrix_c(prf, a, KYBER512_K, seed, transposed);
+        }
+    }
+    else
+#endif
+#ifdef WOLFSSL_KYBER768
+    if (kp == KYBER768_K) {
+    #ifdef USE_INTEL_SPEEDUP
+        if (IS_INTEL_AVX2(cpuid_flags)) {
+            ret = kyber_gen_matrix_k3_avx2(a, seed, transposed);
+        }
+        else
+    #endif
+        {
+            ret = kyber_gen_matrix_c(prf, a, KYBER768_K, seed, transposed);
+        }
+    }
+    else
+#endif
+#ifdef WOLFSSL_KYBER1024
+    if (kp == KYBER1024_K) {
+    #ifdef USE_INTEL_SPEEDUP
+        if (IS_INTEL_AVX2(cpuid_flags)) {
+            ret = kyber_gen_matrix_k4_avx2(a, seed, transposed);
+        }
+        else
+    #endif
+        {
+            ret = kyber_gen_matrix_c(prf, a, KYBER1024_K, seed, transposed);
+        }
+    }
+    else
+#endif
+    {
+        ret = BAD_STATE_E;
+    }
+
+    return ret;
+}
+
+/******************************************************************************/
+
+/* Subtract one 2 bit value from another out of a larger number.
+ *
+ * @param  [in]  d  Value containing sequential 2 bit values.
+ * @param  [in]  i  Start index of the two values in 2 bits each.
+ * @return  Difference of the two values with range 0..2.
+ */
+#define ETA2_SUB(d, i) \
+    (((sword16)((d >> ((i) * 4 + 0)) & 0x3)) - \
+     ((sword16)((d >> ((i) * 4 + 2)) & 0x3)))
+
+/* Compute polynomial with coefficients distributed according to a centered
+ * binomial distribution with parameter eta2 from uniform random bytes.
+ *
+ * @param [out]  p  Polynomial computed.
+ * @param [in]   r  Random bytes.
+ */
+static void kyber_cbd_eta2(sword16* p, const byte* r)
+{
+    unsigned int i;
+
+#ifndef WORD64_AVAILABLE
+    /* Calculate eight integer coefficients at a time. */
+    for (i = 0; i < KYBER_N; i += 8) {
+    #ifdef WOLFSSL_KYBER_SMALL
+        unsigned int j;
+    #endif
+        /* Take the next 4 bytes, little endian, as a 32 bit value. */
+    #ifdef BIG_ENDIAN_ORDER
+        word32 t = ByteReverseWord32(*(word32*)r);
+    #else
+        word32 t = *(word32*)r;
+    #endif
+        word32 d;
+        /* Add second bits to first. */
+        d  = (t >> 0) & 0x55555555;
+        d += (t >> 1) & 0x55555555;
+        /* Values 0, 1 or 2 in consecutive 2 bits.
+         * 0 - 1/4, 1 - 2/4, 2 - 1/4. */
+
+    #ifdef WOLFSSL_KYBER_SMALL
+        for (j = 0; j < 8; j++) {
+            p[i + j] = ETA2_SUB(d, j);
+        }
+    #else
+        p[i + 0] = ETA2_SUB(d, 0);
+        p[i + 1] = ETA2_SUB(d, 1);
+        p[i + 2] = ETA2_SUB(d, 2);
+        p[i + 3] = ETA2_SUB(d, 3);
+        p[i + 4] = ETA2_SUB(d, 4);
+        p[i + 5] = ETA2_SUB(d, 5);
+        p[i + 6] = ETA2_SUB(d, 6);
+        p[i + 7] = ETA2_SUB(d, 7);
+    #endif
+        /* -2 - 1/16, -1 - 4/16, 0 - 6/16, 1 - 4/16, 2 - 1/16  */
+
+        /* Move over used bytes. */
+        r += 4;
+    }
+#else
+    /* Calculate sixteen integer coefficients at a time. */
+    for (i = 0; i < KYBER_N; i += 16) {
+    #ifdef WOLFSSL_KYBER_SMALL
+        unsigned int j;
+    #endif
+        /* Take the next 8 bytes, little endian, as a 64 bit value. */
+    #ifdef BIG_ENDIAN_ORDER
+        word64 t = ByteReverseWord64(*(word64*)r);
+    #else
+        word64 t = *(word64*)r;
+    #endif
+        word64 d;
+        /* Add second bits to first. */
+        d  = (t >> 0) & 0x5555555555555555L;
+        d += (t >> 1) & 0x5555555555555555L;
+        /* Values 0, 1 or 2 in consecutive 2 bits.
+         * 0 - 1/4, 1 - 2/4, 2 - 1/4. */
+
+    #ifdef WOLFSSL_KYBER_SMALL
+        for (j = 0; j < 16; j++) {
+            p[i + j] = ETA2_SUB(d, j);
+        }
+    #else
+        p[i +  0] = ETA2_SUB(d,  0);
+        p[i +  1] = ETA2_SUB(d,  1);
+        p[i +  2] = ETA2_SUB(d,  2);
+        p[i +  3] = ETA2_SUB(d,  3);
+        p[i +  4] = ETA2_SUB(d,  4);
+        p[i +  5] = ETA2_SUB(d,  5);
+        p[i +  6] = ETA2_SUB(d,  6);
+        p[i +  7] = ETA2_SUB(d,  7);
+        p[i +  8] = ETA2_SUB(d,  8);
+        p[i +  9] = ETA2_SUB(d,  9);
+        p[i + 10] = ETA2_SUB(d, 10);
+        p[i + 11] = ETA2_SUB(d, 11);
+        p[i + 12] = ETA2_SUB(d, 12);
+        p[i + 13] = ETA2_SUB(d, 13);
+        p[i + 14] = ETA2_SUB(d, 14);
+        p[i + 15] = ETA2_SUB(d, 15);
+    #endif
+        /* -2 - 1/16, -1 - 4/16, 0 - 6/16, 1 - 4/16, 2 - 1/16  */
+
+        /* Move over used bytes. */
+        r += 8;
+    }
+#endif
+}
+
+#ifdef WOLFSSL_KYBER512
+/* Subtract one 3 bit value from another out of a larger number.
+ *
+ * @param  [in]  d  Value containing sequential 3 bit values.
+ * @param  [in]  i  Start index of the two values in 3 bits each.
+ * @return  Difference of the two values with range 0..3.
+ */
+#define ETA3_SUB(d, i) \
+    (((sword16)((d >> ((i) * 6 + 0)) & 0x7)) - \
+     ((sword16)((d >> ((i) * 6 + 3)) & 0x7)))
+
+/* Compute polynomial with coefficients distributed according to a centered
+ * binomial distribution with parameter eta3 from uniform random bytes.
+ *
+ * @param [out]  p  Polynomial computed.
+ * @param [in]   r  Random bytes.
+ */
+static void kyber_cbd_eta3(sword16* p, const byte* r)
+{
+    unsigned int i;
+
+#ifndef WORD64_AVAILABLE
+    /* Calculate four integer coefficients at a time. */
+    for (i = 0; i < KYBER_N; i += 4) {
+    #ifdef WOLFSSL_KYBER_SMALL
+        unsigned int j;
+    #endif
+        /* Take the next 3 bytes, little endian, as a 24 bit value. */
+        word32 t = (((word32)(r[0])) <<  0) |
+                   (((word32)(r[1])) <<  8) |
+                   (((word32)(r[2])) << 16);
+        word32 d;
+        /* Add second and third bits to first. */
+        d  = (t >> 0) & 0x00249249;
+        d += (t >> 1) & 0x00249249;
+        d += (t >> 2) & 0x00249249;
+        /* Values 0, 1, 2 or 3 in consecutive 3 bits.
+         * 0 - 1/8, 1 - 3/8, 2 - 3/8, 3 - 1/8. */
+
+    #ifdef WOLFSSL_KYBER_SMALL
+        for (j = 0; j < 4; j++) {
+            p[i + j] = ETA3_SUB(d, j);
+        }
+    #else
+        p[i + 0] = ETA3_SUB(d, 0);
+        p[i + 1] = ETA3_SUB(d, 1);
+        p[i + 2] = ETA3_SUB(d, 2);
+        p[i + 3] = ETA3_SUB(d, 3);
+    #endif
+        /* -3-1/64, -2-6/64, -1-15/64, 0-20/64, 1-15/64, 2-6/64, 3-1/64 */
+
+        /* Move over used bytes. */
+        r += 3;
+    }
+#else
+    /* Calculate eight integer coefficients at a time. */
+    for (i = 0; i < KYBER_N; i += 8) {
+    #ifdef WOLFSSL_KYBER_SMALL
+        unsigned int j;
+    #endif
+        /* Take the next 6 bytes, little endian, as a 48 bit value. */
+        word64 t = (((word64)(r[0])) <<  0) |
+                   (((word64)(r[1])) <<  8) |
+                   (((word64)(r[2])) << 16) |
+                   (((word64)(r[3])) << 24) |
+                   (((word64)(r[4])) << 32) |
+                   (((word64)(r[5])) << 40);
+        word64 d;
+        /* Add second and third bits to first. */
+        d  = (t >> 0) & 0x0000249249249249L;
+        d += (t >> 1) & 0x0000249249249249L;
+        d += (t >> 2) & 0x0000249249249249L;
+        /* Values 0, 1, 2 or 3 in consecutive 3 bits.
+         * 0 - 1/8, 1 - 3/8, 2 - 3/8, 3 - 1/8. */
+
+    #ifdef WOLFSSL_KYBER_SMALL
+        for (j = 0; j < 8; j++) {
+            p[i + j] = ETA3_SUB(d, j);
+        }
+    #else
+        p[i + 0] = ETA3_SUB(d, 0);
+        p[i + 1] = ETA3_SUB(d, 1);
+        p[i + 2] = ETA3_SUB(d, 2);
+        p[i + 3] = ETA3_SUB(d, 3);
+        p[i + 4] = ETA3_SUB(d, 4);
+        p[i + 5] = ETA3_SUB(d, 5);
+        p[i + 6] = ETA3_SUB(d, 6);
+        p[i + 7] = ETA3_SUB(d, 7);
+    #endif
+        /* -3-1/64, -2-6/64, -1-15/64, 0-20/64, 1-15/64, 2-6/64, 3-1/64 */
+
+        /* Move over used bytes. */
+        r += 6;
+    }
+#endif
+}
+#endif
+
+/* Get noise/error by calculating random bytes and sampling to a binomial
+ * distribution.
+ *
+ * @param  [in, out]  prf   Psuedo-random function object.
+ * @param  [out]      p     Polynomial.
+ * @param  [in]       seed  Seed to use when calculating random.
+ * @param  [in]       eta1  Size of noise/error integers.
+ * @return  0 on success.
+ */
+static int kyber_get_noise_eta1_c(KYBER_PRF_T* prf, sword16* p,
+    const byte* seed, byte eta1)
+{
+    int ret;
+
+    (void)eta1;
+
+#ifdef WOLFSSL_KYBER512
+    if (eta1 == KYBER_CBD_ETA3) {
+        byte rand[ETA3_RAND_SIZE];
+
+        /* Calculate random bytes from seed with PRF. */
+        ret = kyber_prf(prf, rand, sizeof(rand), seed);
+        if (ret == 0) {
+            /* Sample for values in range -3..3 from 3 bits of random. */
+            kyber_cbd_eta3(p, rand);
+         }
+    }
+    else
+#endif
+    {
+        byte rand[ETA2_RAND_SIZE];
+
+        /* Calculate random bytes from seed with PRF. */
+        ret = kyber_prf(prf, rand, sizeof(rand), seed);
+        if (ret == 0) {
+            /* Sample for values in range -2..2 from 2 bits of random. */
+            kyber_cbd_eta2(p, rand);
+        }
+    }
+
+    return ret;
+}
+
+/* Get noise/error by calculating random bytes and sampling to a binomial
+ * distribution. Values -2..2
+ *
+ * @param  [in, out]  prf   Psuedo-random function object.
+ * @param  [out]      p     Polynomial.
+ * @param  [in]       seed  Seed to use when calculating random.
+ * @return  0 on success.
+ */
+static int kyber_get_noise_eta2_c(KYBER_PRF_T* prf, sword16* p,
+    const byte* seed)
+{
+    int ret;
+    byte rand[ETA2_RAND_SIZE];
+
+    /* Calculate random bytes from seed with PRF. */
+    ret = kyber_prf(prf, rand, sizeof(rand), seed);
+    if (ret == 0) {
+        kyber_cbd_eta2(p, rand);
+    }
+
+    return ret;
+}
+
+#ifdef USE_INTEL_SPEEDUP
+#define PRF_RAND_SZ   (2 * SHA3_256_BYTES)
+
+#if defined(WOLFSSL_KYBER768) || defined(WOLFSSL_KYBER1024)
+/* Get the noise/error by calculating random bytes.
+ *
+ * @param  [out]  rand  Random number byte array.
+ * @param  [in]   seed  Seed to generate random from.
+ * @param  [in]   o     Offset of seed count.
+ */
+static void kyber_get_noise_x4_eta2_avx2(byte* rand, byte* seed, byte o)
+{
+    int i;
+    word64 state[25 * 4];
+
+    for (i = 0; i < 4; i++) {
+        state[4*4 + i] = 0x1f00 + i + o;
+    }
+
+    kyber_sha3_256_blocksx4_seed_avx2(state, seed);
+    kyber_redistribute_16_rand_avx2(state, rand + 0 * ETA2_RAND_SIZE,
+        rand + 1 * ETA2_RAND_SIZE, rand + 2 * ETA2_RAND_SIZE,
+        rand + 3 * ETA2_RAND_SIZE);
+}
+#endif
+
+#ifdef WOLFSSL_KYBER512
+/* Get the noise/error by calculating random bytes.
+ *
+ * @param  [out]  rand  Random number byte array.
+ * @param  [in]   seed  Seed to generate random from.
+ * @param  [in]   o     Offset of seed count.
+ */
+static void kyber_get_noise_x4_eta3_avx2(byte* rand, byte* seed)
+{
+    word64 state[25 * 4];
+    int i;
+
+    state[4*4 + 0] = 0x1f00 + 0;
+    state[4*4 + 1] = 0x1f00 + 1;
+    state[4*4 + 2] = 0x1f00 + 2;
+    state[4*4 + 3] = 0x1f00 + 3;
+
+    kyber_sha3_256_blocksx4_seed_avx2(state, seed);
+    kyber_redistribute_17_rand_avx2(state, rand + 0 * PRF_RAND_SZ,
+        rand + 1 * PRF_RAND_SZ, rand + 2 * PRF_RAND_SZ,
+        rand + 3 * PRF_RAND_SZ);
+    i = SHA3_256_BYTES;
+    kyber_sha3_blocksx4_avx2(state);
+    kyber_redistribute_8_rand_avx2(state, rand + i + 0 * PRF_RAND_SZ,
+        rand + i + 1 * PRF_RAND_SZ, rand + i + 2 * PRF_RAND_SZ,
+        rand + i + 3 * PRF_RAND_SZ);
+}
+
+/* Get noise/error by calculating random bytes and sampling to a binomial
+ * distribution. Values -2..2
+ *
+ * @param  [in, out]  prf   Psuedo-random function object.
+ * @param  [out]      p     Polynomial.
+ * @param  [in]       seed  Seed to use when calculating random.
+ * @return  0 on success.
+ */
+static int kyber_get_noise_eta2_avx2(KYBER_PRF_T* prf, sword16* p,
+    const byte* seed)
+{
+    int ret;
+    byte rand[ETA2_RAND_SIZE];
+
+    /* Calculate random bytes from seed with PRF. */
+    ret = kyber_prf(prf, rand, sizeof(rand), seed);
+    if (ret == 0) {
+        kyber_cbd_eta2_avx2(p, rand);
+    }
+
+    return ret;
+}
+
+/* Get the noise/error by calculating random bytes and sampling to a binomial
+ * distribution.
+ *
+ * @param  [in, out]  prf   Psuedo-random function object.
+ * @param  [out]      vec1  First Vector of polynomials.
+ * @param  [out]      vec2  Second Vector of polynomials.
+ * @param  [out]      poly  Polynomial.
+ * @param  [in]       seed  Seed to use when calculating random.
+ * @return  0 on success.
+ */
+static int kyber_get_noise_k2_avx2(KYBER_PRF_T* prf, sword16* vec1,
+    sword16* vec2, sword16* poly, byte* seed)
+{
+    int ret = 0;
+    byte rand[4 * PRF_RAND_SZ];
+
+    kyber_get_noise_x4_eta3_avx2(rand, seed);
+    kyber_cbd_eta3_avx2(vec1          , rand + 0 * PRF_RAND_SZ);
+    kyber_cbd_eta3_avx2(vec1 + KYBER_N, rand + 1 * PRF_RAND_SZ);
+    if (poly == NULL) {
+        kyber_cbd_eta3_avx2(vec2          , rand + 2 * PRF_RAND_SZ);
+        kyber_cbd_eta3_avx2(vec2 + KYBER_N, rand + 3 * PRF_RAND_SZ);
+    }
+    else {
+        kyber_cbd_eta2_avx2(vec2          , rand + 2 * PRF_RAND_SZ);
+        kyber_cbd_eta2_avx2(vec2 + KYBER_N, rand + 3 * PRF_RAND_SZ);
+
+        seed[KYBER_SYM_SZ] = 4;
+        ret = kyber_get_noise_eta2_avx2(prf, poly, seed);
+    }
+
+    return ret;
+}
+#endif
+
+#ifdef WOLFSSL_KYBER768
+/* Get the noise/error by calculating random bytes and sampling to a binomial
+ * distribution.
+ *
+ * @param  [out]      vec1  First Vector of polynomials.
+ * @param  [out]      vec2  Second Vector of polynomials.
+ * @param  [out]      poly  Polynomial.
+ * @param  [in]       seed  Seed to use when calculating random.
+ * @return  0 on success.
+ */
+static int kyber_get_noise_k3_avx2(sword16* vec1, sword16* vec2, sword16* poly,
+    byte* seed)
+{
+    byte rand[4 * ETA2_RAND_SIZE];
+
+    kyber_get_noise_x4_eta2_avx2(rand, seed, 0);
+    kyber_cbd_eta2_avx2(vec1              , rand + 0 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec1 + 1 * KYBER_N, rand + 1 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec1 + 2 * KYBER_N, rand + 2 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec2              , rand + 3 * ETA2_RAND_SIZE);
+    kyber_get_noise_x4_eta2_avx2(rand, seed, 4);
+    kyber_cbd_eta2_avx2(vec2 + 1 * KYBER_N, rand + 0 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec2 + 2 * KYBER_N, rand + 1 * ETA2_RAND_SIZE);
+    if (poly != NULL) {
+        kyber_cbd_eta2_avx2(poly, rand + 2 * ETA2_RAND_SIZE);
+    }
+
+    return 0;
+}
+#endif
+
+#ifdef WOLFSSL_KYBER1024
+/* Get the noise/error by calculating random bytes and sampling to a binomial
+ * distribution.
+ *
+ * @param  [in, out]  prf   Psuedo-random function object.
+ * @param  [out]      vec1  First Vector of polynomials.
+ * @param  [out]      vec2  Second Vector of polynomials.
+ * @param  [out]      poly  Polynomial.
+ * @param  [in]       seed  Seed to use when calculating random.
+ * @return  0 on success.
+ */
+static int kyber_get_noise_k4_avx2(KYBER_PRF_T* prf, sword16* vec1,
+    sword16* vec2, sword16* poly, byte* seed)
+{
+    int ret = 0;
+    byte rand[4 * ETA2_RAND_SIZE];
+
+    (void)prf;
+
+    kyber_get_noise_x4_eta2_avx2(rand, seed, 0);
+    kyber_cbd_eta2_avx2(vec1              , rand + 0 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec1 + 1 * KYBER_N, rand + 1 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec1 + 2 * KYBER_N, rand + 2 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec1 + 3 * KYBER_N, rand + 3 * ETA2_RAND_SIZE);
+    kyber_get_noise_x4_eta2_avx2(rand, seed, 4);
+    kyber_cbd_eta2_avx2(vec2              , rand + 0 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec2 + 1 * KYBER_N, rand + 1 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec2 + 2 * KYBER_N, rand + 2 * ETA2_RAND_SIZE);
+    kyber_cbd_eta2_avx2(vec2 + 3 * KYBER_N, rand + 3 * ETA2_RAND_SIZE);
+    if (poly != NULL) {
+        seed[KYBER_SYM_SZ] = 8;
+        ret = kyber_get_noise_eta2_c(prf, poly, seed);
+    }
+
+    return ret;
+}
+#endif
+#endif /* USE_INTEL_SPEEDUP */
+
+/* Get the noise/error by calculating random bytes and sampling to a binomial
+ * distribution.
+ *
+ * @param  [in, out]  prf   Psuedo-random function object.
+ * @param  [in]       kp    Number of polynomials in vector.
+ * @param  [out]      vec1  First Vector of polynomials.
+ * @param  [in]       eta1  Size of noise/error integers with first vector.
+ * @param  [out]      vec2  Second Vector of polynomials.
+ * @param  [in]       eta2  Size of noise/error integers with second vector.
+ * @param  [out]      poly  Polynomial.
+ * @param  [in]       seed  Seed to use when calculating random.
+ * @return  0 on success.
+ */
+static int kyber_get_noise_c(KYBER_PRF_T* prf, int kp, sword16* vec1, int eta1,
+    sword16* vec2, int eta2, sword16* poly, byte* seed)
+{
+    int ret = 0;
+    int i;
+
+    /* First noise generation has a seed with 0x00 appended. */
+    seed[KYBER_SYM_SZ] = 0;
+    /* Generate noise as private key. */
+    for (i = 0; (ret == 0) && (i < kp); i++) {
+        /* Generate noise for each dimension of vector. */
+        ret = kyber_get_noise_eta1_c(prf, vec1 + i * KYBER_N, seed, eta1);
+        /* Increment value of appended byte. */
+        seed[KYBER_SYM_SZ]++;
+    }
+    /* Generate noise for error. */
+    for (i = 0; (ret == 0) && (i < kp); i++) {
+        /* Generate noise for each dimension of vector. */
+        ret = kyber_get_noise_eta1_c(prf, vec2 + i * KYBER_N, seed, eta2);
+        /* Increment value of appended byte. */
+        seed[KYBER_SYM_SZ]++;
+    }
+    if ((ret == 0) && (poly != NULL)) {
+        /* Generating random error polynomial. */
+        ret = kyber_get_noise_eta2_c(prf, poly, seed);
+    }
+
+    return ret;
+}
+
+/* Get the noise/error by calculating random bytes and sampling to a binomial
+ * distribution.
+ *
+ * @param  [in, out]  prf   Psuedo-random function object.
+ * @param  [in]       kp    Number of polynomials in vector.
+ * @param  [out]      vec1  First Vector of polynomials.
+ * @param  [out]      vec2  Second Vector of polynomials.
+ * @param  [out]      poly  Polynomial.
+ * @param  [in]       seed  Seed to use when calculating random.
+ * @return  0 on success.
+ */
+int kyber_get_noise(KYBER_PRF_T* prf, int kp, sword16* vec1,
+    sword16* vec2, sword16* poly, byte* seed)
+{
+    int ret;
+
+#ifdef WOLFSSL_KYBER512
+    if (kp == KYBER512_K) {
+    #ifdef USE_INTEL_SPEEDUP
+        if (IS_INTEL_AVX2(cpuid_flags)) {
+            ret = kyber_get_noise_k2_avx2(prf, vec1, vec2, poly, seed);
+        }
+        else
+    #endif
+        if (poly == NULL) {
+            ret = kyber_get_noise_c(prf, kp, vec1, KYBER_CBD_ETA3, vec2,
+                KYBER_CBD_ETA3, NULL, seed);
+        }
+        else {
+            ret = kyber_get_noise_c(prf, kp, vec1, KYBER_CBD_ETA3, vec2,
+                KYBER_CBD_ETA2, poly, seed);
+        }
+    }
+    else
+#endif
+#ifdef WOLFSSL_KYBER768
+    if (kp == KYBER768_K) {
+    #ifdef USE_INTEL_SPEEDUP
+        if (IS_INTEL_AVX2(cpuid_flags)) {
+            ret = kyber_get_noise_k3_avx2(vec1, vec2, poly, seed);
+        }
+        else
+    #endif
+        {
+            ret = kyber_get_noise_c(prf, kp, vec1, KYBER_CBD_ETA2, vec2,
+                KYBER_CBD_ETA2, poly, seed);
+        }
+    }
+    else
+#endif
+#ifdef WOLFSSL_KYBER1024
+    if (kp == KYBER1024_K) {
+    #ifdef USE_INTEL_SPEEDUP
+        if (IS_INTEL_AVX2(cpuid_flags)) {
+            ret = kyber_get_noise_k4_avx2(prf, vec1, vec2, poly, seed);
+        }
+        else
+    #endif
+        {
+            ret = kyber_get_noise_c(prf, kp, vec1, KYBER_CBD_ETA2, vec2,
+                KYBER_CBD_ETA2, poly, seed);
+        }
+    }
+    else
+#endif
+    {
+        ret = BAD_STATE_E;
+    }
+
+    return ret;
+}
+
+/******************************************************************************/
+
+/* Compare two byte arrays of equal size.
+ *
+ * @param [in]  a   First array to compare.
+ * @param [in]  b   Second array to compare.
+ * @param [in]  sz  Size of arrays in bytes.
+ * @return  0 on success.
+ * @return  -1 on failure.
+ */
+static int kyber_cmp_c(const byte* a, const byte* b, int sz)
+{
+    int i;
+    byte r = 0;
+
+    /* Constant time comparison of the encapsulated message and cipher text. */
+    for (i = 0; i < sz; i++) {
+        r |= a[i] ^ b[i];
+    }
+    return 0 - ((-(word32)r) >> 31);
+}
+
+/* Compare two byte arrays of equal size.
+ *
+ * @param [in]  a   First array to compare.
+ * @param [in]  b   Second array to compare.
+ * @param [in]  sz  Size of arrays in bytes.
+ * @return  0 on success.
+ * @return  -1 on failure.
+ */
+int kyber_cmp(const byte* a, const byte* b, int sz)
+{
+    int fail;
+
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        fail = kyber_cmp_avx2(a, b, sz);
+    }
+    else
+#endif
+    {
+        fail = kyber_cmp_c(a, b, sz);
+    }
+
+    return fail;
+}
+
+/******************************************************************************/
+
+/* Conditional subtraction of q to each coefficient of a polynomial.
+ *
+ * @param  [in, out]  p  Polynomial.
+ */
+static KYBER_NOINLINE void kyber_csubq_c(sword16* p)
+{
+    unsigned int i;
+
+    for (i = 0; i < KYBER_N; ++i) {
+        sword16 t = p[i] - KYBER_Q;
+        /* When top bit set, -ve number - need to add q back. */
+        p[i] = ((t >> 15) & KYBER_Q) + t;
+    }
+}
+
+/******************************************************************************/
+
+#if defined(CONV_WITH_DIV) || !defined(WORD64_AVAILABLE)
+
+/* Compress value.
+ *
+ * Uses div operator that may be slow.
+ *
+ * @param  [in]  v  Vector of polynomials.
+ * @param  [in]  i  Index of polynomial in vector.
+ * @param  [in]  j  Index into polynomial.
+ * @param  [in]  k  Offset from indices.
+ * @param  [in]  s  Shift amount to apply to value being compressed.
+ * @param  [in]  m  Mask to apply get the require number of bits.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD_VEC(v, i, j, k, s, m) \
+    ((((word32)v[i * KYBER_N + j + k] << s) + KYBER_Q_HALF) / KYBER_Q) & m
+
+/* Compress value to 10 bits.
+ *
+ * Uses mul instead of div.
+ *
+ * @param  [in]  v  Vector of polynomials.
+ * @param  [in]  i  Index of polynomial in vector.
+ * @param  [in]  j  Index into polynomial.
+ * @param  [in]  k  Offset from indices.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD_10(v, i, j, k) \
+    TO_COMP_WORD_VEC(v, i, j, k, 10, 0x3ff)
+
+/* Compress value to 11 bits.
+ *
+ * Uses mul instead of div.
+ *
+ * @param  [in]  v  Vector of polynomials.
+ * @param  [in]  i  Index of polynomial in vector.
+ * @param  [in]  j  Index into polynomial.
+ * @param  [in]  k  Offset from indices.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD_11(v, i, j, k) \
+    TO_COMP_WORD_VEC(v, i, j, k, 11, 0x7ff)
+
+#else
+
+/* Multiplier that does div q.
+ * ((1 << 53) + KYBER_Q_HALF) / KYBER_Q
+ */
+#define KYBER_V53         0x275f6ed0176UL
+/* Multiplier times half of q.
+ * KYBER_V53 * (KYBER_Q_HALF + 1)
+ */
+#define KYBER_V53_HALF    0x10013afb768076UL
+
+/* Multiplier that does div q.
+ * ((1 << 54) + KYBER_Q_HALF) / KYBER_Q
+ */
+#define KYBER_V54         0x4ebedda02ecUL
+/* Multiplier times half of q.
+ * KYBER_V54 * (KYBER_Q_HALF + 1)
+ */
+#define KYBER_V54_HALF    0x200275f6ed00ecUL
+
+/* Compress value to 10 bits.
+ *
+ * Uses mul instead of div.
+ *
+ * @param  [in]  v  Vector of polynomials.
+ * @param  [in]  i  Index of polynomial in vector.
+ * @param  [in]  j  Index into polynomial.
+ * @param  [in]  k  Offset from indices.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD_10(v, i, j, k) \
+    ((((KYBER_V54 << 10) * v[i * KYBER_N + j + k]) + KYBER_V54_HALF) >> 54)
+
+/* Compress value to 11 bits.
+ *
+ * Uses mul instead of div.
+ * Only works for values in range: 0..3228
+ *
+ * @param  [in]  v  Vector of polynomials.
+ * @param  [in]  i  Index of polynomial in vector.
+ * @param  [in]  j  Index into polynomial.
+ * @param  [in]  k  Offset from indices.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD_11(v, i, j, k) \
+    ((((KYBER_V53 << 11) * v[i * KYBER_N + j + k]) + KYBER_V53_HALF) >> 53)
+
+#endif /* CONV_WITH_DIV */
+
+#if defined(WOLFSSL_KYBER512) || defined(WOLFSSL_KYBER768)
+/* Compress the vector of polynomials into a byte array with 10 bits each.
+ *
+ * @param  [out]  b       Array of bytes.
+ * @param  [in]   v       Vector of polynomials.
+ * @param  [in]   kp      Number of polynomials in vector.
+ */
+static void kyber_vec_compress_10_c(byte* r, sword16* v, unsigned int kp)
+{
+    unsigned int i;
+    unsigned int j;
+#ifdef WOLFSSL_KYBER_SMALL
+    unsigned int k;
+#endif
+
+    for (i = 0; i < kp; i++) {
+        /* Reduce each coefficient to mod q. */
+        kyber_csubq_c(v + i * KYBER_N);
+        /* All values are now positive. */
+    }
+
+    /* Each polynomial. */
+    for (i = 0; i < kp; i++) {
+        /* Each 4 polynomial coefficients. */
+        for (j = 0; j < KYBER_N; j += 4) {
+        #ifdef WOLFSSL_KYBER_SMALL
+            sword16 t[4];
+            /* Compress four polynomial values to 10 bits each. */
+            for (k = 0; k < 4; k++) {
+                t[k] = TO_COMP_WORD_10(v, i, j, k);
+            }
+
+            /* Pack four 10-bit values into byte array. */
+            r[ 0] = (t[0] >> 0);
+            r[ 1] = (t[0] >> 8) | (t[1] << 2);
+            r[ 2] = (t[1] >> 6) | (t[2] << 4);
+            r[ 3] = (t[2] >> 4) | (t[3] << 6);
+            r[ 4] = (t[3] >> 2);
+        #else
+            /* Compress four polynomial values to 10 bits each. */
+            sword16 t0 = TO_COMP_WORD_10(v, i, j, 0);
+            sword16 t1 = TO_COMP_WORD_10(v, i, j, 1);
+            sword16 t2 = TO_COMP_WORD_10(v, i, j, 2);
+            sword16 t3 = TO_COMP_WORD_10(v, i, j, 3);
+
+            /* Pack four 10-bit values into byte array. */
+            r[ 0] = (t0 >> 0);
+            r[ 1] = (t0 >> 8) | (t1 << 2);
+            r[ 2] = (t1 >> 6) | (t2 << 4);
+            r[ 3] = (t2 >> 4) | (t3 << 6);
+            r[ 4] = (t3 >> 2);
+        #endif
+
+            /* Move over set bytes. */
+            r += 5;
+        }
+    }
+}
+
+/* Compress the vector of polynomials into a byte array with 10 bits each.
+ *
+ * @param  [out]  b       Array of bytes.
+ * @param  [in]   v       Vector of polynomials.
+ * @param  [in]   kp      Number of polynomials in vector.
+ */
+void kyber_vec_compress_10(byte* r, sword16* v, unsigned int kp)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_compress_10_avx2(r, v, kp);
+    }
+    else
+#endif
+    {
+        kyber_vec_compress_10_c(r, v, kp);
+    }
+}
+#endif
+
+#ifdef WOLFSSL_KYBER1024
+/* Compress the vector of polynomials into a byte array with 11 bits each.
+ *
+ * @param  [out]  b       Array of bytes.
+ * @param  [in]   v       Vector of polynomials.
+ */
+static void kyber_vec_compress_11_c(byte* r, sword16* v)
+{
+    unsigned int i;
+    unsigned int j;
+#ifdef WOLFSSL_KYBER_SMALL
+    unsigned int k;
+#endif
+
+    for (i = 0; i < 4; i++) {
+        /* Reduce each coefficient to mod q. */
+        kyber_csubq_c(v + i * KYBER_N);
+        /* All values are now positive. */
+    }
+
+    /* Each polynomial. */
+    for (i = 0; i < 4; i++) {
+        /* Each 8 polynomial coefficients. */
+        for (j = 0; j < KYBER_N; j += 8) {
+        #ifdef WOLFSSL_KYBER_SMALL
+            sword16 t[8];
+            /* Compress eight polynomial values to 11 bits each. */
+            for (k = 0; k < 8; k++) {
+                t[k] = TO_COMP_WORD_11(v, i, j, k);
+            }
+
+            /* Pack eight 11-bit values into byte array. */
+            r[ 0] = (t[0] >>  0);
+            r[ 1] = (t[0] >>  8) | (t[1] << 3);
+            r[ 2] = (t[1] >>  5) | (t[2] << 6);
+            r[ 3] = (t[2] >>  2);
+            r[ 4] = (t[2] >> 10) | (t[3] << 1);
+            r[ 5] = (t[3] >>  7) | (t[4] << 4);
+            r[ 6] = (t[4] >>  4) | (t[5] << 7);
+            r[ 7] = (t[5] >>  1);
+            r[ 8] = (t[5] >>  9) | (t[6] << 2);
+            r[ 9] = (t[6] >>  6) | (t[7] << 5);
+            r[10] = (t[7] >>  3);
+        #else
+            /* Compress eight polynomial values to 11 bits each. */
+            sword16 t0 = TO_COMP_WORD_11(v, i, j, 0);
+            sword16 t1 = TO_COMP_WORD_11(v, i, j, 1);
+            sword16 t2 = TO_COMP_WORD_11(v, i, j, 2);
+            sword16 t3 = TO_COMP_WORD_11(v, i, j, 3);
+            sword16 t4 = TO_COMP_WORD_11(v, i, j, 4);
+            sword16 t5 = TO_COMP_WORD_11(v, i, j, 5);
+            sword16 t6 = TO_COMP_WORD_11(v, i, j, 6);
+            sword16 t7 = TO_COMP_WORD_11(v, i, j, 7);
+
+            /* Pack eight 11-bit values into byte array. */
+            r[ 0] = (t0 >>  0);
+            r[ 1] = (t0 >>  8) | (t1 << 3);
+            r[ 2] = (t1 >>  5) | (t2 << 6);
+            r[ 3] = (t2 >>  2);
+            r[ 4] = (t2 >> 10) | (t3 << 1);
+            r[ 5] = (t3 >>  7) | (t4 << 4);
+            r[ 6] = (t4 >>  4) | (t5 << 7);
+            r[ 7] = (t5 >>  1);
+            r[ 8] = (t5 >>  9) | (t6 << 2);
+            r[ 9] = (t6 >>  6) | (t7 << 5);
+            r[10] = (t7 >>  3);
+        #endif
+
+            /* Move over set bytes. */
+            r += 11;
+        }
+    }
+}
+
+/* Compress the vector of polynomials into a byte array with 11 bits each.
+ *
+ * @param  [out]  b       Array of bytes.
+ * @param  [in]   v       Vector of polynomials.
+ */
+void kyber_vec_compress_11(byte* r, sword16* v)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_compress_11_avx2(r, v, 4);
+    }
+    else
+#endif
+    {
+        kyber_vec_compress_11_c(r, v);
+    }
+}
+#endif
+
+/* Decompress a 10 bit value.
+ *
+ * @param  [in]  v  Vector of polynomials.
+ * @param  [in]  i  Index of polynomial in vector.
+ * @param  [in]  j  Index into polynomial.
+ * @param  [in]  k  Offset from indices.
+ * @param  [in]  t  Value to decompress.
+ * @return  Decompressed value.
+ */
+#define DECOMP_10(v, i, j, k, t) \
+    v[i * KYBER_N + 4 * j + k] = \
+        (word16)((((word32)(t & 0x3ff) * KYBER_Q) + 512) >> 10)
+
+/* Decompress an 11 bit value.
+ *
+ * @param  [in]  v  Vector of polynomials.
+ * @param  [in]  i  Index of polynomial in vector.
+ * @param  [in]  j  Index into polynomial.
+ * @param  [in]  k  Offset from indices.
+ * @param  [in]  t  Value to decompress.
+ * @return  Decompressed value.
+ */
+#define DECOMP_11(v, i, j, k, t) \
+    v[i * KYBER_N + 8 * j + k] = \
+        (word16)((((word32)(t & 0x7ff) * KYBER_Q) + 1024) >> 11)
+
+#if defined(WOLFSSL_KYBER512) || defined(WOLFSSL_KYBER768)
+/* Decompress the byte array of packed 10 bits into vector of polynomials.
+ *
+ * @param  [out]  v       Vector of polynomials.
+ * @param  [in]   b       Array of bytes.
+ * @param  [in]   kp      Number of polynomials in vector.
+ */
+static void kyber_vec_decompress_10_c(sword16* v, const unsigned char* b,
+    unsigned int kp)
+{
+    unsigned int i;
+    unsigned int j;
+#ifdef WOLFSSL_KYBER_SMALL
+    unsigned int k;
+#endif
+
+    /* Each polynomial. */
+    for (i = 0; i < kp; i++) {
+        /* Each 4 polynomial coefficients. */
+        for (j = 0; j < KYBER_N / 4; j++) {
+        #ifdef WOLFSSL_KYBER_SMALL
+            word16 t[4];
+            /* Extract out 4 values of 10 bits each. */
+            t[0] = (b[0] >> 0) | ((word16)b[ 1] << 8);
+            t[1] = (b[1] >> 2) | ((word16)b[ 2] << 6);
+            t[2] = (b[2] >> 4) | ((word16)b[ 3] << 4);
+            t[3] = (b[3] >> 6) | ((word16)b[ 4] << 2);
+            b += 5;
+
+            /* Decompress 4 values. */
+            for (k = 0; k < 4; k++) {
+                DECOMP_10(v, i, j, k, t[k]);
+            }
+        #else
+            /* Extract out 4 values of 10 bits each. */
+            sword16 t0 = (b[0] >> 0) | ((word16)b[ 1] << 8);
+            sword16 t1 = (b[1] >> 2) | ((word16)b[ 2] << 6);
+            sword16 t2 = (b[2] >> 4) | ((word16)b[ 3] << 4);
+            sword16 t3 = (b[3] >> 6) | ((word16)b[ 4] << 2);
+            b += 5;
+
+            /* Decompress 4 values. */
+            DECOMP_10(v, i, j, 0, t0);
+            DECOMP_10(v, i, j, 1, t1);
+            DECOMP_10(v, i, j, 2, t2);
+            DECOMP_10(v, i, j, 3, t3);
+        #endif
+        }
+    }
+}
+
+/* Decompress the byte array of packed 10 bits into vector of polynomials.
+ *
+ * @param  [out]  v       Vector of polynomials.
+ * @param  [in]   b       Array of bytes.
+ * @param  [in]   kp      Number of polynomials in vector.
+ */
+void kyber_vec_decompress_10(sword16* v, const unsigned char* b,
+    unsigned int kp)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_decompress_10_avx2(v, b, kp);
+    }
+    else
+#endif
+    {
+        kyber_vec_decompress_10_c(v, b, kp);
+    }
+}
+#endif
+#ifdef WOLFSSL_KYBER1024
+/* Decompress the byte array of packed 11 bits into vector of polynomials.
+ *
+ * @param  [out]  v       Vector of polynomials.
+ * @param  [in]   b       Array of bytes.
+ */
+static void kyber_vec_decompress_11_c(sword16* v, const unsigned char* b)
+{
+    unsigned int i;
+    unsigned int j;
+#ifdef WOLFSSL_KYBER_SMALL
+    unsigned int k;
+#endif
+
+    /* Each polynomial. */
+    for (i = 0; i < 4; i++) {
+        /* Each 8 polynomial coefficients. */
+        for (j = 0; j < KYBER_N / 8; j++) {
+        #ifdef WOLFSSL_KYBER_SMALL
+            word16 t[8];
+            /* Extract out 8 values of 11 bits each. */
+            t[0] = (b[0] >> 0) | ((word16)b[ 1] << 8);
+            t[1] = (b[1] >> 3) | ((word16)b[ 2] << 5);
+            t[2] = (b[2] >> 6) | ((word16)b[ 3] << 2) |
+                   ((word16)b[4] << 10);
+            t[3] = (b[4] >> 1) | ((word16)b[ 5] << 7);
+            t[4] = (b[5] >> 4) | ((word16)b[ 6] << 4);
+            t[5] = (b[6] >> 7) | ((word16)b[ 7] << 1) |
+                   ((word16)b[8] <<  9);
+            t[6] = (b[8] >> 2) | ((word16)b[ 9] << 6);
+            t[7] = (b[9] >> 5) | ((word16)b[10] << 3);
+            b += 11;
+
+            /* Decompress 8 values. */
+            for (k = 0; k < 8; k++) {
+                DECOMP_11(v, i, j, k, t[k]);
+            }
+        #else
+            /* Extract out 8 values of 11 bits each. */
+            sword16 t0 = (b[0] >> 0) | ((word16)b[ 1] << 8);
+            sword16 t1 = (b[1] >> 3) | ((word16)b[ 2] << 5);
+            sword16 t2 = (b[2] >> 6) | ((word16)b[ 3] << 2) |
+                   ((word16)b[4] << 10);
+            sword16 t3 = (b[4] >> 1) | ((word16)b[ 5] << 7);
+            sword16 t4 = (b[5] >> 4) | ((word16)b[ 6] << 4);
+            sword16 t5 = (b[6] >> 7) | ((word16)b[ 7] << 1) |
+                   ((word16)b[8] <<  9);
+            sword16 t6 = (b[8] >> 2) | ((word16)b[ 9] << 6);
+            sword16 t7 = (b[9] >> 5) | ((word16)b[10] << 3);
+            b += 11;
+
+            /* Decompress 8 values. */
+            DECOMP_11(v, i, j, 0, t0);
+            DECOMP_11(v, i, j, 1, t1);
+            DECOMP_11(v, i, j, 2, t2);
+            DECOMP_11(v, i, j, 3, t3);
+            DECOMP_11(v, i, j, 4, t4);
+            DECOMP_11(v, i, j, 5, t5);
+            DECOMP_11(v, i, j, 6, t6);
+            DECOMP_11(v, i, j, 7, t7);
+        #endif
+        }
+    }
+}
+
+/* Decompress the byte array of packed 11 bits into vector of polynomials.
+ *
+ * @param  [out]  v       Vector of polynomials.
+ * @param  [in]   b       Array of bytes.
+ */
+void kyber_vec_decompress_11(sword16* v, const unsigned char* b)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_decompress_11_avx2(v, b, 4);
+    }
+    else
+#endif
+    {
+        kyber_vec_decompress_11_c(v, b);
+    }
+}
+#endif
+
+#ifdef CONV_WITH_DIV
+
+/* Compress value.
+ *
+ * Uses div operator that may be slow.
+ *
+ * @param  [in]  v  Vector of polynomials.
+ * @param  [in]  i  Index into polynomial.
+ * @param  [in]  j  Offset from indices.
+ * @param  [in]  s  Shift amount to apply to value being compressed.
+ * @param  [in]  m  Mask to apply get the require number of bits.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD(v, i, j, s, m) \
+    ((((word32)v[i + j] << s) + KYBER_Q_HALF) / KYBER_Q) & m
+
+/* Compress value to 4 bits.
+ *
+ * Uses mul instead of div.
+ *
+ * @param  [in]  p  Polynomial.
+ * @param  [in]  i  Index into polynomial.
+ * @param  [in]  j  Offset from indices.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD_4(p, i, j) \
+    TO_COMP_WORD(p, i, j, 4, 0xf)
+
+/* Compress value to 5 bits.
+ *
+ * Uses mul instead of div.
+ *
+ * @param  [in]  p  Polynomial.
+ * @param  [in]  i  Index into polynomial.
+ * @param  [in]  j  Offset from indices.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD_5(p, i, j) \
+    TO_COMP_WORD(p, i, j, 5, 0x1f)
+
+#else
+
+/* Multiplier that does div q. */
+#define KYBER_V28         ((word32)(((1U << 28) + KYBER_Q_HALF)) / KYBER_Q)
+/* Multiplier times half of q. */
+#define KYBER_V28_HALF    ((word32)(KYBER_V28 * (KYBER_Q_HALF + 1)))
+
+/* Multiplier that does div q. */
+#define KYBER_V27         ((word32)(((1U << 27) + KYBER_Q_HALF)) / KYBER_Q)
+/* Multiplier times half of q. */
+#define KYBER_V27_HALF    ((word32)(KYBER_V27 * KYBER_Q_HALF))
+
+/* Compress value to 4 bits.
+ *
+ * Uses mul instead of div.
+ *
+ * @param  [in]  p  Polynomial.
+ * @param  [in]  i  Index into polynomial.
+ * @param  [in]  j  Offset from indices.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD_4(p, i, j) \
+    ((((KYBER_V28 << 4) * p[i + j]) + KYBER_V28_HALF) >> 28)
+
+/* Compress value to 5 bits.
+ *
+ * Uses mul instead of div.
+ *
+ * @param  [in]  p  Polynomial.
+ * @param  [in]  i  Index into polynomial.
+ * @param  [in]  j  Offset from indices.
+ * @return  Compressed value.
+ */
+#define TO_COMP_WORD_5(p, i, j) \
+    ((((KYBER_V27 << 5) * p[i + j]) + KYBER_V27_HALF) >> 27)
+
+#endif /* CONV_WITH_DIV */
+
+#if defined(WOLFSSL_KYBER512) || defined(WOLFSSL_KYBER768)
+/* Compress a polynomial into byte array - on coefficients into 4 bits.
+ *
+ * @param  [out]  b       Array of bytes.
+ * @param  [in]   p       Polynomial.
+ */
+static void kyber_compress_4_c(byte* b, sword16* p)
+{
+    unsigned int i;
+#ifdef WOLFSSL_KYBER_SMALL
+    unsigned int j;
+    byte t[8];
+#endif
+
+    /* Reduce each coefficients to mod q. */
+    kyber_csubq_c(p);
+    /* All values are now positive. */
+
+    /* Each 8 polynomial coefficients. */
+    for (i = 0; i < KYBER_N; i += 8) {
+    #ifdef WOLFSSL_KYBER_SMALL
+        /* Compress eight polynomial values to 4 bits each. */
+        for (j = 0; j < 8; j++) {
+            t[j] = TO_COMP_WORD_4(p, i, j);
+        }
+
+        b[0] = t[0] | (t[1] << 4);
+        b[1] = t[2] | (t[3] << 4);
+        b[2] = t[4] | (t[5] << 4);
+        b[3] = t[6] | (t[7] << 4);
+    #else
+        /* Compress eight polynomial values to 4 bits each. */
+        byte t0 = TO_COMP_WORD_4(p, i, 0);
+        byte t1 = TO_COMP_WORD_4(p, i, 1);
+        byte t2 = TO_COMP_WORD_4(p, i, 2);
+        byte t3 = TO_COMP_WORD_4(p, i, 3);
+        byte t4 = TO_COMP_WORD_4(p, i, 4);
+        byte t5 = TO_COMP_WORD_4(p, i, 5);
+        byte t6 = TO_COMP_WORD_4(p, i, 6);
+        byte t7 = TO_COMP_WORD_4(p, i, 7);
+
+        /* Pack eight 4-bit values into byte array. */
+        b[0] = t0 | (t1 << 4);
+        b[1] = t2 | (t3 << 4);
+        b[2] = t4 | (t5 << 4);
+        b[3] = t6 | (t7 << 4);
+    #endif
+
+        /* Move over set bytes. */
+        b += 4;
+    }
+}
+
+/* Compress a polynomial into byte array - on coefficients into 4 bits.
+ *
+ * @param  [out]  b       Array of bytes.
+ * @param  [in]   p       Polynomial.
+ */
+void kyber_compress_4(byte* b, sword16* p)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_compress_4_avx2(b, p);
+    }
+    else
+#endif
+    {
+        kyber_compress_4_c(b, p);
+    }
+}
+#endif
+#ifdef WOLFSSL_KYBER1024
+/* Compress a polynomial into byte array - on coefficients into 5 bits.
+ *
+ * @param  [out]  b       Array of bytes.
+ * @param  [in]   p       Polynomial.
+ */
+static void kyber_compress_5_c(byte* b, sword16* p)
+{
+    unsigned int i;
+#ifdef WOLFSSL_KYBER_SMALL
+    unsigned int j;
+    byte t[8];
+#endif
+
+    /* Reduce each coefficients to mod q. */
+    kyber_csubq_c(p);
+    /* All values are now positive. */
+
+    for (i = 0; i < KYBER_N; i += 8) {
+    #ifdef WOLFSSL_KYBER_SMALL
+        /* Compress eight polynomial values to 5 bits each. */
+        for (j = 0; j < 8; j++) {
+            t[j] = TO_COMP_WORD_5(p, i, j);
+        }
+
+        /* Pack 5 bits into byte array. */
+        b[0] = (t[0] >> 0) | (t[1] << 5);
+        b[1] = (t[1] >> 3) | (t[2] << 2) | (t[3] << 7);
+        b[2] = (t[3] >> 1) | (t[4] << 4);
+        b[3] = (t[4] >> 4) | (t[5] << 1) | (t[6] << 6);
+        b[4] = (t[6] >> 2) | (t[7] << 3);
+    #else
+        /* Compress eight polynomial values to 5 bits each. */
+        byte t0 = TO_COMP_WORD_5(p, i, 0);
+        byte t1 = TO_COMP_WORD_5(p, i, 1);
+        byte t2 = TO_COMP_WORD_5(p, i, 2);
+        byte t3 = TO_COMP_WORD_5(p, i, 3);
+        byte t4 = TO_COMP_WORD_5(p, i, 4);
+        byte t5 = TO_COMP_WORD_5(p, i, 5);
+        byte t6 = TO_COMP_WORD_5(p, i, 6);
+        byte t7 = TO_COMP_WORD_5(p, i, 7);
+
+        /* Pack eight 5-bit values into byte array. */
+        b[0] = (t0 >> 0) | (t1 << 5);
+        b[1] = (t1 >> 3) | (t2 << 2) | (t3 << 7);
+        b[2] = (t3 >> 1) | (t4 << 4);
+        b[3] = (t4 >> 4) | (t5 << 1) | (t6 << 6);
+        b[4] = (t6 >> 2) | (t7 << 3);
+    #endif
+
+        /* Move over set bytes. */
+        b += 5;
+    }
+}
+
+/* Compress a polynomial into byte array - on coefficients into 5 bits.
+ *
+ * @param  [out]  b       Array of bytes.
+ * @param  [in]   p       Polynomial.
+ */
+void kyber_compress_5(byte* b, sword16* p)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_compress_5_avx2(b, p);
+    }
+    else
+#endif
+    {
+        kyber_compress_5_c(b, p);
+    }
+}
+#endif
+
+/* Decompress a 4 bit value.
+ *
+ * @param  [in]  p  Polynomial.
+ * @param  [in]  i  Index into polynomial.
+ * @param  [in]  j  Offset from indices.
+ * @param  [in]  t  Value to decompress.
+ * @return  Decompressed value.
+ */
+#define DECOMP_4(p, i, j, t) \
+    p[i + j] = ((word16)((t) * KYBER_Q) + 8) >> 4
+
+/* Decompress a 5 bit value.
+ *
+ * @param  [in]  p  Polynomial.
+ * @param  [in]  i  Index into polynomial.
+ * @param  [in]  j  Offset from indices.
+ * @param  [in]  t  Value to decompress.
+ * @return  Decompressed value.
+ */
+#define DECOMP_5(p, i, j, t) \
+    p[i + j] = (((word32)((t) & 0x1f) * KYBER_Q) + 16) >> 5
+
+#if defined(WOLFSSL_KYBER512) || defined(WOLFSSL_KYBER768)
+/* Decompress the byte array of packed 4 bits into polynomial.
+ *
+ * @param  [out]  p       Polynomial.
+ * @param  [in]   b       Array of bytes.
+ */
+static void kyber_decompress_4_c(sword16* p, const unsigned char* b)
+{
+    unsigned int i;
+
+    /* 2 coefficients at a time. */
+    for (i = 0; i < KYBER_N; i += 2) {
+        /* 2 coefficients decompressed from one byte. */
+        DECOMP_4(p, i, 0, b[0] & 0xf);
+        DECOMP_4(p, i, 1, b[0] >>  4);
+        b += 1;
+    }
+}
+
+/* Decompress the byte array of packed 4 bits into polynomial.
+ *
+ * @param  [out]  p       Polynomial.
+ * @param  [in]   b       Array of bytes.
+ */
+void kyber_decompress_4(sword16* p, const unsigned char* b)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_decompress_4_avx2(p, b);
+    }
+    else
+#endif
+    {
+        kyber_decompress_4_c(p, b);
+    }
+}
+#endif
+#ifdef WOLFSSL_KYBER1024
+/* Decompress the byte array of packed 5 bits into polynomial.
+ *
+ * @param  [out]  p       Polynomial.
+ * @param  [in]   b       Array of bytes.
+ */
+static void kyber_decompress_5_c(sword16* p, const unsigned char* b)
+{
+    unsigned int i;
+
+    /* Each 8 polynomial coefficients. */
+    for (i = 0; i < KYBER_N; i += 8) {
+    #ifdef WOLFSSL_KYBER_SMALL
+        unsigned int j;
+        byte t[8];
+
+        /* Extract out 8 values of 5 bits each. */
+        t[0] = (b[0] >> 0);
+        t[1] = (b[0] >> 5) | (b[1] << 3);
+        t[2] = (b[1] >> 2);
+        t[3] = (b[1] >> 7) | (b[2] << 1);
+        t[4] = (b[2] >> 4) | (b[3] << 4);
+        t[5] = (b[3] >> 1);
+        t[6] = (b[3] >> 6) | (b[4] << 2);
+        t[7] = (b[4] >> 3);
+        b += 5;
 
-#ifdef WOLFSSL_HAVE_KYBER
-    #error "Contact wolfSSL to get the implementation of this file"
+        /* Decompress 8 values. */
+        for (j = 0; j < 8; j++) {
+            DECOMP_5(p, i, j, t[j]);
+        }
+    #else
+        /* Extract out 8 values of 5 bits each. */
+        byte t0 = (b[0] >> 0);
+        byte t1 = (b[0] >> 5) | (b[1] << 3);
+        byte t2 = (b[1] >> 2);
+        byte t3 = (b[1] >> 7) | (b[2] << 1);
+        byte t4 = (b[2] >> 4) | (b[3] << 4);
+        byte t5 = (b[3] >> 1);
+        byte t6 = (b[3] >> 6) | (b[4] << 2);
+        byte t7 = (b[4] >> 3);
+        b += 5;
+
+        /* Decompress 8 values. */
+        DECOMP_5(p, i, 0, t0);
+        DECOMP_5(p, i, 1, t1);
+        DECOMP_5(p, i, 2, t2);
+        DECOMP_5(p, i, 3, t3);
+        DECOMP_5(p, i, 4, t4);
+        DECOMP_5(p, i, 5, t5);
+        DECOMP_5(p, i, 6, t6);
+        DECOMP_5(p, i, 7, t7);
+    #endif
+    }
+}
+
+/* Decompress the byte array of packed 5 bits into polynomial.
+ *
+ * @param  [out]  p       Polynomial.
+ * @param  [in]   b       Array of bytes.
+ */
+void kyber_decompress_5(sword16* p, const unsigned char* b)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_decompress_5_avx2(p, b);
+    }
+    else
+#endif
+    {
+        kyber_decompress_5_c(p, b);
+    }
+}
+#endif
+
+/******************************************************************************/
+
+/* Convert bit from byte to 0 or (KYBER_Q + 1) / 2.
+ *
+ * Constant time implementation.
+ *
+ * @param  [out]  p    Polynomial to hold converted value.
+ * @param  [in]   msg  Message to get bit from byte from.
+ * @param  [in]   i    Index of byte from message.
+ * @param  [in]   j    Index of bit in byte.
+ */
+#define FROM_MSG_BIT(p, msg, i, j) \
+    p[8 * i + j] = ((sword16)0 - (sword16)((msg[i] >> j) & 1)) & KYBER_Q_1_HALF
+
+/* Convert message to polynomial.
+ *
+ * @param  [out]  p    Polynomial.
+ * @param  [in]   msg  Message as a byte array.
+ */
+static void kyber_from_msg_c(sword16* p, const byte* msg)
+{
+    unsigned int i;
+
+    /* For each byte of the message. */
+    for (i = 0; i < KYBER_N / 8; i++) {
+    #ifdef WOLFSSL_KYBER_SMALL
+        unsigned int j;
+        /* For each bit of the message. */
+        for (j = 0; j < 8; j++) {
+            FROM_MSG_BIT(p, msg, i, j);
+        }
+    #else
+        FROM_MSG_BIT(p, msg, i, 0);
+        FROM_MSG_BIT(p, msg, i, 1);
+        FROM_MSG_BIT(p, msg, i, 2);
+        FROM_MSG_BIT(p, msg, i, 3);
+        FROM_MSG_BIT(p, msg, i, 4);
+        FROM_MSG_BIT(p, msg, i, 5);
+        FROM_MSG_BIT(p, msg, i, 6);
+        FROM_MSG_BIT(p, msg, i, 7);
+    #endif
+    }
+}
+
+/* Convert message to polynomial.
+ *
+ * @param  [out]  p    Polynomial.
+ * @param  [in]   msg  Message as a byte array.
+ */
+void kyber_from_msg(sword16* p, const byte* msg)
+{
+#ifdef USE_INTEL_SPEEDUP
+    if (IS_INTEL_AVX2(cpuid_flags)) {
+        kyber_from_msg_avx2(p, msg);
+    }
+    else
+#endif
+    {
+        kyber_from_msg_c(p, msg);
+    }
+}
+
+#ifdef CONV_WITH_DIV
+
+/* Convert to value to bit.
+ *
+ * Uses div operator that may be slow.
+ *
+ * @param  [out]  m   Message.
+ * @param  [in]   p   Polynomial.
+ * @param  [in]   i   Index of byte in message.
+ * @param  [in]   j   Index of bit in byte.
+ */
+#define TO_MSG_BIT(m, p, i, j) \
+    m[i] |= (((((sword16)p[8 * i + j] << 1) + KYBER_Q_HALF) / KYBER_Q) & 1) << j
+
+#else
+
+/* Multiplier that does div q. */
+#define KYBER_V31       (((1U << 31) + (KYBER_Q / 2)) / KYBER_Q)
+/* 2 * multiplier that does div q. Only need bit 32 of result. */
+#define KYBER_V31_2     ((word32)(KYBER_V31 * 2))
+/* Multiplier times half of q. */
+#define KYBER_V31_HALF    ((word32)(KYBER_V31 * KYBER_Q_HALF))
+
+/* Convert to value to bit.
+ *
+ * Uses mul instead of div.
+ *
+ * @param  [out]  m   Message.
+ * @param  [in]   p   Polynomial.
+ * @param  [in]   i   Index of byte in message.
+ * @param  [in]   j   Index of bit in byte.
+ */
+#define TO_MSG_BIT(m, p, i, j) \
+    m[i] |= ((word32)((KYBER_V31_2 * p[8 * i + j]) + KYBER_V31_HALF) >> 31) << j
+
+#endif /* CONV_WITH_DIV */
+
+/* Convert polynomial to message.
+ *
+ * @param  [out]  msg  Message as a byte array.
+ * @param  [in]   p    Polynomial.
+ */
+static void kyber_to_msg_c(byte* msg, sword16* p)
+{
+    unsigned int i;
+
+    /* Reduce each coefficient to mod q. */
+    kyber_csubq_c(p);
+    /* All values are now positive. */
+
+    for (i = 0; i < KYBER_N / 8; i++) {
+    #ifdef WOLFSSL_KYBER_SMALL
+        unsigned int j;
+        msg[i] = 0;
+        for (j = 0; j < 8; j++) {
+            TO_MSG_BIT(msg, p, i, j);
+        }
+    #else
+        msg[i] = 0;
+        TO_MSG_BIT(msg, p, i, 0);
+        TO_MSG_BIT(msg, p, i, 1);
+        TO_MSG_BIT(msg, p, i, 2);
+        TO_MSG_BIT(msg, p, i, 3);
+        TO_MSG_BIT(msg, p, i, 4);
+        TO_MSG_BIT(msg, p, i, 5);
+        TO_MSG_BIT(msg, p, i, 6);
+        TO_MSG_BIT(msg, p, i, 7);
+    #endif
+    }
+}
+
+/* Convert polynomial to message.
+ *
+ * @param  [out]  msg  Message as a byte array.
+ * @param  [in]   p    Polynomial.
+ */
+void kyber_to_msg(byte* msg, sword16* p)
+{
+#ifdef USE_INTEL_SPEEDUP
+     if (IS_INTEL_AVX2(cpuid_flags)) {
+        /* Convert the polynomial into a array of bytes (message). */
+        kyber_to_msg_avx2(msg, p);
+    }
+    else
+#endif
+    {
+        kyber_to_msg_c(msg, p);
+    }
+}
+
+/******************************************************************************/
+
+/* Convert bytes to polynomial.
+ *
+ * Consecutive 12 bits hold each coefficient of polynomial.
+ * Used in decoding private and public keys.
+ *
+ * @param  [out]  p  Vector of polynomials.
+ * @param  [in]   b  Array of bytes.
+ * @param  [in]   k  Number of polynomials in vector.
+ */
+static void kyber_from_bytes_c(sword16* p, const byte* b, int k)
+{
+    int i;
+    int j;
+
+    for (j = 0; j < k; j++) {
+        for (i = 0; i < KYBER_N / 2; i++) {
+            p[2 * i + 0] = ((b[3 * i + 0] >> 0) |
+                            ((word16)b[3 * i + 1] << 8)) & 0xfff;
+            p[2 * i + 1] = ((b[3 * i + 1] >> 4) |
+                            ((word16)b[3 * i + 2] << 4)) & 0xfff;
+        }
+        p += KYBER_N;
+        b += KYBER_POLY_SIZE;
+    }
+}
+
+/* Convert bytes to polynomial.
+ *
+ * Consecutive 12 bits hold each coefficient of polynomial.
+ * Used in decoding private and public keys.
+ *
+ * @param  [out]  p  Vector of polynomials.
+ * @param  [in]   b  Array of bytes.
+ * @param  [in]   k  Number of polynomials in vector.
+ */
+void kyber_from_bytes(sword16* p, const byte* b, int k)
+{
+#ifdef USE_INTEL_SPEEDUP
+     if (IS_INTEL_AVX2(cpuid_flags)) {
+        int i;
+
+        for (i = 0; i < k; i++) {
+            kyber_from_bytes_avx2(p, b);
+            p += KYBER_N;
+            b += KYBER_POLY_SIZE;
+        }
+    }
+    else
+#endif
+    {
+        kyber_from_bytes_c(p, b, k);
+    }
+}
+
+/* Convert polynomial to bytes.
+ *
+ * Consecutive 12 bits hold each coefficient of polynomial.
+ * Used in encoding private and public keys.
+ *
+ * @param  [out]  b  Array of bytes.
+ * @param  [in]   p  Polynomial.
+ * @param  [in]   k  Number of polynomials in vector.
+ */
+static void kyber_to_bytes_c(byte* b, sword16* p, int k)
+{
+    int i;
+    int j;
+
+    /* Reduce each coefficient to mod q. */
+    kyber_csubq_c(p);
+    /* All values are now positive. */
+
+    for (j = 0; j < k; j++) {
+        for (i = 0; i < KYBER_N / 2; i++) {
+            word16 t0 = p[2 * i];
+            word16 t1 = p[2 * i + 1];
+            b[3 * i + 0] = (t0 >> 0);
+            b[3 * i + 1] = (t0 >> 8) | t1 << 4;
+            b[3 * i + 2] = (t1 >> 4);
+        }
+        p += KYBER_N;
+        b += KYBER_POLY_SIZE;
+    }
+}
+
+/* Convert polynomial to bytes.
+ *
+ * Consecutive 12 bits hold each coefficient of polynomial.
+ * Used in encoding private and public keys.
+ *
+ * @param  [out]  b  Array of bytes.
+ * @param  [in]   p  Polynomial.
+ * @param  [in]   k  Number of polynomials in vector.
+ */
+void kyber_to_bytes(byte* b, sword16* p, int k)
+{
+#ifdef USE_INTEL_SPEEDUP
+     if (IS_INTEL_AVX2(cpuid_flags)) {
+        int i;
+
+        for (i = 0; i < k; i++) {
+            kyber_to_bytes_avx2(b, p);
+            p += KYBER_N;
+            b += KYBER_POLY_SIZE;
+        }
+    }
+    else
 #endif
+    {
+        kyber_to_bytes_c(b, p, k);
+    }
+}
+
+#endif /* WOLFSSL_WC_KYBER */

+ 279 - 1
wolfssl/wolfcrypt/wc_kyber.h

@@ -1,3 +1,281 @@
+/* wc_kyber.h
+ *
+ * Copyright (C) 2006-2024 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
 
-#error "Contact wolfSSL to get the implementation of this file"
+/*!
+    \file wolfssl/wolfcrypt/wc_kyber.h
+*/
+
+
+#ifndef WOLF_CRYPT_WC_KYBER_H
+#define WOLF_CRYPT_WC_KYBER_H
+
+#include <wolfssl/wolfcrypt/types.h>
+#include <wolfssl/wolfcrypt/random.h>
+#include <wolfssl/wolfcrypt/sha3.h>
+#include <wolfssl/wolfcrypt/kyber.h>
+
+#ifdef WOLFSSL_HAVE_KYBER
+
+#if defined(_MSC_VER)
+    #define KYBER_NOINLINE __declspec(noinline)
+#elif defined(__GNUC__)
+    #define KYBER_NOINLINE __attribute__((noinline))
+#else
+    #define KYBER_NOINLINE
+#endif
+
+/* Define algorithm type when not excluded. */
+
+#ifndef WOLFSSL_NO_KYBER512
+#define WOLFSSL_KYBER512
+#endif
+#ifndef WOLFSSL_NO_KYBER768
+#define WOLFSSL_KYBER768
+#endif
+#ifndef WOLFSSL_NO_KYBER1024
+#define WOLFSSL_KYBER1024
+#endif
+
+enum {
+    /* Flags of Kyber keys. */
+    KYBER_FLAG_PRIV_SET = 0x0001,
+    KYBER_FLAG_PUB_SET  = 0x0002,
+    KYBER_FLAG_BOTH_SET = 0x0003,
+    KYBER_FLAG_H_SET    = 0x0004,
+
+    /* 2 bits of random used to create noise value. */
+    KYBER_CBD_ETA2          = 2,
+    /* 3 bits of random used to create noise value. */
+    KYBER_CBD_ETA3          = 3,
+
+    /* Number of bits to compress to. */
+    KYBER_COMP_4BITS    =  4,
+    KYBER_COMP_5BITS    =  5,
+    KYBER_COMP_10BITS   = 10,
+    KYBER_COMP_11BITS   = 11,
+};
+
+
+/* SHAKE128 rate. */
+#define XOF_BLOCK_SIZE      168
+
+/* Modulus of co-efficients of polynomial. */
+#define KYBER_Q             3329
+
+
+/* Kyber-512 parameters */
+#ifdef WOLFSSL_KYBER512
+/* Number of bits of random to create noise from. */
+#define KYBER512_ETA1       KYBER_CBD_ETA3
+#endif /* WOLFSSL_KYBER512 */
+
+/* Kyber-768 parameters */
+#ifdef WOLFSSL_KYBER768
+/* Number of bits of random to create noise from. */
+#define KYBER768_ETA1       KYBER_CBD_ETA2
+#endif /* WOLFSSL_KYBER768 */
+
+/* Kyber-1024 parameters */
+#ifdef WOLFSSL_KYBER1024
+/* Number of bits of random to create noise from. */
+#define KYBER1024_ETA1      KYBER_CBD_ETA2
+#endif /* WOLFSSL_KYBER1024 */
+
+
+
+/* The data type of the pseudo-random function. */
+#define KYBER_PRF_T     wc_Shake
+
+/* Kyber key. */
+struct KyberKey {
+    /* Type of key: KYBER512, KYBER768, KYBER1024 */
+    int type;
+    /* Dynamic memory allocation hint. */
+    void* heap;
+#if defined(WOLF_CRYPTO_CB)
+    /* Device Id. */
+    int* devId;
+#endif
+    /* Flags indicating what is stored in the key. */
+    int flags;
+
+    /* A pseudo-random function object. */
+    KYBER_PRF_T prf;
+
+    /* Private key as a vector. */
+    sword16 priv[KYBER_MAX_K * KYBER_N];
+    /* Public key as a vector. */
+    sword16 pub[KYBER_MAX_K * KYBER_N];
+    /* Public seed. */
+    byte pubSeed[KYBER_SYM_SZ];
+    /* Public hash - hash of encoded public key. */
+    byte h[KYBER_SYM_SZ];
+    /* Randomizer for decapsulation. */
+    byte z[KYBER_SYM_SZ];
+};
+
+#ifdef __cplusplus
+    extern "C" {
+#endif
+
+WOLFSSL_LOCAL
+void kyber_init(void);
+WOLFSSL_LOCAL
+void kyber_keygen(sword16* priv, sword16* pub, sword16* e, const sword16* a,
+    int kp);
+WOLFSSL_LOCAL
+void kyber_encapsulate(const sword16* pub, sword16* bp, sword16* v,
+    const sword16* at, sword16* sp, const sword16* ep, const sword16* epp,
+    const sword16* m, int kp);
+WOLFSSL_LOCAL
+void kyber_decapsulate(const sword16* priv, sword16* mp, sword16* bp,
+    const sword16* v, int kp);
+
+WOLFSSL_LOCAL
+int kyber_gen_matrix(KYBER_PRF_T* prf, sword16* a, int kp, byte* seed,
+    int transposed);
+WOLFSSL_LOCAL
+int kyber_get_noise(KYBER_PRF_T* prf, int kp, sword16* vec1, sword16* vec2,
+    sword16* poly, byte* seed);
+
+#ifdef USE_INTEL_SPEEDUP
+WOLFSSL_LOCAL
+int kyber_kdf(byte* seed, int seedLen, byte* out, int outLen);
+#endif
+WOLFSSL_LOCAL
+void kyber_prf_init(KYBER_PRF_T* prf);
+WOLFSSL_LOCAL
+int kyber_prf_new(KYBER_PRF_T* prf, void* heap, int devId);
+WOLFSSL_LOCAL
+void kyber_prf_free(KYBER_PRF_T* prf);
+
+WOLFSSL_LOCAL
+int kyber_cmp(const byte* a, const byte* b, int sz);
+
+WOLFSSL_LOCAL
+void kyber_vec_compress_10(byte* r, sword16* v, unsigned int kp);
+WOLFSSL_LOCAL
+void kyber_vec_compress_11(byte* r, sword16* v);
+WOLFSSL_LOCAL
+void kyber_vec_decompress_10(sword16* v, const unsigned char* b,
+    unsigned int kp);
+WOLFSSL_LOCAL
+void kyber_vec_decompress_11(sword16* v, const unsigned char* b);
+
+WOLFSSL_LOCAL
+void kyber_compress_4(byte* b, sword16* p);
+WOLFSSL_LOCAL
+void kyber_compress_5(byte* b, sword16* p);
+WOLFSSL_LOCAL
+void kyber_decompress_4(sword16* p, const unsigned char* b);
+WOLFSSL_LOCAL
+void kyber_decompress_5(sword16* p, const unsigned char* b);
+
+WOLFSSL_LOCAL
+void kyber_from_msg(sword16* p, const byte* msg);
+WOLFSSL_LOCAL
+void kyber_to_msg(byte* msg, sword16* p);
+WOLFSSL_LOCAL
+void kyber_from_bytes(sword16* p, const byte* b, int k);
+WOLFSSL_LOCAL
+void kyber_to_bytes(byte* b, sword16* p, int k);
+
+#ifdef USE_INTEL_SPEEDUP
+WOLFSSL_LOCAL
+void kyber_keygen_avx2(sword16* priv, sword16* pub, sword16* e,
+    const sword16* a, int kp);
+WOLFSSL_LOCAL
+void kyber_encapsulate_avx2(const sword16* pub, sword16* bp, sword16* v,
+    const sword16* at, sword16* sp, const sword16* ep, const sword16* epp,
+    const sword16* m, int kp);
+WOLFSSL_LOCAL
+void kyber_decapsulate_avx2(const sword16* priv, sword16* mp, sword16* bp,
+    const sword16* v, int kp);
+
+WOLFSSL_LOCAL
+unsigned int kyber_rej_uniform_n_avx2(sword16* p, unsigned int len,
+    const byte* r, unsigned int rLen);
+WOLFSSL_LOCAL
+unsigned int kyber_rej_uniform_avx2(sword16* p, unsigned int len, const byte* r,
+    unsigned int rLen);
+WOLFSSL_LOCAL
+void kyber_redistribute_21_rand_avx2(const word64* s, byte* r0, byte* r1,
+    byte* r2, byte* r3);
+void kyber_redistribute_17_rand_avx2(const word64* s, byte* r0, byte* r1,
+    byte* r2, byte* r3);
+void kyber_redistribute_16_rand_avx2(const word64* s, byte* r0, byte* r1,
+    byte* r2, byte* r3);
+void kyber_redistribute_8_rand_avx2(const word64* s, byte* r0, byte* r1,
+    byte* r2, byte* r3);
+
+WOLFSSL_LOCAL
+void kyber_sha3_blocksx4_avx2(word64* s);
+WOLFSSL_LOCAL
+void kyber_sha3_128_blocksx4_seed_avx2(word64* s, byte* seed);
+WOLFSSL_LOCAL
+void kyber_sha3_256_blocksx4_seed_avx2(word64* s, byte* seed);
+
+WOLFSSL_LOCAL
+void kyber_cbd_eta2_avx2(sword16* p, const byte* r);
+WOLFSSL_LOCAL
+void kyber_cbd_eta3_avx2(sword16* p, const byte* r);
+
+WOLFSSL_LOCAL
+void kyber_from_msg_avx2(sword16* p, const byte* msg);
+WOLFSSL_LOCAL
+void kyber_to_msg_avx2(byte* msg, sword16* p);
+
+WOLFSSL_LOCAL
+void kyber_from_bytes_avx2(sword16* p, const byte* b);
+WOLFSSL_LOCAL
+void kyber_to_bytes_avx2(byte* b, sword16* p);
+
+WOLFSSL_LOCAL
+void kyber_compress_10_avx2(byte* r, const sword16* p, int n);
+WOLFSSL_LOCAL
+void kyber_decompress_10_avx2(sword16* p, const byte* r, int n);
+WOLFSSL_LOCAL
+void kyber_compress_11_avx2(byte* r, const sword16* p, int n);
+WOLFSSL_LOCAL
+void kyber_decompress_11_avx2(sword16* p, const byte* r, int n);
+
+WOLFSSL_LOCAL
+void kyber_compress_4_avx2(byte* r, const sword16* p);
+WOLFSSL_LOCAL
+void kyber_decompress_4_avx2(sword16* p, const byte* r);
+WOLFSSL_LOCAL
+void kyber_compress_5_avx2(byte* r, const sword16* p);
+WOLFSSL_LOCAL
+void kyber_decompress_5_avx2(sword16* p, const byte* r);
+
+
+WOLFSSL_LOCAL
+int kyber_cmp_avx2(const byte* a, const byte* b, int sz);
+#endif
+
+#ifdef __cplusplus
+    } /* extern "C" */
+#endif
+
+#endif /* WOLFSSL_HAVE_KYBER */
+
+#endif /* WOLF_CRYPT_WC_KYBER_H */