From 98a1f6313bae2e235b157dbd512981247aef8938 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 15 Jul 2026 17:17:55 +1000 Subject: [PATCH] ChaCha20/Poly1305 ASM: AVX512 and improvements to other Intel x64 Add AVX512 implementations of ChaCha20 and Poly1305. Add fused asm implementations of ChaCha20-Poly1305. Wire the fused APIs into new API. Use new API in TLS 1.2 and TLS 1.3. --- .wolfssl_known_macro_extras | 23 +- .../header_files/chacha20_poly1305.h | 120 + src/internal.c | 241 +- src/tls13.c | 100 +- wolfcrypt/benchmark/benchmark.c | 162 +- wolfcrypt/src/chacha.c | 124 + wolfcrypt/src/chacha20_poly1305.c | 734 +- wolfcrypt/src/chacha_asm.S | 9847 +++++++++++++++- wolfcrypt/src/chacha_asm.asm | 9852 ++++++++++++++++- wolfcrypt/src/cpuid.c | 10 + wolfcrypt/src/poly1305.c | 215 +- wolfcrypt/src/poly1305_asm.S | 2441 ++++ wolfcrypt/src/poly1305_asm.asm | 2345 ++++ wolfssl/wolfcrypt/chacha20_poly1305.h | 14 + wolfssl/wolfcrypt/cpuid.h | 8 + wolfssl/wolfcrypt/poly1305.h | 48 + 16 files changed, 25763 insertions(+), 521 deletions(-) diff --git a/.wolfssl_known_macro_extras b/.wolfssl_known_macro_extras index 3f60ca60f04..7c1dfc076a9 100644 --- a/.wolfssl_known_macro_extras +++ b/.wolfssl_known_macro_extras @@ -55,6 +55,7 @@ BSP_SDCARD_SDHC_CHANNEL BSP_SDCARD_SPI_CHANNEL CAAM_OUT_INVALIDATE CERT_REL_PREFIX +CHACHA20_POLY1305_SHORT_MAX CIOCASYMFEAT CIOCGSESSINFO CMSIS_OS2_H_ @@ -334,8 +335,8 @@ HSM_KEY_TYPE_HMAC_512 HSM_OP_KEY_GENERATION_FLAGS_CREATE HSM_OP_KEY_GENERATION_FLAGS_UPDATE HSM_SVC_KEY_STORE_FLAGS_UPDATE -HWCAP_ASIMDRDM HWCAP2_SME +HWCAP_ASIMDRDM HWCAP_SVE IDIRECT_DEV_RANDOM IDIRECT_DEV_TIME @@ -805,6 +806,15 @@ WOLFSSL_CAAM_BLACK_KEY_AESCCM WOLFSSL_CAAM_BLACK_KEY_SM WOLFSSL_CAAM_NO_BLACK_KEY WOLFSSL_CALLBACKS +WOLFSSL_CHACHA20_AVX512_ALWAYS +WOLFSSL_CHACHA20_AVX512_NEVER +WOLFSSL_CHACHA20_POLY1305_FUSED +WOLFSSL_CHACHA20_POLY1305_FUSED_ALWAYS +WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA +WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA_ALWAYS +WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA_NEVER +WOLFSSL_CHACHA20_POLY1305_FUSED_NEVER +WOLFSSL_CHACHA20_POLY1305_SHORT WOLFSSL_CHECK_DESKEY WOLFSSL_CHECK_MEM_ZERO WOLFSSL_CHIBIOS @@ -896,6 +906,10 @@ WOLFSSL_NONBLOCK_OCSP WOLFSSL_NOSHA3_384 WOLFSSL_NOT_WINDOWS_API WOLFSSL_NO_BIO_ADDR_IN +WOLFSSL_NO_CHACHA20_POLY1305_FUSED +WOLFSSL_NO_CHACHA20_POLY1305_FUSED_IFMA +WOLFSSL_NO_CHACHA20_POLY1305_SHORT +WOLFSSL_NO_CHACHA20_POLY1305_SMALL_ASM WOLFSSL_NO_CLIENT_CERT_ERROR WOLFSSL_NO_COPY_CERT WOLFSSL_NO_COPY_KEY @@ -939,6 +953,7 @@ WOLFSSL_NRF51_AES WOLFSSL_NXP_CASPER_ECC_MUL2ADD WOLFSSL_NXP_CASPER_ECC_MULMOD WOLFSSL_NXP_LPC55S6X +WOLFSSL_OCSP_SCREEN_RESPONDER WOLFSSL_OLDTLS_AEAD_CIPHERSUITES WOLFSSL_OLD_SET_CURVES_LIST WOLFSSL_OLD_TIMINGPADVERIFY @@ -948,6 +963,12 @@ WOLFSSL_PASSTHRU_ERR WOLFSSL_PB WOLFSSL_PEER_ADDRESS_CHANGES WOLFSSL_PKCS11_RW_TOKENS +WOLFSSL_POLY1305_AVX512 +WOLFSSL_POLY1305_AVX512_ALWAYS +WOLFSSL_POLY1305_AVX512_NEVER +WOLFSSL_POLY1305_IFMA_ALWAYS +WOLFSSL_POLY1305_NO_AVX512 +WOLFSSL_POLY1305_NO_IFMA WOLFSSL_PPC64_ASM_AES_NO_HARDEN WOLFSSL_PRCONNECT_PRO WOLFSSL_PREFIX diff --git a/doc/dox_comments/header_files/chacha20_poly1305.h b/doc/dox_comments/header_files/chacha20_poly1305.h index 6619407463c..33247708182 100644 --- a/doc/dox_comments/header_files/chacha20_poly1305.h +++ b/doc/dox_comments/header_files/chacha20_poly1305.h @@ -123,6 +123,126 @@ int wc_ChaCha20Poly1305_Decrypt( const byte inAuthTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE], byte* outPlaintext); +/*! + \ingroup ChaCha20Poly1305 + + \brief This function performs the same AEAD encryption as + wc_ChaCha20Poly1305_Encrypt, but takes a caller-owned ChaCha20 context whose + key has already been set (with wc_Chacha_SetKey) plus a Poly1305 context, + instead of a raw key. This lets the ChaCha20 key be set once and reused + across many records, varying only the per-record nonce - it is intended for + protocol record layers such as TLS. A fresh per-record Poly1305 key is + derived from the ChaCha20 keystream, so this call re-keys the supplied + Poly1305 context; the caller does not key it. The 16 byte authentication tag + over the AAD and ciphertext is written to tag. + + \return 0 Returned upon successfully encrypting the message + \return BAD_FUNC_ARG Returned if a required pointer argument is NULL (with + its matching length nonzero) or otherwise invalid + + \param chacha pointer to a ChaCha20 context already keyed with + wc_Chacha_SetKey + \param poly pointer to a Poly1305 context used for the per-record MAC; it is + re-keyed internally on each call + \param out pointer to the buffer in which to store the ciphertext (sz bytes) + \param in pointer to the buffer containing the plaintext to encrypt + \param sz the length in bytes of the plaintext to encrypt + \param nonce pointer to the 12 byte per-record nonce + \param tag pointer to a 16 byte buffer in which to store the authentication + tag + \param aad pointer to the buffer containing arbitrary length additional + authenticated data (AAD) + \param aadSz length of the input AAD + + _Example_ + \code + ChaCha chacha; + Poly1305 poly; + byte key[] = { // initialize 32 byte key }; + byte nonce[] = { // initialize 12 byte per-record nonce }; + byte aad[] = { // initialize AAD }; + byte plain[] = { // initialize message to encrypt }; + byte cipher[sizeof(plain)]; + byte authTag[16]; + + wc_Chacha_SetKey(&chacha, key, sizeof(key)); // once, then reuse + int ret = wc_ChaCha20Poly1305_Encrypt_ex(&chacha, &poly, cipher, plain, + sizeof(plain), nonce, authTag, aad, sizeof(aad)); + if (ret != 0) { + // error running encrypt + } + \endcode + + \sa wc_ChaCha20Poly1305_Decrypt_ex + \sa wc_ChaCha20Poly1305_Encrypt + \sa wc_Chacha_SetKey +*/ +int wc_ChaCha20Poly1305_Encrypt_ex(ChaCha* chacha, Poly1305* poly, + byte* out, const byte* in, word32 sz, const byte* nonce, byte* tag, + const byte* aad, word32 aadSz); + +/*! + \ingroup ChaCha20Poly1305 + + \brief This function is the decryption counterpart of + wc_ChaCha20Poly1305_Encrypt_ex. It takes a caller-owned ChaCha20 context + whose key has already been set (with wc_Chacha_SetKey) plus a Poly1305 + context, decrypts in to out, and verifies the Poly1305 tag over the AAD and + ciphertext. On tag mismatch it returns MAC_CMP_FAILED_E and zeroizes the + output buffer, so no unauthenticated plaintext is released. The ChaCha20 key + is reused across records, varying only the per-record nonce; the Poly1305 + context is re-keyed internally on each call. out may alias in (in-place + decryption is supported). + + \return 0 Returned upon successfully decrypting and authenticating the + message + \return MAC_CMP_FAILED_E Returned if the computed authentication tag does not + match the supplied tag; out is zeroized in this case + \return BAD_FUNC_ARG Returned if a required pointer argument is NULL (with + its matching length nonzero) or otherwise invalid + + \param chacha pointer to a ChaCha20 context already keyed with + wc_Chacha_SetKey + \param poly pointer to a Poly1305 context used for the per-record MAC; it is + re-keyed internally on each call + \param out pointer to the buffer in which to store the plaintext (sz bytes) + \param in pointer to the buffer containing the ciphertext to decrypt + \param sz the length in bytes of the ciphertext to decrypt + \param nonce pointer to the 12 byte per-record nonce + \param tag pointer to the 16 byte authentication tag to verify + \param aad pointer to the buffer containing arbitrary length additional + authenticated data (AAD) + \param aadSz length of the input AAD + + _Example_ + \code + ChaCha chacha; + Poly1305 poly; + byte key[] = { // initialize 32 byte key }; + byte nonce[] = { // initialize 12 byte per-record nonce }; + byte aad[] = { // initialize AAD }; + byte cipher[] = { // received ciphertext }; + byte authTag[16] = { // received authentication tag }; + byte plain[sizeof(cipher)]; + + wc_Chacha_SetKey(&chacha, key, sizeof(key)); // once, then reuse + int ret = wc_ChaCha20Poly1305_Decrypt_ex(&chacha, &poly, plain, cipher, + sizeof(cipher), nonce, authTag, aad, sizeof(aad)); + if (ret == MAC_CMP_FAILED_E) { + // authentication failed; plain has been zeroized + } else if (ret != 0) { + // error with function arguments + } + \endcode + + \sa wc_ChaCha20Poly1305_Encrypt_ex + \sa wc_ChaCha20Poly1305_Decrypt + \sa wc_Chacha_SetKey +*/ +int wc_ChaCha20Poly1305_Decrypt_ex( + ChaCha* chacha, Poly1305* poly, byte* out, const byte* in, word32 sz, + const byte* nonce, const byte* tag, const byte* aad, word32 aadSz); + /*! \ingroup ChaCha20Poly1305 \brief Compares two authentication tags in constant time to prevent diff --git a/src/internal.c b/src/internal.c index 0ea1b04f2b7..ae64c7fd0dd 100644 --- a/src/internal.c +++ b/src/internal.c @@ -20765,86 +20765,85 @@ int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input, wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ); #endif - /* set the nonce for chacha and get poly1305 key */ - if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) { - ForceZero(nonce, CHACHA20_NONCE_SZ); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); - #endif - return ret; - } + /* Derive the Poly1305 key, encrypt and authenticate. The legacy oldPoly + * draft keeps the manual derivation and old tag layout. RFC 7905 uses the + * persistent-key stitched helper - it derives the per-record poly key, + * encrypts and MACs in one pass (the IFMA stitch for large records, else + * two-pass), matching the split ssl->encrypt.chacha / ssl->auth.poly1305 + * contexts kept keyed across the connection. */ + if (ssl->options.oldPoly != 0) { + /* set the nonce for chacha and get poly1305 key */ + if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) { + ForceZero(nonce, CHACHA20_NONCE_SZ); + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); + #endif + return ret; + } - /* create Poly1305 key using chacha20 keystream */ - if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly, + /* create Poly1305 key using chacha20 keystream */ + if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly, poly, sizeof(poly))) != 0) { - ForceZero(nonce, CHACHA20_NONCE_SZ); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); - #endif - return ret; - } -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE); -#endif - - /* set the counter after getting poly1305 key */ - if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) { - ForceZero(nonce, CHACHA20_NONCE_SZ); - ForceZero(poly, sizeof(poly)); + ForceZero(nonce, CHACHA20_NONCE_SZ); + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); + #endif + return ret; + } #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); - wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); + wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE); #endif - return ret; - } - ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */ -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); -#endif - /* encrypt the plain text */ - if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out, - input, msgLen)) != 0) { - ForceZero(poly, sizeof(poly)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); - #endif - return ret; - } - - /* get the poly1305 tag using either old padding scheme or more recent */ - if (ssl->options.oldPoly != 0) { - if ((ret = Poly1305TagOld(ssl, add, addSz, (const byte* )out, - poly, sz, tag)) != 0) { + /* set the counter after getting poly1305 key */ + if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) { + ForceZero(nonce, CHACHA20_NONCE_SZ); ForceZero(poly, sizeof(poly)); #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); #endif return ret; } - } - else { - if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, - sizeof(poly))) != 0) { + ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */ + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); + #endif + + /* encrypt the plain text */ + if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out, + input, msgLen)) != 0) { ForceZero(poly, sizeof(poly)); #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); #endif return ret; } - if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add, addSz, out, msgLen, - tag, sizeof(tag))) != 0) { + + /* get the poly1305 tag using the old padding scheme */ + if ((ret = Poly1305TagOld(ssl, add, addSz, (const byte* )out, + poly, sz, tag)) != 0) { ForceZero(poly, sizeof(poly)); #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); #endif return ret; } + ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */ + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); + #endif + } + else { + ret = wc_ChaCha20Poly1305_Encrypt_ex(ssl->encrypt.chacha, + ssl->auth.poly1305, out, input, msgLen, nonce, tag, add, + (word32)addSz); + ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */ + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); + #endif + if (ret != 0) + return ret; } - ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */ -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); -#endif /* append tag to ciphertext */ XMEMCPY(out + msgLen, tag, sizeof(tag)); @@ -20959,45 +20958,49 @@ int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input, wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ); #endif - /* set nonce and get poly1305 key */ - if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) { - ForceZero(nonce, CHACHA20_NONCE_SZ); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); - #endif - return ret; - } + /* Verify the tag and decrypt. oldPoly keeps the manual derivation, old tag + * layout and verify-then-decrypt. RFC 7905 uses the persistent-key + * stitched helper (verify + decrypt in one pass - the IFMA decrypt stitch + * for large records, else two-pass; it zeroes plain on tag mismatch). */ + if (ssl->options.oldPoly != 0) { + /* set nonce and get poly1305 key */ + if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) { + ForceZero(nonce, CHACHA20_NONCE_SZ); + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); + #endif + return ret; + } - /* use chacha20 keystream to get poly1305 key for tag */ - if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly, + /* use chacha20 keystream to get poly1305 key for tag */ + if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly, poly, sizeof(poly))) != 0) { - ForceZero(nonce, CHACHA20_NONCE_SZ); + ForceZero(nonce, CHACHA20_NONCE_SZ); + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); + #endif + return ret; + } #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); + wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE); #endif - return ret; - } -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE); -#endif - /* set counter after getting poly1305 key */ - if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) { - ForceZero(nonce, CHACHA20_NONCE_SZ); - ForceZero(poly, sizeof(poly)); + /* set counter after getting poly1305 key */ + if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) { + ForceZero(nonce, CHACHA20_NONCE_SZ); + ForceZero(poly, sizeof(poly)); + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); + wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); + #endif + return ret; + } + ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */ #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); - wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); #endif - return ret; - } - ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */ -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); -#endif - /* get the tag using Poly1305 */ - if (ssl->options.oldPoly != 0) { + /* get the tag using the old padding scheme */ if ((ret = Poly1305TagOld(ssl, add, addSz, input, poly, sz, tag)) != 0) { ForceZero(poly, sizeof(poly)); @@ -21006,43 +21009,45 @@ int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input, #endif return ret; } + ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */ + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); + #endif + + /* check tag sent along with packet */ + if (ConstantCompare(input + msgLen, tag, + ssl->specs.aead_mac_size) != 0) { + WOLFSSL_MSG("MAC did not match"); + if (!ssl->options.dtls) + SendAlert(ssl, alert_fatal, bad_record_mac); + WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR); + return VERIFY_MAC_ERROR; + } + + /* if the tag was good decrypt message */ + if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain, + input, (word32)msgLen)) != 0) + return ret; } else { - if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, - sizeof(poly))) != 0) { - ForceZero(poly, sizeof(poly)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); - #endif - return ret; - } - if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add, addSz, input, - (word32)msgLen, tag, sizeof(tag))) != 0) { - ForceZero(poly, sizeof(poly)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); - #endif + ret = wc_ChaCha20Poly1305_Decrypt_ex(ssl->decrypt.chacha, + ssl->auth.poly1305, plain, input, (word32)msgLen, nonce, + input + msgLen, add, (word32)addSz); + ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */ + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ); + #endif + if (ret != 0) { + if (ret == WC_NO_ERR_TRACE(MAC_CMP_FAILED_E)) { + WOLFSSL_MSG("MAC did not match"); + if (!ssl->options.dtls) + SendAlert(ssl, alert_fatal, bad_record_mac); + WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR); + return VERIFY_MAC_ERROR; + } return ret; } } - ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */ -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); -#endif - - /* check tag sent along with packet */ - if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) { - WOLFSSL_MSG("MAC did not match"); - if (!ssl->options.dtls) - SendAlert(ssl, alert_fatal, bad_record_mac); - WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR); - return VERIFY_MAC_ERROR; - } - - /* if the tag was good decrypt message */ - if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain, - input, (word32)msgLen)) != 0) - return ret; #ifdef CHACHA_AEAD_TEST printf("plain after decrypt :\n"); diff --git a/src/tls13.c b/src/tls13.c index b8c7dbbc912..2767e2c0ab5 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -2513,49 +2513,11 @@ static int ChaCha20Poly1305_Encrypt(WOLFSSL* ssl, byte* output, const byte* input, word16 sz, byte* nonce, const byte* aad, word16 aadSz, byte* tag) { - int ret = 0; - byte poly[CHACHA20_256_KEY_SIZE]; - - /* Poly1305 key is 256 bits of zero encrypted with ChaCha20. */ - XMEMSET(poly, 0, sizeof(poly)); - - /* Set the nonce for ChaCha and get Poly1305 key. */ - ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0); - if (ret != 0) - return ret; - /* Create Poly1305 key using ChaCha20 keystream. */ - ret = wc_Chacha_Process(ssl->encrypt.chacha, poly, poly, sizeof(poly)); - if (ret != 0) - return ret; -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Add("ChaCha20Poly1305_Encrypt poly", poly, sizeof(poly)); -#endif - ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1); - if (ret != 0) - return ret; - /* Encrypt the plain text. */ - ret = wc_Chacha_Process(ssl->encrypt.chacha, output, input, sz); - if (ret != 0) { - ForceZero(poly, sizeof(poly)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(poly, sizeof(poly)); - #endif - return ret; - } - - /* Set key for Poly1305. */ - ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, sizeof(poly)); - ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */ -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(poly, sizeof(poly)); -#endif - if (ret != 0) - return ret; - /* Add authentication code of encrypted data to end. */ - ret = wc_Poly1305_MAC(ssl->auth.poly1305, aad, aadSz, output, sz, tag, - POLY1305_AUTH_SZ); - - return ret; + /* Persistent-key stitched helper: derives the per-record Poly1305 key from + * the keyed ChaCha, then encrypts and authenticates in one pass (the IFMA + * stitch for large records, else two-pass). TLS 1.3 is always RFC 8439. */ + return wc_ChaCha20Poly1305_Encrypt_ex(ssl->encrypt.chacha, + ssl->auth.poly1305, output, input, sz, nonce, tag, aad, aadSz); } #endif @@ -2901,55 +2863,17 @@ static int ChaCha20Poly1305_Decrypt(WOLFSSL* ssl, byte* output, const byte* tagIn) { int ret; - byte tag[POLY1305_AUTH_SZ]; - byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */ - - /* Poly1305 key is 256 bits of zero encrypted with ChaCha20. */ - XMEMSET(poly, 0, sizeof(poly)); - - /* Set nonce and get Poly1305 key. */ - ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0); - if (ret != 0) - return ret; - /* Use ChaCha20 keystream to get Poly1305 key for tag. */ - ret = wc_Chacha_Process(ssl->decrypt.chacha, poly, poly, sizeof(poly)); - if (ret != 0) - return ret; -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Add("ChaCha20Poly1305_Decrypt poly", poly, sizeof(poly)); -#endif - ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1); - if (ret != 0) { - ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */ - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(poly, sizeof(poly)); - #endif - return ret; - } - /* Set key for Poly1305. */ - ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, sizeof(poly)); - ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */ -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(poly, sizeof(poly)); -#endif - if (ret != 0) - return ret; - /* Generate authentication tag for encrypted data. */ - if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, aad, aadSz, input, sz, tag, - sizeof(tag))) != 0) { - return ret; - } - - /* Check tag sent along with packet. */ - if (ConstantCompare(tagIn, tag, POLY1305_AUTH_SZ) != 0) { + /* Persistent-key stitched helper: verifies the Poly1305 tag over + * aad+ciphertext and decrypts in one pass (the IFMA decrypt stitch for + * large records, else two-pass); it zeroes output on tag mismatch. */ + ret = wc_ChaCha20Poly1305_Decrypt_ex(ssl->decrypt.chacha, + ssl->auth.poly1305, output, input, sz, nonce, tagIn, aad, aadSz); + if (ret == WC_NO_ERR_TRACE(MAC_CMP_FAILED_E)) { WOLFSSL_MSG("MAC did not match"); - return VERIFY_MAC_ERROR; + ret = VERIFY_MAC_ERROR; } - /* If the tag was good decrypt message. */ - ret = wc_Chacha_Process(ssl->decrypt.chacha, output, input, sz); - return ret; } #endif diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 85ae3beca74..a82c519afa2 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -7633,6 +7633,9 @@ void bench_chacha20_poly1305_aead(void) { double start; int ret = 0, i, count; + ChaCha chacha; /* keyed once, reused per record: the TLS-record path */ + Poly1305 poly; + byte nonce[CHACHA20_POLY1305_AEAD_IV_SIZE]; DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); @@ -7644,7 +7647,9 @@ void bench_chacha20_poly1305_aead(void) WC_ALLOC_VAR(authTag, byte, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE, HEAP_HINT); XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ); XMEMSET(authTag, 0, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE); + XMEMSET(nonce, 0, sizeof(nonce)); + /* One-shot encrypt (re-keys per call). */ bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { @@ -7664,7 +7669,162 @@ void bench_chacha20_poly1305_aead(void) #endif ); - bench_stats_sym_finish("CHA-POLY", 0, count, bench_size, start, ret); + bench_stats_sym_finish("CHA-POLY-enc", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + RESET_MULTI_VALUE_STATS_VARS(); + + /* Produce a valid ciphertext+tag once for the decrypt benchmarks. */ + ret = wc_ChaCha20Poly1305_Encrypt(bench_key, bench_iv, bench_additional, + aesAuthAddSz, bench_plain, bench_size, bench_cipher, authTag); + if (ret < 0) { + printf("wc_ChaCha20Poly1305_Encrypt error: %d\n", ret); + goto exit; + } + + /* One-shot verify+decrypt. */ + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_ChaCha20Poly1305_Decrypt(bench_key, bench_iv, + bench_additional, aesAuthAddSz, bench_cipher, bench_size, + authTag, bench_plain); + if (ret < 0) { + printf("wc_ChaCha20Poly1305_Decrypt error: %d\n", ret); + goto exit; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("CHA-POLY-dec", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + RESET_MULTI_VALUE_STATS_VARS(); + + /* TLS-record path: ChaCha keyed once, only the nonce varies per record; + * Encrypt_ex/Decrypt_ex use the single-pass stitch (no per-record + * re-key). */ + ret = wc_Chacha_SetKey(&chacha, bench_key, + CHACHA20_POLY1305_AEAD_KEYSIZE); + if (ret != 0) { + printf("wc_Chacha_SetKey error: %d\n", ret); + goto exit; + } + + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_ChaCha20Poly1305_Encrypt_ex(&chacha, &poly, bench_cipher, + bench_plain, bench_size, nonce, authTag, bench_additional, + aesAuthAddSz); + if (ret < 0) { + printf("wc_ChaCha20Poly1305_Encrypt_ex error: %d\n", ret); + goto exit; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("CHA-POLY-ex-enc", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + RESET_MULTI_VALUE_STATS_VARS(); + + /* Valid ciphertext+tag for the Decrypt_ex benchmark. */ + ret = wc_ChaCha20Poly1305_Encrypt_ex(&chacha, &poly, bench_cipher, + bench_plain, bench_size, nonce, authTag, bench_additional, + aesAuthAddSz); + if (ret < 0) { + printf("wc_ChaCha20Poly1305_Encrypt_ex error: %d\n", ret); + goto exit; + } + + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_ChaCha20Poly1305_Decrypt_ex(&chacha, &poly, bench_plain, + bench_cipher, bench_size, nonce, authTag, bench_additional, + aesAuthAddSz); + if (ret < 0) { + printf("wc_ChaCha20Poly1305_Decrypt_ex error: %d\n", ret); + goto exit; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("CHA-POLY-ex-dec", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + RESET_MULTI_VALUE_STATS_VARS(); + + /* Streaming AEAD interface over the FUSED stitch, "openssl speed -aead" + * methodology: Init once (framing amortized), then loop UpdateData with the + * whole buffer and NO per-chunk tag/Final. wc_ChaCha20Poly1305_UpdateData + * dispatches to the single-pass IFMA stitch for each 1024-aligned chunk + * (>= CHACHA20_POLY1305_STITCH_MIN), so this is wolfSSL's fused cipher + * throughput measured the same bare-loop way OpenSSL's cipher is - unlike a + * two-pass Process+Update, and reachable through the public API. Below the + * stitch threshold (or a non-64-aligned bench_size) UpdateData stays + * two-pass, which is the interface's real behaviour. Re-Init before the + * running dataLen would overflow CHACHA20_POLY1305_MAX. */ + { + ChaChaPoly_Aead sAead; + XMEMSET(&sAead, 0, sizeof(sAead)); + ret = wc_ChaCha20Poly1305_Init(&sAead, bench_key, nonce, 1); + if (ret != 0) { + printf("chacha20-poly1305 stream Init error: %d\n", ret); + goto exit; + } + + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + if (sAead.dataLen > CHACHA20_POLY1305_MAX - bench_size) { + XMEMSET(&sAead, 0, sizeof(sAead)); + ret = wc_ChaCha20Poly1305_Init(&sAead, bench_key, nonce, 1); + if (ret != 0) { + printf("chacha20-poly1305 stream Init error: %d\n", ret); + goto exit; + } + } + ret = wc_ChaCha20Poly1305_UpdateData(&sAead, bench_plain, + bench_cipher, bench_size); + if (ret < 0) { + printf("chacha20-poly1305 stream error: %d\n", ret); + goto exit; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("CHA-POLY-stream", 0, count, bench_size, start, ret); + } #ifdef MULTI_VALUE_STATISTICS bench_multi_value_stats(max, min, sum, squareSum, runs); #endif diff --git a/wolfcrypt/src/chacha.c b/wolfcrypt/src/chacha.c index bc4ec134ecf..01c746b7c4b 100644 --- a/wolfcrypt/src/chacha.c +++ b/wolfcrypt/src/chacha.c @@ -100,6 +100,13 @@ Public domain. #ifndef NO_AVX2_SUPPORT #define HAVE_INTEL_AVX2 #endif + #if !defined(NO_AVX512_SUPPORT) && !defined(HAVE_INTEL_AVX512) + #define HAVE_INTEL_AVX512 + #endif + /* SSSE3 is the baseline SIMD path, used on CPUs that lack AVX. */ + #ifndef HAVE_INTEL_SSSE3 + #define HAVE_INTEL_SSSE3 + #endif static cpuid_flags_t cpuidFlags = WC_CPUID_INITIALIZER; #endif @@ -303,11 +310,53 @@ extern void chacha_encrypt_avx1(ChaCha* ctx, const byte* m, byte* c, word32 bytes); extern void chacha_encrypt_avx2(ChaCha* ctx, const byte* m, byte* c, word32 bytes); +extern void chacha_encrypt_avx512(ChaCha* ctx, const byte* m, byte* c, + word32 bytes); +extern void chacha_encrypt_avx512vl(ChaCha* ctx, const byte* m, byte* c, + word32 bytes); +/* Not exported (WOLFSSL_LOCAL/hidden): its _sse3 (SSSE3) suffix is not in the + * symbol-prefix allowlist, and internal asm helpers should not be exported. */ +WOLFSSL_LOCAL void chacha_encrypt_sse3(ChaCha* ctx, const byte* m, byte* c, + word32 bytes); #ifdef __cplusplus } /* extern "C" */ #endif +#if defined(USE_INTEL_CHACHA_SPEEDUP) && defined(HAVE_INTEL_AVX512) +/* Decide whether to use the 512-bit (zmm) ChaCha path for this CPU. + * + * The zmm path processes 16 blocks at a time and is the fastest option on + * microarchitectures that run 512-bit code at full clock: AMD Zen 4/5 (no + * AVX-512 license) and Intel Ice Lake and later. On Intel Skylake-SP / + * Cascade Lake-class parts, sustained 512-bit instructions trip the AVX-512 + * frequency license and downclock the core - enough that the 256-bit AVX2 path + * is faster in practice (this matches OpenSSL, which suppresses its 16x zmm + * ChaCha there, and the Linux kernel, which uses only 256-bit AVX-512VL). + * + * There is no direct "does this core downclock" CPUID bit, so VAES presence is + * used as a generational proxy: the throttling parts (Skylake-SP / Skylake-X / + * Cascade Lake) predate VAES, whereas every microarchitecture that runs 512-bit + * without penalty (AMD Zen 4/5, Intel Ice Lake+) implements it. A missing VAES + * only costs a little throughput (fall back to AVX2), never correctness. + * + * Override the heuristic with: + * WOLFSSL_CHACHA20_AVX512_ALWAYS - use zmm whenever AVX-512 is present + * WOLFSSL_CHACHA20_AVX512_NEVER - never use zmm (always AVX2 or below) + */ +static WC_INLINE int chacha_avx512_beneficial(cpuid_flags_t flags) +{ +#if defined(WOLFSSL_CHACHA20_AVX512_NEVER) + (void)flags; + return 0; +#elif defined(WOLFSSL_CHACHA20_AVX512_ALWAYS) + return IS_INTEL_AVX512(flags) != 0; +#else + return (IS_INTEL_AVX512(flags) != 0) && (IS_INTEL_VAES(flags) != 0); +#endif +} +#endif /* USE_INTEL_CHACHA_SPEEDUP && HAVE_INTEL_AVX512 */ + #if (!defined(USE_INTEL_CHACHA_SPEEDUP) && !defined(USE_ARM_CHACHA_SPEEDUP) && \ !defined(USE_RISCV_CHACHA_SPEEDUP)) || defined(WOLFSSL_ARM_CHACHA_NEED_C) @@ -390,6 +439,73 @@ int wc_Chacha_Process(ChaCha* ctx, byte* output, const byte* input, cpuid_get_flags_ex(&cpuidFlags); + /* One block or less. */ +#if defined(HAVE_INTEL_AVX1) && !defined(WOLFSSL_LINUXKM) + /* In userspace SAVE_VECTOR_REGISTERS is free, so a single AVX block (~285 + * cyc) beats the scalar block (~435) - e.g. the per-record Poly1305 key + * derivation (a 32-byte ChaCha) in the ChaCha20-Poly1305 two-pass path. + * The AVX-512VL path already uses SIMD for one block; match that here. */ + if (msglen <= CHACHA_CHUNK_BYTES && IS_INTEL_AVX512VL(cpuidFlags) == 0 && + IS_INTEL_AVX1(cpuidFlags)) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); + chacha_encrypt_avx1(ctx, input, output, msglen); + RESTORE_VECTOR_REGISTERS(); + return 0; + } +#endif + /* At most one block: the scalar path avoids the SIMD broadcast/transpose + * setup and (in the Linux kernel module) the costly vector-register + * save/restore. */ + if (msglen <= CHACHA_CHUNK_BYTES) { + chacha_encrypt_x64(ctx, input, output, msglen); + return 0; + } + + /* 65..255 bytes without AVX-512VL: use the SSSE3 128-bit exact-block path. + * It is ~1.8x the scalar path and beats the 8-block AVX2 kernel (which + * always emits a full 512-byte key stream) below 256 bytes - e.g. a + * 192-byte key stream is 735 vs 1335 (scalar) vs 836 (AVX2) cycles on + * Coffee Lake. This is the ChaCha20-Poly1305 short-record hot path (poly + * key + <=2 data blocks). At >=256 bytes the four-block AVX2/AVX1 kernels + * take over below. */ +#ifdef HAVE_INTEL_SSSE3 + if (IS_INTEL_AVX512VL(cpuidFlags) == 0 && + msglen < 4 * CHACHA_CHUNK_BYTES && + IS_INTEL_SSSE3(cpuidFlags)) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); + chacha_encrypt_sse3(ctx, input, output, msglen); + RESTORE_VECTOR_REGISTERS(); + return 0; + } +#endif + if (IS_INTEL_AVX512VL(cpuidFlags) == 0 && + msglen < 4 * CHACHA_CHUNK_BYTES) { + chacha_encrypt_x64(ctx, input, output, msglen); + return 0; + } + + #ifdef HAVE_INTEL_AVX512 + /* Below one 16-block chunk (1024 bytes) the zmm path does no work and + * just tail-calls AVX2, so dispatch straight to AVX2 for smaller input. */ + if (chacha_avx512_beneficial(cpuidFlags) && + msglen >= 16 * CHACHA_CHUNK_BYTES) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); + chacha_encrypt_avx512(ctx, input, output, msglen); + RESTORE_VECTOR_REGISTERS(); + return 0; + } + /* Everything below the AVX2 512-byte minimum (1..511 bytes) is handled by + * the AVX-512VL path itself - whole 256-byte four-block chunks plus a + * partial four-block tail - using single-instruction vprold rotations on + * 128-bit registers (no AVX-512 frequency penalty). It does not fall back + * to any other implementation. */ + if (IS_INTEL_AVX512VL(cpuidFlags) && msglen < 8 * CHACHA_CHUNK_BYTES) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); + chacha_encrypt_avx512vl(ctx, input, output, msglen); + RESTORE_VECTOR_REGISTERS(); + return 0; + } + #endif #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(cpuidFlags)) { SAVE_VECTOR_REGISTERS(return _svr_ret;); @@ -404,6 +520,14 @@ int wc_Chacha_Process(ChaCha* ctx, byte* output, const byte* input, RESTORE_VECTOR_REGISTERS(); return 0; } + #ifdef HAVE_INTEL_SSSE3 + else if (IS_INTEL_SSSE3(cpuidFlags)) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); + chacha_encrypt_sse3(ctx, input, output, msglen); + RESTORE_VECTOR_REGISTERS(); + return 0; + } + #endif else { chacha_encrypt_x64(ctx, input, output, msglen); return 0; diff --git a/wolfcrypt/src/chacha20_poly1305.c b/wolfcrypt/src/chacha20_poly1305.c index 5a7ebd978b9..510e2139a4f 100644 --- a/wolfcrypt/src/chacha20_poly1305.c +++ b/wolfcrypt/src/chacha20_poly1305.c @@ -32,6 +32,7 @@ or Authenticated Encryption with Additional Data (AEAD) algorithm. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) #include +#include #ifdef NO_INLINE #include @@ -41,6 +42,558 @@ or Authenticated Encryption with Additional Data (AEAD) algorithm. #endif #define CHACHA20_POLY1305_AEAD_INITIAL_COUNTER 0 + +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED +/* Fused single-pass encrypt kernel (in chacha_asm.S) and the 4-way power + * precompute it depends on. */ +#ifdef __cplusplus +extern "C" { +#endif +WOLFSSL_LOCAL void chacha20_poly1305_avx512(ChaCha* chacha, Poly1305* poly, + const byte* m, byte* c, word32 bytes); +WOLFSSL_LOCAL void poly1305_calc_powers_avx2(Poly1305* ctx); +#ifdef __cplusplus +} +#endif + +/* The fused kernel uses 4-block ChaCha (256-bit) + 4-way Poly1305, which beats + * the wide two-pass only where 512-bit code is throttled - Intel Ice Lake and + * later, under the AVX-512 frequency license. On AMD (no throttle, very fast + * wide primitives) the two-pass wins, so gate on an Intel vendor. Override: + * WOLFSSL_CHACHA20_POLY1305_FUSED_ALWAYS / _NEVER. */ +static WC_INLINE int chacha20_poly1305_use_fused(void) +{ +#if defined(WOLFSSL_CHACHA20_POLY1305_FUSED_NEVER) + return 0; +#elif defined(WOLFSSL_CHACHA20_POLY1305_FUSED_ALWAYS) + return 1; +#else + cpuid_flags_t f = cpuid_get_flags(); + return (IS_CPU_INTEL(f) != 0) && (IS_INTEL_AVX512(f) != 0); +#endif +} + +/* Encrypt with the fused kernel: no AAD, so Poly1305 starts clean and 256-byte + * aligned. Drive Poly1305 4-way (forceAvx2) so the kernel and the tail/final + * share the layout; the kernel does the aligned bulk, the tail and length + * framing go through the normal 4-way path. */ +static int chacha20_poly1305_encrypt_fused(ChaChaPoly_Aead* aead, + const byte* pt, word32 ptLen, byte* ct, byte* tag) +{ + word32 bulk = ptLen & ~(word32)0xff; + int ret; + + aead->poly.forceAvx2 = 1; + /* The cpuid setkey may have zeroed a different accumulator; ready the 4-way + * hash and let the kernel initialise the lanes. */ + XMEMSET(aead->poly.hh, 0, sizeof(aead->poly.hh)); + aead->poly.started = 0; + aead->poly.leftover = 0; + aead->state = CHACHA20_POLY1305_STATE_DATA; + + SAVE_VECTOR_REGISTERS(return _svr_ret;); + poly1305_calc_powers_avx2(&aead->poly); + aead->poly.started = 1; + chacha20_poly1305_avx512(&aead->chacha, &aead->poly, pt, ct, bulk); + RESTORE_VECTOR_REGISTERS(); + + aead->dataLen = bulk; + ret = 0; + if (ptLen > bulk) + ret = wc_ChaCha20Poly1305_UpdateData(aead, pt + bulk, ct + bulk, + ptLen - bulk); + if (ret == 0) + ret = wc_ChaCha20Poly1305_Final(aead, tag); + + return ret; +} +#endif /* WOLFSSL_CHACHA20_POLY1305_FUSED */ + +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA +/* IFMA stitched single-pass encrypt kernel (in chacha_asm.S): full 512-bit + * 16-block ChaCha interleaved with an 8-way IFMA (vpmadd52) Poly1305 that + * collapses to the scalar hash. Processes 1024-byte units. Depends on the + * radix-2^44 powers. */ +#ifdef __cplusplus +extern "C" { +#endif +WOLFSSL_LOCAL void chacha20_poly1305_ifma(ChaCha* chacha, Poly1305* poly, + const byte* m, byte* c, word32 bytes); +/* Decrypt counterpart: hashes the ciphertext INPUT (m) as it decrypts to c + * (in-place safe - m is hashed before it is overwritten). Same 1024-byte + * units and radix-2^44 powers. */ +WOLFSSL_LOCAL void chacha20_poly1305_ifma_decrypt(ChaCha* chacha, + Poly1305* poly, const byte* m, byte* c, word32 bytes); +WOLFSSL_LOCAL void poly1305_calc_powers_avx512ifma(Poly1305* ctx); +/* ctx->h = ctx->hh * r^nBlocks + ctx->h - advances the running hash (saved by + * the kernel to ctx->hh) past a chunk the kernel hashed from zero into ctx->h. + * Radix-2^64 scalar, so no 26<->64 conversions. */ +WOLFSSL_LOCAL void poly1305_fold_avx512ifma(Poly1305* ctx, word32 nBlocks); +#ifdef __cplusplus +} +#endif + +/* Minimum length to stitch. The kernel processes 1024-byte units and a + * once-per-op power precompute, and any sub-1024 remainder is authenticated by + * the slower scalar Poly1305; below this the two-pass wins (measured crossover + * on Zen5). Above it the stitch wins 1.1-1.4x, growing with size. */ +#ifndef CHACHA20_POLY1305_STITCH_MIN +#define CHACHA20_POLY1305_STITCH_MIN 4096 +#endif + +/* Short-message fused path: for messages this small the Poly1305 key block + * (ChaCha counter 0) and the whole ciphertext (counter 1+) fit in a single + * ChaCha keystream generation - one pass instead of two - and a scalar + * Poly1305 avoids the vector power-precompute cost. Needs the forceScalar + * flag (same builds as the fused kernels). Measured 1.1-1.5x on Zen5 for + * 64-192 byte records; above SHORT_MAX the poly key spills to a second ChaCha + * chunk and the saving is gone. */ +#if defined(WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA) && \ + !defined(WOLFSSL_NO_CHACHA20_POLY1305_SHORT) + #define WOLFSSL_CHACHA20_POLY1305_SHORT + #ifndef CHACHA20_POLY1305_SHORT_MAX + /* 64 (poly-key block) + 192 = 256 = one AVX-512VL 4-block chunk */ + #define CHACHA20_POLY1305_SHORT_MAX 192 + #endif +#endif + +/* The IFMA stitch runs a full-width 512-bit 16-block ChaCha interleaved with an + * 8-way IFMA Poly1305: ChaCha is the bottleneck and Poly hides under it, so it + * beats the two-pass (which runs the two passes back to back) by ~1.3-1.4x at + * >=16KB - measured on AMD Zen5, and expected wherever AVX-512 + IFMA exist + * (both use 512-bit ChaCha, so any frequency throttle hits both equally). Gate + * on AVX-512 + IFMA, any vendor. Override: ..._FUSED_IFMA_ALWAYS / _NEVER. */ +static WC_INLINE int chacha20_poly1305_use_fused_ifma(void) +{ +#if defined(WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA_NEVER) + return 0; +#elif defined(WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA_ALWAYS) + return 1; +#else + cpuid_flags_t f = cpuid_get_flags(); + return (IS_INTEL_AVX512(f) != 0) && (IS_INTEL_AVX512_IFMA(f) != 0); +#endif +} + +/* Stitch one 1024-byte-aligned bulk. (IFMA path) The kernel hashes this + * chunk's ciphertext from zero (leaving ctx->h = H_chunk) and advances the + * ChaCha counter, saving the running hash (the AAD, or previous chunks) to + * ctx->hh; poly1305_fold_avx512ifma then advances that hash past this chunk + * (ctx->h = ctx->hh * r^nBlocks + H_chunk). Powers are computed once (started + * flag). Caller must have ctx->h = running hash, leftover == 0, forceScalar + * and finished set, and the ChaCha counter placed for this chunk. decrypt: in + * is ciphertext, out is plaintext (in-place safe - the kernel hashes in before + * overwriting it); the hash math is identical. */ +static int chacha20_poly1305_stitch_chunk(ChaCha* chacha, Poly1305* poly, + const byte* in, byte* out, word32 bulk, int decrypt) +{ + int fold; + + /* A running hash (AAD or previous chunks) must be folded past this chunk; + * detect it before the kernel overwrites poly->h with this chunk's hash. */ + fold = (poly->h[0] | poly->h[1] | poly->h[2]) != 0; + + SAVE_VECTOR_REGISTERS(return _svr_ret;); + if (!poly->started) { + poly1305_calc_powers_avx512ifma(poly); + poly->started = 1; + } + if (decrypt) + chacha20_poly1305_ifma_decrypt(chacha, poly, in, out, bulk); + else + chacha20_poly1305_ifma(chacha, poly, in, out, bulk); + RESTORE_VECTOR_REGISTERS(); + + /* poly->h = H_chunk, poly->hh = running hash (scalar fold, no vectors). */ + if (fold) + poly1305_fold_avx512ifma(poly, bulk / 16); + return 0; +} + +/* Encrypt the whole message with the IFMA stitch (one-shot path). AAD is + * hashed scalar into ctx->h, the 1024-aligned bulk is stitched (folding AAD + * through it), the tail + length framing go through the scalar path. + * forceScalar/finished: see the AVX2 fused note (setkey_avx2 leaves finished + * clear). Both this and the streaming UpdateData path share stitch_chunk(). */ +static int chacha20_poly1305_encrypt_fused_ifma(ChaChaPoly_Aead* aead, + const byte* aad, word32 aadLen, const byte* pt, word32 ptLen, byte* ct, + byte* tag) +{ + word32 bulk = ptLen & ~(word32)0x3ff; + int ret = 0; + + aead->poly.forceScalar = 1; + XMEMSET(aead->poly.h, 0, sizeof(aead->poly.h)); + aead->poly.finished = 1; + aead->poly.leftover = 0; + aead->poly.started = 0; + + /* Hash AAD + pad1 (scalar) -> H_aad in ctx->h. */ + if (aadLen > 0) { + ret = wc_Poly1305Update(&aead->poly, aad, aadLen); + if (ret == 0) + ret = wc_Poly1305_Pad(&aead->poly, aadLen); + } + aead->aadLen = aadLen; + aead->state = CHACHA20_POLY1305_STATE_DATA; + + if (ret == 0) + ret = chacha20_poly1305_stitch_chunk(&aead->chacha, &aead->poly, pt, + ct, bulk, 0); + if (ret == 0) { + aead->dataLen = bulk; + if (ptLen > bulk) + ret = wc_ChaCha20Poly1305_UpdateData(aead, pt + bulk, ct + bulk, + ptLen - bulk); + if (ret == 0) + ret = wc_ChaCha20Poly1305_Final(aead, tag); + } + return ret; +} +#endif /* WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA */ + +#ifdef WOLFSSL_CHACHA20_POLY1305_SHORT + +#if defined(USE_INTEL_SPEEDUP) && defined(WOLFSSL_X86_64_BUILD) && \ + !defined(WOLFSSL_NO_CHACHA20_POLY1305_SMALL_ASM) +#define WOLFSSL_CP_SMALL_ASM + +/* Fused single-call ChaCha20-Poly1305 encrypt for a one-block (<=64 byte) + * record (in chacha_asm.S): SSSE3 crypt2 produces the Poly1305 key block and + * the single data block together; the scalar poly1305_*_avx do the MAC. */ +#ifdef __cplusplus +extern "C" { +#endif +WOLFSSL_LOCAL void chacha20_poly1305_small_enc(ChaCha* chacha, Poly1305* poly, + const byte* m, byte* c, word32 mLen, const byte* aad, word32 aadLen, + byte* tag); +/* Decrypt twin: decrypts in->out AND verifies the tag in one pass (decrypt- + * then-verify). Constant-time-compares the computed tag against the received + * tag internally and returns 0 on match, 1 on mismatch; the caller ForceZeros + * the output on mismatch, so no plaintext is released on a bad tag. */ +WOLFSSL_LOCAL int chacha20_poly1305_small_dec(ChaCha* chacha, Poly1305* poly, + const byte* in, byte* out, word32 ctLen, const byte* aad, word32 aadLen, + const byte* tag); +#ifdef __cplusplus +} +#endif + +static WC_INLINE int chacha20_poly1305_use_small(void) +{ + return IS_INTEL_AVX2(cpuid_get_flags()) != 0; +} +#endif + +/* Fused short-message (sz <= CHACHA20_POLY1305_SHORT_MAX) encrypt for the + * pre-keyed contexts: derive the Poly1305 key (counter 0) and the encryption + * keystream (counter 1+) in a SINGLE ChaCha pass, then scalar-hash. Saves the + * second ChaCha invocation the two-pass path would make. */ +static int chacha20_poly1305_encrypt_short(ChaCha* chacha, Poly1305* poly, + byte* out, const byte* in, word32 sz, const byte* nonce, byte* tag, + const byte* aad, word32 aadSz) +{ + byte ks[64 + CHACHA20_POLY1305_SHORT_MAX]; + int ret; + +#ifdef WOLFSSL_CP_SMALL_ASM + /* One block or less of data: the fused single-call kernel. */ + if (sz <= 64 && chacha20_poly1305_use_small()) { + ret = wc_Chacha_SetIV(chacha, nonce, + CHACHA20_POLY1305_AEAD_INITIAL_COUNTER); + if (ret == 0) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); + chacha20_poly1305_small_enc(chacha, poly, in, out, sz, aad, aadSz, + tag); + RESTORE_VECTOR_REGISTERS(); + } + return ret; + } +#endif + + XMEMSET(ks, 0, 64 + sz); + ret = wc_Chacha_SetIV(chacha, nonce, + CHACHA20_POLY1305_AEAD_INITIAL_COUNTER); + if (ret == 0) /* ctr0 (poly key) .. ctrN, one pass */ + ret = wc_Chacha_Process(chacha, ks, ks, 64 + sz); + if (ret == 0) + ret = wc_Poly1305SetKey(poly, ks, CHACHA20_POLY1305_AEAD_KEYSIZE); + if (ret == 0) { + xorbufout(out, in, ks + 64, sz); /* ct = pt ^ keystream (ctr1+) */ + poly->forceScalar = 1; + poly->finished = 1; + ret = wc_Poly1305_MAC(poly, aad, aadSz, out, sz, tag, + CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE); + } + ForceZero(ks, 64 + sz); /* ks[0:32] was the poly key */ + return ret; +} + +/* Fused short-message decrypt twin: derive key + keystream in one ChaCha pass, + * MAC the ciphertext INPUT and verify the tag BEFORE decrypting, so no + * plaintext is produced on a bad tag (stronger than the stitch, cheap here + * because the message is small). In-place safe. */ +static int chacha20_poly1305_decrypt_short(ChaCha* chacha, Poly1305* poly, + byte* out, const byte* in, word32 sz, const byte* nonce, const byte* tag, + const byte* aad, word32 aadSz) +{ + byte ks[64 + CHACHA20_POLY1305_SHORT_MAX]; + byte calcTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]; + int ret; + +#ifdef WOLFSSL_CP_SMALL_ASM + /* One block or less of data: the fused single-call kernel decrypts in->out + * and computes calcTag in one pass (decrypt-then-verify). Zero the output + * if the tag is bad, so no plaintext is released. */ + if (sz <= 64 && chacha20_poly1305_use_small()) { + ret = wc_Chacha_SetIV(chacha, nonce, + CHACHA20_POLY1305_AEAD_INITIAL_COUNTER); + if (ret == 0) { + int bad; + SAVE_VECTOR_REGISTERS(return _svr_ret;); + bad = chacha20_poly1305_small_dec(chacha, poly, in, out, sz, aad, + aadSz, tag); + RESTORE_VECTOR_REGISTERS(); + if (bad) { /* bad tag: no plaintext */ + if (sz > 0) + ForceZero(out, sz); + ret = MAC_CMP_FAILED_E; + } + } + (void)calcTag; + return ret; + } +#endif + + XMEMSET(ks, 0, 64 + sz); + ret = wc_Chacha_SetIV(chacha, nonce, + CHACHA20_POLY1305_AEAD_INITIAL_COUNTER); + if (ret == 0) + ret = wc_Chacha_Process(chacha, ks, ks, 64 + sz); + if (ret == 0) + ret = wc_Poly1305SetKey(poly, ks, CHACHA20_POLY1305_AEAD_KEYSIZE); + if (ret == 0) { + poly->forceScalar = 1; + poly->finished = 1; + ret = wc_Poly1305_MAC(poly, aad, aadSz, in, sz, calcTag, + CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE); + } + if (ret == 0) + ret = wc_ChaCha20Poly1305_CheckTag(tag, calcTag); + if (ret == 0) /* tag good: decrypt pt = ct ^ ks */ + xorbufout(out, in, ks + 64, sz); + else if (sz > 0) /* bad tag/error: no stale output */ + ForceZero(out, sz); + ForceZero(ks, 64 + sz); + return ret; +} +#endif /* WOLFSSL_CHACHA20_POLY1305_SHORT */ + +/* Encrypt + authenticate one message with PRE-KEYED ChaCha20 and Poly1305 + * contexts - the ChaCha20-Poly1305 analogue of wc_AesGcmEncrypt on a keyed Aes. + * Intended for the TLS record layer, which keeps the ChaCha context keyed once + * (per traffic key) and only varies the nonce per record. The per-record + * Poly1305 key is derived here from the ChaCha keystream. Uses the single-pass + * IFMA stitch when beneficial, else the two-pass; identical output either way. + * + * chacha ChaCha20 context with the key already set (wc_Chacha_SetKey) + * poly Poly1305 scratch context (re-keyed here every call) + * out ciphertext out (may alias in) + * in/sz plaintext / length + * nonce CHACHA20_POLY1305_AEAD_IV_SIZE (12) byte record nonce + * tag CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE (16) byte tag out + * aad/aadSz additional authenticated data + * returns 0 on success, negative on error. + */ +WOLFSSL_API int wc_ChaCha20Poly1305_Encrypt_ex(ChaCha* chacha, Poly1305* poly, + byte* out, const byte* in, word32 sz, const byte* nonce, byte* tag, + const byte* aad, word32 aadSz) +{ + byte polyKey[CHACHA20_POLY1305_AEAD_KEYSIZE]; + int ret; + + if (chacha == NULL || poly == NULL || nonce == NULL || tag == NULL || + (sz > 0 && (in == NULL || out == NULL)) || + (aadSz > 0 && aad == NULL)) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_CHACHA20_POLY1305_SHORT + if (sz <= CHACHA20_POLY1305_SHORT_MAX) + return chacha20_poly1305_encrypt_short(chacha, poly, out, in, sz, + nonce, tag, aad, aadSz); +#endif + + /* Per-record Poly1305 key = first 32 bytes of ChaCha20(nonce, ctr 0). */ + XMEMSET(polyKey, 0, sizeof(polyKey)); + ret = wc_Chacha_SetIV(chacha, nonce, + CHACHA20_POLY1305_AEAD_INITIAL_COUNTER); + if (ret == 0) + ret = wc_Chacha_Process(chacha, polyKey, polyKey, sizeof(polyKey)); + if (ret == 0) /* message data starts at counter 1 */ + ret = wc_Chacha_SetIV(chacha, nonce, + CHACHA20_POLY1305_AEAD_INITIAL_COUNTER + 1); + if (ret == 0) + ret = wc_Poly1305SetKey(poly, polyKey, sizeof(polyKey)); + ForceZero(polyKey, sizeof(polyKey)); + if (ret != 0) + return ret; + +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + if (sz >= CHACHA20_POLY1305_STITCH_MIN && + chacha20_poly1305_use_fused_ifma()) { + word32 bulk = sz & ~(word32)0x3ff; + /* Scalar running hash (in poly->h) so stitch and tail chain; poly->h, + * leftover and started are all zeroed by wc_Poly1305SetKey. */ + poly->forceScalar = 1; + poly->finished = 1; + if (aadSz > 0) { /* H_aad + pad1 (scalar) */ + ret = wc_Poly1305Update(poly, aad, aadSz); + if (ret == 0) + ret = wc_Poly1305_Pad(poly, aadSz); + } + if (ret == 0) /* stitch bulk + fold AAD */ + ret = chacha20_poly1305_stitch_chunk(chacha, poly, in, out, bulk, + 0); + if (ret == 0 && sz > bulk) { /* scalar tail */ + ret = wc_Chacha_Process(chacha, out + bulk, in + bulk, sz - bulk); + if (ret == 0) + ret = wc_Poly1305Update(poly, out + bulk, sz - bulk); + } + if (ret == 0) /* pad2 + lengths + tag */ + ret = wc_Poly1305_Pad(poly, sz); + if (ret == 0) + ret = wc_Poly1305_EncodeSizes(poly, aadSz, sz); + if (ret == 0) + ret = wc_Poly1305Final(poly, tag); + return ret; + } +#endif + + /* Two-pass: fast vector Poly1305 (small msgs, or stitch not beneficial). */ + ret = wc_Chacha_Process(chacha, out, in, sz); + if (ret == 0) + ret = wc_Poly1305_MAC(poly, aad, aadSz, out, sz, tag, + CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE); + return ret; +} + +/* Verify+decrypt one message with pre-keyed ChaCha20 and Poly1305 contexts - + * the decrypt counterpart of wc_ChaCha20Poly1305_Encrypt_ex, for the TLS record + * layer. Verifies the Poly1305 tag over AAD+ciphertext and decrypts to out + * (in-place safe). Uses the single-pass IFMA decrypt stitch when beneficial. + * The plaintext is produced while the tag is computed, so on tag mismatch out + * is zeroed and MAC_CMP_FAILED_E returned - callers must check the result. + * + * chacha ChaCha20 context with the key already set (wc_Chacha_SetKey) + * poly Poly1305 scratch context (re-keyed here every call) + * out plaintext out (may alias in) + * in/sz ciphertext / length + * nonce CHACHA20_POLY1305_AEAD_IV_SIZE (12) byte record nonce + * tag CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE (16) byte tag to verify + * aad/aadSz additional authenticated data + * returns 0 on success, MAC_CMP_FAILED_E on tag mismatch, else negative. + */ +WOLFSSL_API int wc_ChaCha20Poly1305_Decrypt_ex(ChaCha* chacha, Poly1305* poly, + byte* out, const byte* in, word32 sz, const byte* nonce, const byte* tag, + const byte* aad, word32 aadSz) +{ + byte polyKey[CHACHA20_POLY1305_AEAD_KEYSIZE]; + byte calcTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]; + int ret; + + if (chacha == NULL || poly == NULL || nonce == NULL || tag == NULL || + (sz > 0 && (in == NULL || out == NULL)) || + (aadSz > 0 && aad == NULL)) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_CHACHA20_POLY1305_SHORT + if (sz <= CHACHA20_POLY1305_SHORT_MAX) + return chacha20_poly1305_decrypt_short(chacha, poly, out, in, sz, + nonce, tag, aad, aadSz); +#endif + + /* Per-record Poly1305 key = first 32 bytes of ChaCha20(nonce, ctr 0). */ + XMEMSET(polyKey, 0, sizeof(polyKey)); + ret = wc_Chacha_SetIV(chacha, nonce, + CHACHA20_POLY1305_AEAD_INITIAL_COUNTER); + if (ret == 0) + ret = wc_Chacha_Process(chacha, polyKey, polyKey, sizeof(polyKey)); + if (ret == 0) /* message data starts at counter 1 */ + ret = wc_Chacha_SetIV(chacha, nonce, + CHACHA20_POLY1305_AEAD_INITIAL_COUNTER + 1); + if (ret == 0) + ret = wc_Poly1305SetKey(poly, polyKey, sizeof(polyKey)); + ForceZero(polyKey, sizeof(polyKey)); + if (ret != 0) + return ret; + +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + if (sz >= CHACHA20_POLY1305_STITCH_MIN && + chacha20_poly1305_use_fused_ifma()) { + word32 bulk = sz & ~(word32)0x3ff; + /* Scalar running hash (in poly->h) so stitch and tail chain; poly->h, + * leftover and started are all zeroed by wc_Poly1305SetKey. */ + poly->forceScalar = 1; + poly->finished = 1; + if (aadSz > 0) { /* H_aad + pad1 (scalar) */ + ret = wc_Poly1305Update(poly, aad, aadSz); + if (ret == 0) + ret = wc_Poly1305_Pad(poly, aadSz); + } + if (ret == 0) /* stitch: hash CT + decrypt */ + ret = chacha20_poly1305_stitch_chunk(chacha, poly, in, out, bulk, + 1); + if (ret == 0 && sz > bulk) { /* scalar tail */ + /* hash the ciphertext tail before decrypt overwrites it */ + ret = wc_Poly1305Update(poly, in + bulk, sz - bulk); + if (ret == 0) + ret = wc_Chacha_Process(chacha, out + bulk, in + bulk, + sz - bulk); + } + if (ret == 0) /* pad2 + lengths + tag */ + ret = wc_Poly1305_Pad(poly, sz); + if (ret == 0) + ret = wc_Poly1305_EncodeSizes(poly, aadSz, sz); + if (ret == 0) + ret = wc_Poly1305Final(poly, calcTag); + } + else +#endif + { + /* Two-pass: MAC the ciphertext (in), then decrypt in -> out. */ + ret = wc_Poly1305_MAC(poly, aad, aadSz, in, sz, calcTag, + CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE); + if (ret == 0) + ret = wc_Chacha_Process(chacha, out, in, sz); + } + + if (ret == 0) + ret = wc_ChaCha20Poly1305_CheckTag(tag, calcTag); + if (ret != 0 && sz > 0) + ForceZero(out, sz); + return ret; +} + +/* Clear a temporary ChaChaPoly_Aead. On an AVX-512/IFMA build the Poly1305 + * state carries ~320 extra bytes (r5..r8 for the 16-way poly, ifma_h for the + * IFMA stitch) that are only ever written on AVX-512-capable CPUs; on a CPU + * without AVX-512 they are never touched, so zeroing them on every call is pure + * overhead - a large fraction of a small AEAD op. Skip them there (they hold + * no key material from this call), and clear the full struct otherwise. */ +static WC_INLINE void chacha20_poly1305_aead_zero(ChaChaPoly_Aead* aead) +{ +#ifdef WOLFSSL_POLY1305_AVX512 + if (IS_INTEL_AVX512(cpuid_get_flags()) != 0) + ForceZero(aead, sizeof(ChaChaPoly_Aead)); + else + ForceZero(aead, (word32)((const byte*)&aead->poly.r5 + - (const byte*)aead)); +#else + ForceZero(aead, sizeof(ChaChaPoly_Aead)); +#endif +} + WOLFSSL_ABI int wc_ChaCha20Poly1305_Encrypt( const byte inKey[CHACHA20_POLY1305_AEAD_KEYSIZE], @@ -56,6 +609,7 @@ int wc_ChaCha20Poly1305_Encrypt( /* Validate function arguments */ if (!inKey || !inIV || (inPlaintextLen > 0 && inPlaintext == NULL) || + (inAADLen > 0 && inAAD == NULL) || !outCiphertext || !outAuthTag) { @@ -65,19 +619,61 @@ int wc_ChaCha20Poly1305_Encrypt( WC_ALLOC_VAR_EX(aead, ChaChaPoly_Aead, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER, return MEMORY_E); +#ifdef WOLFSSL_CHACHA20_POLY1305_SHORT + /* Small record: derive the Poly1305 key and the keystream in a SINGLE + * ChaCha pass (SSSE3), then scalar-hash - the same short path Encrypt_ex + * uses. Avoids wc_ChaCha20Poly1305_Init's separate scalar poly-key block + * and the second scalar data block the two-pass fallback would run. */ + if (inPlaintextLen <= CHACHA20_POLY1305_SHORT_MAX) { + ret = wc_Chacha_SetKey(&aead->chacha, inKey, + CHACHA20_POLY1305_AEAD_KEYSIZE); + if (ret == 0) + ret = chacha20_poly1305_encrypt_short(&aead->chacha, &aead->poly, + outCiphertext, inPlaintext, inPlaintextLen, inIV, outAuthTag, + inAAD, inAADLen); + } + else +#endif + { ret = wc_ChaCha20Poly1305_Init(aead, inKey, inIV, CHACHA20_POLY1305_AEAD_ENCRYPT); - if (ret == 0) - ret = wc_ChaCha20Poly1305_UpdateAad(aead, inAAD, inAADLen); - if (ret == 0) - ret = wc_ChaCha20Poly1305_UpdateData(aead, inPlaintext, outCiphertext, - inPlaintextLen); - if (ret == 0) - ret = wc_ChaCha20Poly1305_Final(aead, outAuthTag); + /* Prefer the IFMA stitch - full 512-bit ChaCha, beats the others where + * AVX-512 + IFMA exist. */ +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + if (ret == 0 && inPlaintextLen >= CHACHA20_POLY1305_STITCH_MIN && + chacha20_poly1305_use_fused_ifma()) { + ret = chacha20_poly1305_encrypt_fused_ifma(aead, inAAD, inAADLen, + inPlaintext, inPlaintextLen, outCiphertext, outAuthTag); + } + else +#endif +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED + if (ret == 0 && inAADLen == 0 && inPlaintextLen >= 256 && + chacha20_poly1305_use_fused()) { + ret = chacha20_poly1305_encrypt_fused(aead, inPlaintext, + inPlaintextLen, outCiphertext, outAuthTag); + } + else +#endif + { + /* Direct two-pass on the contexts Init already keyed (ChaCha counter is + * at 1, Poly1305 keyed). Faster than the UpdateAad/UpdateData/Final + * state machine for the common non-stitched case - in particular + * wc_Poly1305_MAC hashes the AAD inline instead of buffering it through + * UpdateAad, which is where the small-message-with-AAD cost was. */ + if (ret == 0) + ret = wc_Chacha_Process(&aead->chacha, outCiphertext, inPlaintext, + inPlaintextLen); + if (ret == 0) + ret = wc_Poly1305_MAC(&aead->poly, inAAD, inAADLen, outCiphertext, + inPlaintextLen, outAuthTag, + CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE); + } + } #ifdef WOLFSSL_SMALL_STACK if (aead != NULL) #endif - ForceZero(aead, sizeof(ChaChaPoly_Aead)); + chacha20_poly1305_aead_zero(aead); WC_FREE_VAR_EX(aead, NULL, DYNAMIC_TYPE_TMP_BUFFER); return ret; @@ -99,6 +695,7 @@ int wc_ChaCha20Poly1305_Decrypt( /* Validate function arguments */ if (!inKey || !inIV || (inCiphertextLen > 0 && inCiphertext == NULL) || + (inAADLen > 0 && inAAD == NULL) || !inAuthTag || !outPlaintext) { @@ -110,17 +707,38 @@ int wc_ChaCha20Poly1305_Decrypt( XMEMSET(calculatedAuthTag, 0, sizeof(calculatedAuthTag)); +#ifdef WOLFSSL_CHACHA20_POLY1305_SHORT + /* Small record: single ChaCha pass for poly key + keystream, MAC the + * ciphertext and verify BEFORE decrypting (no plaintext on bad tag). Same + * short path Decrypt_ex uses; avoids Init's extra scalar poly-key block. */ + if (inCiphertextLen <= CHACHA20_POLY1305_SHORT_MAX) { + ret = wc_Chacha_SetKey(&aead->chacha, inKey, + CHACHA20_POLY1305_AEAD_KEYSIZE); + if (ret == 0) + ret = chacha20_poly1305_decrypt_short(&aead->chacha, &aead->poly, + outPlaintext, inCiphertext, inCiphertextLen, inIV, inAuthTag, + inAAD, inAADLen); + } + else +#endif + { ret = wc_ChaCha20Poly1305_Init(aead, inKey, inIV, CHACHA20_POLY1305_AEAD_DECRYPT); + /* Direct two-pass on the contexts Init already keyed: MAC the ciphertext, + * verify the tag, then decrypt - verify-then-decrypt, so no plaintext is + * produced on a bad tag. Faster than the UpdateAad/UpdateData/Final state + * machine (wc_Poly1305_MAC hashes the AAD inline). In-place safe: the MAC + * reads inCiphertext before the decrypt overwrites it. */ if (ret == 0) - ret = wc_ChaCha20Poly1305_UpdateAad(aead, inAAD, inAADLen); - if (ret == 0) - ret = wc_ChaCha20Poly1305_UpdateData(aead, inCiphertext, outPlaintext, - inCiphertextLen); - if (ret == 0) - ret = wc_ChaCha20Poly1305_Final(aead, calculatedAuthTag); + ret = wc_Poly1305_MAC(&aead->poly, inAAD, inAADLen, inCiphertext, + inCiphertextLen, calculatedAuthTag, + CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE); if (ret == 0) ret = wc_ChaCha20Poly1305_CheckTag(inAuthTag, calculatedAuthTag); + if (ret == 0) + ret = wc_Chacha_Process(&aead->chacha, outPlaintext, inCiphertext, + inCiphertextLen); + } if (ret != 0) { /* zero plaintext on error */ @@ -129,7 +747,7 @@ int wc_ChaCha20Poly1305_Decrypt( #ifdef WOLFSSL_SMALL_STACK if (aead != NULL) #endif - ForceZero(aead, sizeof(ChaChaPoly_Aead)); + chacha20_poly1305_aead_zero(aead); WC_FREE_VAR_EX(aead, NULL, DYNAMIC_TYPE_TMP_BUFFER); return ret; @@ -163,7 +781,8 @@ int wc_ChaCha20Poly1305_Init(ChaChaPoly_Aead* aead, return BAD_FUNC_ARG; } - /* setup aead context */ + /* setup aead context (full clear: the aadLen/dataLen/state wrapper fields + * live after the Poly1305 member and must be initialized) */ XMEMSET(aead, 0, sizeof(ChaChaPoly_Aead)); XMEMSET(authKey, 0, sizeof(authKey)); aead->isEncrypt = isEncrypt ? 1 : 0; @@ -247,8 +866,33 @@ int wc_ChaCha20Poly1305_UpdateData(ChaChaPoly_Aead* aead, if (dataLen > CHACHA20_POLY1305_MAX - aead->dataLen) return CHACHA_POLY_OVERFLOW; +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + /* Enter scalar-stitch mode at the first data chunk when it is large enough + * to benefit and no vector Poly1305 state exists yet (started==0): any AAD + * so far is then fully buffered by the vector path. The vector buffer can + * hold >16 bytes, which the scalar path cannot resume, so re-hash the + * buffered AAD cleanly through the scalar path; the pad below finishes it. + * If the AAD was large enough to be processed by the vector path + * (started==1) we cannot switch, so it stays two-pass - no regression. + * The IFMA stitch handles both directions (decrypt hashes the ciphertext + * input). */ + if (!aead->poly.forceScalar && aead->poly.started == 0 && + aead->dataLen == 0 && dataLen >= CHACHA20_POLY1305_STITCH_MIN && + chacha20_poly1305_use_fused_ifma()) { + word32 aadN = (word32)aead->poly.leftover; + byte aadBuf[8 * POLY1305_BLOCK_SIZE]; + if (aadN > 0) + XMEMCPY(aadBuf, aead->poly.buffer, aadN); + aead->poly.forceScalar = 1; + aead->poly.finished = 1; + aead->poly.leftover = 0; + if (aadN > 0) + ret = wc_Poly1305Update(&aead->poly, aadBuf, aadN); + } +#endif + /* Pad the AAD */ - if (aead->state == CHACHA20_POLY1305_STATE_AAD) { + if (ret == 0 && aead->state == CHACHA20_POLY1305_STATE_AAD) { ret = wc_Poly1305_Pad(&aead->poly, aead->aadLen); } @@ -258,14 +902,58 @@ int wc_ChaCha20Poly1305_UpdateData(ChaChaPoly_Aead* aead, /* Perform ChaCha20 encrypt/decrypt and Poly1305 auth calc */ if (ret == 0) { if (aead->isEncrypt) { - ret = wc_Chacha_Process(&aead->chacha, outData, inData, dataLen); - if (ret == 0) - ret = wc_Poly1305Update(&aead->poly, outData, dataLen); + const byte* in = inData; + byte* out = outData; + word32 len = dataLen; +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + /* Stitch the 1024-aligned bulk (encrypt + auth in one pass) when + * the data so far is 64-byte aligned - so BOTH ChaCha (no buffered + * partial keystream) and Poly1305 (leftover==0, running hash in + * ctx->h) are at a block boundary - and we are in scalar-hash mode + * (set at Init for AVX-512+IFMA encrypt). The kernel processes + * whole blocks from the ChaCha counter, so a mid-block position + * would make it skip the buffered keystream; the 64-alignment check + * prevents that. The remainder falls through to the path below. */ + if (aead->poly.forceScalar && (aead->dataLen & 63) == 0 && + len >= CHACHA20_POLY1305_STITCH_MIN) { + word32 bulk = len & ~(word32)0x3ff; + ret = chacha20_poly1305_stitch_chunk(&aead->chacha, &aead->poly, + in, out, bulk, 0); + in += bulk; + out += bulk; + len -= bulk; + } +#endif + if (ret == 0 && len > 0) { + ret = wc_Chacha_Process(&aead->chacha, out, in, len); + if (ret == 0) + ret = wc_Poly1305Update(&aead->poly, out, len); + } } else { - ret = wc_Poly1305Update(&aead->poly, inData, dataLen); - if (ret == 0) - ret = wc_Chacha_Process(&aead->chacha, outData, inData, dataLen); + const byte* in = inData; + byte* out = outData; + word32 len = dataLen; +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + /* Stitch the 1024-aligned bulk (auth + decrypt in one pass) under + * the same conditions as encrypt. The kernel hashes the ciphertext + * (in) before overwriting it, so in-place decrypt is safe. */ + if (aead->poly.forceScalar && (aead->dataLen & 63) == 0 && + len >= CHACHA20_POLY1305_STITCH_MIN) { + word32 bulk = len & ~(word32)0x3ff; + ret = chacha20_poly1305_stitch_chunk(&aead->chacha, &aead->poly, + in, out, bulk, 1); + in += bulk; + out += bulk; + len -= bulk; + } +#endif + if (ret == 0 && len > 0) { + /* hash the ciphertext before decrypt overwrites it */ + ret = wc_Poly1305Update(&aead->poly, in, len); + if (ret == 0) + ret = wc_Chacha_Process(&aead->chacha, out, in, len); + } } } if (ret == 0) { diff --git a/wolfcrypt/src/chacha_asm.S b/wolfcrypt/src/chacha_asm.S index ba8768bd9c2..92d133ef99c 100644 --- a/wolfcrypt/src/chacha_asm.S +++ b/wolfcrypt/src/chacha_asm.S @@ -101,117 +101,105 @@ L_chacha_x64_start: movl 56(%rdi), %r14d movl 60(%rdi), %r15d movb $10, (%rsp) - movl 8(%rsp), %esi - movl 12(%rsp), %ebp L_chacha_x64_block_crypt_start: addl %r8d, %eax addl %r9d, %ebx - xorl %eax, %r12d - xorl %ebx, %r13d - roll $16, %r12d - roll $16, %r13d - addl %r12d, %esi - addl %r13d, %ebp - xorl %esi, %r8d - xorl %ebp, %r9d - roll $12, %r8d - roll $12, %r9d - addl %r8d, %eax - addl %r9d, %ebx - xorl %eax, %r12d - xorl %ebx, %r13d - roll $8, %r12d - roll $8, %r13d - addl %r12d, %esi - addl %r13d, %ebp - xorl %esi, %r8d - xorl %ebp, %r9d - roll $7, %r8d - roll $7, %r9d - movl %esi, 8(%rsp) - movl %ebp, 12(%rsp) - movl 16(%rsp), %esi - movl 20(%rsp), %ebp addl %r10d, %ecx addl %r11d, %edx + xorl %eax, %r12d + xorl %ebx, %r13d xorl %ecx, %r14d xorl %edx, %r15d + roll $16, %r12d + roll $16, %r13d roll $16, %r14d roll $16, %r15d - addl %r14d, %esi - addl %r15d, %ebp - xorl %esi, %r10d - xorl %ebp, %r11d + addl %r12d, 8(%rsp) + addl %r13d, 12(%rsp) + addl %r14d, 16(%rsp) + addl %r15d, 20(%rsp) + xorl 8(%rsp), %r8d + xorl 12(%rsp), %r9d + xorl 16(%rsp), %r10d + xorl 20(%rsp), %r11d + roll $12, %r8d + roll $12, %r9d roll $12, %r10d roll $12, %r11d + addl %r8d, %eax + addl %r9d, %ebx addl %r10d, %ecx addl %r11d, %edx + xorl %eax, %r12d + xorl %ebx, %r13d xorl %ecx, %r14d xorl %edx, %r15d + roll $8, %r12d + roll $8, %r13d roll $8, %r14d roll $8, %r15d - addl %r14d, %esi - addl %r15d, %ebp - xorl %esi, %r10d - xorl %ebp, %r11d + addl %r12d, 8(%rsp) + addl %r13d, 12(%rsp) + addl %r14d, 16(%rsp) + addl %r15d, 20(%rsp) + xorl 8(%rsp), %r8d + xorl 12(%rsp), %r9d + xorl 16(%rsp), %r10d + xorl 20(%rsp), %r11d + roll $7, %r8d + roll $7, %r9d roll $7, %r10d roll $7, %r11d addl %r9d, %eax addl %r10d, %ebx - xorl %eax, %r15d - xorl %ebx, %r12d - roll $16, %r15d - roll $16, %r12d - addl %r15d, %esi - addl %r12d, %ebp - xorl %esi, %r9d - xorl %ebp, %r10d - roll $12, %r9d - roll $12, %r10d - addl %r9d, %eax - addl %r10d, %ebx - xorl %eax, %r15d - xorl %ebx, %r12d - roll $8, %r15d - roll $8, %r12d - addl %r15d, %esi - addl %r12d, %ebp - xorl %esi, %r9d - xorl %ebp, %r10d - roll $7, %r9d - roll $7, %r10d - movl %esi, 16(%rsp) - movl %ebp, 20(%rsp) - movl 8(%rsp), %esi - movl 12(%rsp), %ebp addl %r11d, %ecx addl %r8d, %edx + xorl %eax, %r15d + xorl %ebx, %r12d xorl %ecx, %r13d xorl %edx, %r14d + roll $16, %r15d + roll $16, %r12d roll $16, %r13d roll $16, %r14d - addl %r13d, %esi - addl %r14d, %ebp - xorl %esi, %r11d - xorl %ebp, %r8d + addl %r15d, 16(%rsp) + addl %r12d, 20(%rsp) + addl %r13d, 8(%rsp) + addl %r14d, 12(%rsp) + xorl 16(%rsp), %r9d + xorl 20(%rsp), %r10d + xorl 8(%rsp), %r11d + xorl 12(%rsp), %r8d + roll $12, %r9d + roll $12, %r10d roll $12, %r11d roll $12, %r8d + addl %r9d, %eax + addl %r10d, %ebx addl %r11d, %ecx addl %r8d, %edx + xorl %eax, %r15d + xorl %ebx, %r12d xorl %ecx, %r13d xorl %edx, %r14d + roll $8, %r15d + roll $8, %r12d roll $8, %r13d roll $8, %r14d - addl %r13d, %esi - addl %r14d, %ebp - xorl %esi, %r11d - xorl %ebp, %r8d + addl %r15d, 16(%rsp) + addl %r12d, 20(%rsp) + addl %r13d, 8(%rsp) + addl %r14d, 12(%rsp) + xorl 16(%rsp), %r9d + xorl 20(%rsp), %r10d + xorl 8(%rsp), %r11d + xorl 12(%rsp), %r8d + roll $7, %r9d + roll $7, %r10d roll $7, %r11d roll $7, %r8d decb (%rsp) jnz L_chacha_x64_block_crypt_start - movl %esi, 8(%rsp) - movl %ebp, 12(%rsp) movq 32(%rsp), %rsi movq 24(%rsp), %rbp addl (%rdi), %eax @@ -299,117 +287,105 @@ L_chacha_x64_small: movl 56(%rdi), %r14d movl 60(%rdi), %r15d movb $10, (%rsp) - movl 8(%rsp), %esi - movl 12(%rsp), %ebp L_chacha_x64_partial_crypt_start: addl %r8d, %eax addl %r9d, %ebx - xorl %eax, %r12d - xorl %ebx, %r13d - roll $16, %r12d - roll $16, %r13d - addl %r12d, %esi - addl %r13d, %ebp - xorl %esi, %r8d - xorl %ebp, %r9d - roll $12, %r8d - roll $12, %r9d - addl %r8d, %eax - addl %r9d, %ebx - xorl %eax, %r12d - xorl %ebx, %r13d - roll $8, %r12d - roll $8, %r13d - addl %r12d, %esi - addl %r13d, %ebp - xorl %esi, %r8d - xorl %ebp, %r9d - roll $7, %r8d - roll $7, %r9d - movl %esi, 8(%rsp) - movl %ebp, 12(%rsp) - movl 16(%rsp), %esi - movl 20(%rsp), %ebp addl %r10d, %ecx addl %r11d, %edx + xorl %eax, %r12d + xorl %ebx, %r13d xorl %ecx, %r14d xorl %edx, %r15d + roll $16, %r12d + roll $16, %r13d roll $16, %r14d roll $16, %r15d - addl %r14d, %esi - addl %r15d, %ebp - xorl %esi, %r10d - xorl %ebp, %r11d + addl %r12d, 8(%rsp) + addl %r13d, 12(%rsp) + addl %r14d, 16(%rsp) + addl %r15d, 20(%rsp) + xorl 8(%rsp), %r8d + xorl 12(%rsp), %r9d + xorl 16(%rsp), %r10d + xorl 20(%rsp), %r11d + roll $12, %r8d + roll $12, %r9d roll $12, %r10d roll $12, %r11d + addl %r8d, %eax + addl %r9d, %ebx addl %r10d, %ecx addl %r11d, %edx + xorl %eax, %r12d + xorl %ebx, %r13d xorl %ecx, %r14d xorl %edx, %r15d + roll $8, %r12d + roll $8, %r13d roll $8, %r14d roll $8, %r15d - addl %r14d, %esi - addl %r15d, %ebp - xorl %esi, %r10d - xorl %ebp, %r11d + addl %r12d, 8(%rsp) + addl %r13d, 12(%rsp) + addl %r14d, 16(%rsp) + addl %r15d, 20(%rsp) + xorl 8(%rsp), %r8d + xorl 12(%rsp), %r9d + xorl 16(%rsp), %r10d + xorl 20(%rsp), %r11d + roll $7, %r8d + roll $7, %r9d roll $7, %r10d roll $7, %r11d addl %r9d, %eax addl %r10d, %ebx - xorl %eax, %r15d - xorl %ebx, %r12d - roll $16, %r15d - roll $16, %r12d - addl %r15d, %esi - addl %r12d, %ebp - xorl %esi, %r9d - xorl %ebp, %r10d - roll $12, %r9d - roll $12, %r10d - addl %r9d, %eax - addl %r10d, %ebx - xorl %eax, %r15d - xorl %ebx, %r12d - roll $8, %r15d - roll $8, %r12d - addl %r15d, %esi - addl %r12d, %ebp - xorl %esi, %r9d - xorl %ebp, %r10d - roll $7, %r9d - roll $7, %r10d - movl %esi, 16(%rsp) - movl %ebp, 20(%rsp) - movl 8(%rsp), %esi - movl 12(%rsp), %ebp addl %r11d, %ecx addl %r8d, %edx + xorl %eax, %r15d + xorl %ebx, %r12d xorl %ecx, %r13d xorl %edx, %r14d + roll $16, %r15d + roll $16, %r12d roll $16, %r13d roll $16, %r14d - addl %r13d, %esi - addl %r14d, %ebp - xorl %esi, %r11d - xorl %ebp, %r8d + addl %r15d, 16(%rsp) + addl %r12d, 20(%rsp) + addl %r13d, 8(%rsp) + addl %r14d, 12(%rsp) + xorl 16(%rsp), %r9d + xorl 20(%rsp), %r10d + xorl 8(%rsp), %r11d + xorl 12(%rsp), %r8d + roll $12, %r9d + roll $12, %r10d roll $12, %r11d roll $12, %r8d + addl %r9d, %eax + addl %r10d, %ebx addl %r11d, %ecx addl %r8d, %edx + xorl %eax, %r15d + xorl %ebx, %r12d xorl %ecx, %r13d xorl %edx, %r14d + roll $8, %r15d + roll $8, %r12d roll $8, %r13d roll $8, %r14d - addl %r13d, %esi - addl %r14d, %ebp - xorl %esi, %r11d - xorl %ebp, %r8d + addl %r15d, 16(%rsp) + addl %r12d, 20(%rsp) + addl %r13d, 8(%rsp) + addl %r14d, 12(%rsp) + xorl 16(%rsp), %r9d + xorl 20(%rsp), %r10d + xorl 8(%rsp), %r11d + xorl 12(%rsp), %r8d + roll $7, %r9d + roll $7, %r10d roll $7, %r11d roll $7, %r8d decb (%rsp) jnz L_chacha_x64_partial_crypt_start - movl %esi, 8(%rsp) - movl %ebp, 12(%rsp) movq 32(%rsp), %rsi addl (%rdi), %eax addl 4(%rdi), %ebx @@ -487,6 +463,379 @@ L_chacha_x64_done: #ifndef __APPLE__ .size chacha_encrypt_x64,.-chacha_encrypt_x64 #endif /* __APPLE__ */ +#ifndef HAVE_INTEL_SSSE3 +#define HAVE_INTEL_SSSE3 +#endif /* HAVE_INTEL_SSSE3 */ +#ifdef HAVE_INTEL_SSSE3 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_chacha20_sse3_rotl8: +.quad 0x0605040702010003,0x0e0d0c0f0a09080b +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_chacha20_sse3_rotl16: +.quad 0x0504070601000302,0x0d0c0f0e09080b0a +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_chacha20_sse3_one: +.quad 0x0000000000000001,0x0000000000000000 +#ifndef __APPLE__ +.text +.globl chacha_encrypt_sse3 +.type chacha_encrypt_sse3,@function +.align 16 +chacha_encrypt_sse3: +#else +.section __TEXT,__text +.globl _chacha_encrypt_sse3 +.p2align 4 +_chacha_encrypt_sse3: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + leaq L_chacha20_sse3_rotl8(%rip), %r11 + leaq L_chacha20_sse3_rotl16(%rip), %r12 + leaq L_chacha20_sse3_one(%rip), %r13 + cmpl $0x80, %ecx + jl L_chacha20_sse3_128_done +L_chacha20_sse3_128_start: + movdqu (%rdi), %xmm0 + movdqu 16(%rdi), %xmm1 + movdqu 32(%rdi), %xmm2 + movdqu 48(%rdi), %xmm3 + movdqa %xmm0, %xmm10 + movdqa %xmm1, %xmm11 + movdqa %xmm2, %xmm12 + movdqa %xmm3, %xmm13 + movdqa %xmm0, %xmm4 + movdqa %xmm1, %xmm5 + movdqa %xmm2, %xmm6 + movdqa %xmm3, %xmm7 + paddd (%r13), %xmm7 + movb $10, %al +L_chacha20_sse3_128_crypt2_start: + paddd %xmm1, %xmm0 + paddd %xmm5, %xmm4 + pxor %xmm0, %xmm3 + pxor %xmm4, %xmm7 + pshufb (%r12), %xmm3 + pshufb (%r12), %xmm7 + paddd %xmm3, %xmm2 + paddd %xmm7, %xmm6 + pxor %xmm2, %xmm1 + pxor %xmm6, %xmm5 + movdqa %xmm1, %xmm8 + movdqa %xmm5, %xmm9 + psrld $20, %xmm8 + psrld $20, %xmm9 + pslld $12, %xmm1 + pslld $12, %xmm5 + pxor %xmm8, %xmm1 + pxor %xmm9, %xmm5 + paddd %xmm1, %xmm0 + paddd %xmm5, %xmm4 + pxor %xmm0, %xmm3 + pxor %xmm4, %xmm7 + pshufb (%r11), %xmm3 + pshufb (%r11), %xmm7 + paddd %xmm3, %xmm2 + paddd %xmm7, %xmm6 + pxor %xmm2, %xmm1 + pxor %xmm6, %xmm5 + movdqa %xmm1, %xmm8 + movdqa %xmm5, %xmm9 + psrld $25, %xmm8 + psrld $25, %xmm9 + pslld $7, %xmm1 + pslld $7, %xmm5 + pxor %xmm8, %xmm1 + pxor %xmm9, %xmm5 + pshufd $57, %xmm1, %xmm1 + pshufd $0x4e, %xmm2, %xmm2 + pshufd $0x93, %xmm3, %xmm3 + pshufd $57, %xmm5, %xmm5 + pshufd $0x4e, %xmm6, %xmm6 + pshufd $0x93, %xmm7, %xmm7 + paddd %xmm1, %xmm0 + paddd %xmm5, %xmm4 + pxor %xmm0, %xmm3 + pxor %xmm4, %xmm7 + pshufb (%r12), %xmm3 + pshufb (%r12), %xmm7 + paddd %xmm3, %xmm2 + paddd %xmm7, %xmm6 + pxor %xmm2, %xmm1 + pxor %xmm6, %xmm5 + movdqa %xmm1, %xmm8 + movdqa %xmm5, %xmm9 + psrld $20, %xmm8 + psrld $20, %xmm9 + pslld $12, %xmm1 + pslld $12, %xmm5 + pxor %xmm8, %xmm1 + pxor %xmm9, %xmm5 + paddd %xmm1, %xmm0 + paddd %xmm5, %xmm4 + pxor %xmm0, %xmm3 + pxor %xmm4, %xmm7 + pshufb (%r11), %xmm3 + pshufb (%r11), %xmm7 + paddd %xmm3, %xmm2 + paddd %xmm7, %xmm6 + pxor %xmm2, %xmm1 + pxor %xmm6, %xmm5 + movdqa %xmm1, %xmm8 + movdqa %xmm5, %xmm9 + psrld $25, %xmm8 + psrld $25, %xmm9 + pslld $7, %xmm1 + pslld $7, %xmm5 + pxor %xmm8, %xmm1 + pxor %xmm9, %xmm5 + pshufd $0x93, %xmm1, %xmm1 + pshufd $0x4e, %xmm2, %xmm2 + pshufd $57, %xmm3, %xmm3 + pshufd $0x93, %xmm5, %xmm5 + pshufd $0x4e, %xmm6, %xmm6 + pshufd $57, %xmm7, %xmm7 + decb %al + jnz L_chacha20_sse3_128_crypt2_start + paddd %xmm10, %xmm0 + paddd %xmm11, %xmm1 + paddd %xmm12, %xmm2 + paddd %xmm13, %xmm3 + paddd %xmm10, %xmm4 + paddd %xmm11, %xmm5 + paddd %xmm12, %xmm6 + paddd %xmm13, %xmm7 + paddd (%r13), %xmm7 + movdqu (%rsi), %xmm8 + pxor %xmm8, %xmm0 + movdqu %xmm0, (%rdx) + movdqu 16(%rsi), %xmm8 + pxor %xmm8, %xmm1 + movdqu %xmm1, 16(%rdx) + movdqu 32(%rsi), %xmm8 + pxor %xmm8, %xmm2 + movdqu %xmm2, 32(%rdx) + movdqu 48(%rsi), %xmm8 + pxor %xmm8, %xmm3 + movdqu %xmm3, 48(%rdx) + movdqu 64(%rsi), %xmm8 + pxor %xmm8, %xmm4 + movdqu %xmm4, 64(%rdx) + movdqu 80(%rsi), %xmm8 + pxor %xmm8, %xmm5 + movdqu %xmm5, 80(%rdx) + movdqu 96(%rsi), %xmm8 + pxor %xmm8, %xmm6 + movdqu %xmm6, 96(%rdx) + movdqu 112(%rsi), %xmm8 + pxor %xmm8, %xmm7 + movdqu %xmm7, 112(%rdx) + addl $2, 48(%rdi) + subl $0x80, %ecx + addq $0x80, %rsi + addq $0x80, %rdx + cmpl $0x80, %ecx + jge L_chacha20_sse3_128_start +L_chacha20_sse3_128_done: + cmpl $0x00, %ecx + je L_chacha20_sse3_last_done + movdqu (%rdi), %xmm0 + movdqu 16(%rdi), %xmm1 + movdqu 32(%rdi), %xmm2 + movdqu 48(%rdi), %xmm3 + movdqa %xmm0, %xmm10 + movdqa %xmm1, %xmm11 + movdqa %xmm2, %xmm12 + movdqa %xmm3, %xmm13 + movdqa %xmm0, %xmm4 + movdqa %xmm1, %xmm5 + movdqa %xmm2, %xmm6 + movdqa %xmm3, %xmm7 + paddd (%r13), %xmm7 + movb $10, %al +L_chacha20_sse3_last_crypt2_start: + paddd %xmm1, %xmm0 + paddd %xmm5, %xmm4 + pxor %xmm0, %xmm3 + pxor %xmm4, %xmm7 + pshufb (%r12), %xmm3 + pshufb (%r12), %xmm7 + paddd %xmm3, %xmm2 + paddd %xmm7, %xmm6 + pxor %xmm2, %xmm1 + pxor %xmm6, %xmm5 + movdqa %xmm1, %xmm8 + movdqa %xmm5, %xmm9 + psrld $20, %xmm8 + psrld $20, %xmm9 + pslld $12, %xmm1 + pslld $12, %xmm5 + pxor %xmm8, %xmm1 + pxor %xmm9, %xmm5 + paddd %xmm1, %xmm0 + paddd %xmm5, %xmm4 + pxor %xmm0, %xmm3 + pxor %xmm4, %xmm7 + pshufb (%r11), %xmm3 + pshufb (%r11), %xmm7 + paddd %xmm3, %xmm2 + paddd %xmm7, %xmm6 + pxor %xmm2, %xmm1 + pxor %xmm6, %xmm5 + movdqa %xmm1, %xmm8 + movdqa %xmm5, %xmm9 + psrld $25, %xmm8 + psrld $25, %xmm9 + pslld $7, %xmm1 + pslld $7, %xmm5 + pxor %xmm8, %xmm1 + pxor %xmm9, %xmm5 + pshufd $57, %xmm1, %xmm1 + pshufd $0x4e, %xmm2, %xmm2 + pshufd $0x93, %xmm3, %xmm3 + pshufd $57, %xmm5, %xmm5 + pshufd $0x4e, %xmm6, %xmm6 + pshufd $0x93, %xmm7, %xmm7 + paddd %xmm1, %xmm0 + paddd %xmm5, %xmm4 + pxor %xmm0, %xmm3 + pxor %xmm4, %xmm7 + pshufb (%r12), %xmm3 + pshufb (%r12), %xmm7 + paddd %xmm3, %xmm2 + paddd %xmm7, %xmm6 + pxor %xmm2, %xmm1 + pxor %xmm6, %xmm5 + movdqa %xmm1, %xmm8 + movdqa %xmm5, %xmm9 + psrld $20, %xmm8 + psrld $20, %xmm9 + pslld $12, %xmm1 + pslld $12, %xmm5 + pxor %xmm8, %xmm1 + pxor %xmm9, %xmm5 + paddd %xmm1, %xmm0 + paddd %xmm5, %xmm4 + pxor %xmm0, %xmm3 + pxor %xmm4, %xmm7 + pshufb (%r11), %xmm3 + pshufb (%r11), %xmm7 + paddd %xmm3, %xmm2 + paddd %xmm7, %xmm6 + pxor %xmm2, %xmm1 + pxor %xmm6, %xmm5 + movdqa %xmm1, %xmm8 + movdqa %xmm5, %xmm9 + psrld $25, %xmm8 + psrld $25, %xmm9 + pslld $7, %xmm1 + pslld $7, %xmm5 + pxor %xmm8, %xmm1 + pxor %xmm9, %xmm5 + pshufd $0x93, %xmm1, %xmm1 + pshufd $0x4e, %xmm2, %xmm2 + pshufd $57, %xmm3, %xmm3 + pshufd $0x93, %xmm5, %xmm5 + pshufd $0x4e, %xmm6, %xmm6 + pshufd $57, %xmm7, %xmm7 + decb %al + jnz L_chacha20_sse3_last_crypt2_start + paddd %xmm10, %xmm0 + paddd %xmm11, %xmm1 + paddd %xmm12, %xmm2 + paddd %xmm13, %xmm3 + paddd %xmm10, %xmm4 + paddd %xmm11, %xmm5 + paddd %xmm12, %xmm6 + paddd %xmm13, %xmm7 + paddd (%r13), %xmm7 + cmpl $0x40, %ecx + jle L_chacha20_sse3_last_lt64 + movdqu (%rsi), %xmm8 + pxor %xmm8, %xmm0 + movdqu %xmm0, (%rdx) + movdqu 16(%rsi), %xmm8 + pxor %xmm8, %xmm1 + movdqu %xmm1, 16(%rdx) + movdqu 32(%rsi), %xmm8 + pxor %xmm8, %xmm2 + movdqu %xmm2, 32(%rdx) + movdqu 48(%rsi), %xmm8 + pxor %xmm8, %xmm3 + movdqu %xmm3, 48(%rdx) + movdqa %xmm4, %xmm0 + movdqa %xmm5, %xmm1 + movdqa %xmm6, %xmm2 + movdqa %xmm7, %xmm3 + addl $0x01, 48(%rdi) + subl $0x40, %ecx + addq $0x40, %rsi + addq $0x40, %rdx +L_chacha20_sse3_last_lt64: + leaq 80(%rdi), %r8 + movdqu %xmm0, (%r8) + movdqu %xmm1, 16(%r8) + movdqu %xmm2, 32(%r8) + movdqu %xmm3, 48(%r8) + addl $0x01, 48(%rdi) + movl %ecx, %eax + xorq %r9, %r9 + andl $7, %eax + jz L_chacha20_sse3_last_start64 +L_chacha20_sse3_last_start8: + movzbl (%r8,%r9,1), %r10d + xorb (%rsi,%r9,1), %r10b + movb %r10b, (%rdx,%r9,1) + incl %r9d + cmpl %eax, %r9d + jne L_chacha20_sse3_last_start8 + je L_chacha20_sse3_last_end64 +L_chacha20_sse3_last_start64: + movq (%r8,%r9,1), %r10 + xorq (%rsi,%r9,1), %r10 + movq %r10, (%rdx,%r9,1) + addl $8, %r9d +L_chacha20_sse3_last_end64: + cmpl %ecx, %r9d + jne L_chacha20_sse3_last_start64 + movl $0x40, %eax + subl %r9d, %eax + movl %eax, 76(%rdi) +L_chacha20_sse3_last_done: + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size chacha_encrypt_sse3,.-chacha_encrypt_sse3 +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_SSSE3 */ #ifdef HAVE_INTEL_AVX1 #ifndef __APPLE__ .data @@ -1485,6 +1834,9216 @@ L_chacha20_avx2_end256: .size chacha_encrypt_avx2,.-chacha_encrypt_avx2 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ +#ifdef HAVE_INTEL_AVX512 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_chacha20_avx512vl_add: +.quad 0x0000000100000000,0x0000000300000002 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_chacha20_avx512vl_four: +.quad 0x0000000400000004,0x0000000400000004 +#ifndef __APPLE__ +.text +.globl chacha_encrypt_avx512vl +.type chacha_encrypt_avx512vl,@function +.align 16 +chacha_encrypt_avx512vl: +#else +.section __TEXT,__text +.globl _chacha_encrypt_avx512vl +.p2align 4 +_chacha_encrypt_avx512vl: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + subq $0x190, %rsp + movq %rsp, %r9 + leaq 256(%rsp), %r10 + leaq L_chacha20_avx512vl_add(%rip), %r12 + leaq L_chacha20_avx512vl_four(%rip), %r13 + addq $15, %r9 + addq $15, %r10 + andq $-16, %r9 + andq $-16, %r10 + movl %ecx, %eax + shrl $8, %eax + jz L_chacha20_avx512vl_end128 + vpbroadcastd (%rdi), %xmm0 + vpbroadcastd 4(%rdi), %xmm1 + vpbroadcastd 8(%rdi), %xmm2 + vpbroadcastd 12(%rdi), %xmm3 + vpbroadcastd 16(%rdi), %xmm4 + vpbroadcastd 20(%rdi), %xmm5 + vpbroadcastd 24(%rdi), %xmm6 + vpbroadcastd 28(%rdi), %xmm7 + vpbroadcastd 32(%rdi), %xmm8 + vpbroadcastd 36(%rdi), %xmm9 + vpbroadcastd 40(%rdi), %xmm10 + vpbroadcastd 44(%rdi), %xmm11 + vpbroadcastd 48(%rdi), %xmm12 + vpbroadcastd 52(%rdi), %xmm13 + vpbroadcastd 56(%rdi), %xmm14 + vpbroadcastd 60(%rdi), %xmm15 + vpaddd (%r12), %xmm12, %xmm12 + vmovdqa %xmm0, (%r9) + vmovdqa %xmm1, 16(%r9) + vmovdqa %xmm2, 32(%r9) + vmovdqa %xmm3, 48(%r9) + vmovdqa %xmm4, 64(%r9) + vmovdqa %xmm5, 80(%r9) + vmovdqa %xmm6, 96(%r9) + vmovdqa %xmm7, 112(%r9) + vmovdqa %xmm8, 128(%r9) + vmovdqa %xmm9, 144(%r9) + vmovdqa %xmm10, 160(%r9) + vmovdqa %xmm11, 176(%r9) + vmovdqa %xmm12, 192(%r9) + vmovdqa %xmm13, 208(%r9) + vmovdqa %xmm14, 224(%r9) + vmovdqa %xmm15, 240(%r9) +L_chacha20_avx512vl_start128: + movb $10, %r8b +L_chacha20_avx512vl_loop128: + vpaddd %xmm4, %xmm0, %xmm0 + vpaddd %xmm5, %xmm1, %xmm1 + vpaddd %xmm6, %xmm2, %xmm2 + vpaddd %xmm7, %xmm3, %xmm3 + vpxord %xmm0, %xmm12, %xmm12 + vpxord %xmm1, %xmm13, %xmm13 + vpxord %xmm2, %xmm14, %xmm14 + vpxord %xmm3, %xmm15, %xmm15 + vprold $16, %xmm12, %xmm12 + vprold $16, %xmm13, %xmm13 + vprold $16, %xmm14, %xmm14 + vprold $16, %xmm15, %xmm15 + vpaddd %xmm12, %xmm8, %xmm8 + vpaddd %xmm13, %xmm9, %xmm9 + vpaddd %xmm14, %xmm10, %xmm10 + vpaddd %xmm15, %xmm11, %xmm11 + vpxord %xmm8, %xmm4, %xmm4 + vpxord %xmm9, %xmm5, %xmm5 + vpxord %xmm10, %xmm6, %xmm6 + vpxord %xmm11, %xmm7, %xmm7 + vprold $12, %xmm4, %xmm4 + vprold $12, %xmm5, %xmm5 + vprold $12, %xmm6, %xmm6 + vprold $12, %xmm7, %xmm7 + vpaddd %xmm4, %xmm0, %xmm0 + vpaddd %xmm5, %xmm1, %xmm1 + vpaddd %xmm6, %xmm2, %xmm2 + vpaddd %xmm7, %xmm3, %xmm3 + vpxord %xmm0, %xmm12, %xmm12 + vpxord %xmm1, %xmm13, %xmm13 + vpxord %xmm2, %xmm14, %xmm14 + vpxord %xmm3, %xmm15, %xmm15 + vprold $8, %xmm12, %xmm12 + vprold $8, %xmm13, %xmm13 + vprold $8, %xmm14, %xmm14 + vprold $8, %xmm15, %xmm15 + vpaddd %xmm12, %xmm8, %xmm8 + vpaddd %xmm13, %xmm9, %xmm9 + vpaddd %xmm14, %xmm10, %xmm10 + vpaddd %xmm15, %xmm11, %xmm11 + vpxord %xmm8, %xmm4, %xmm4 + vpxord %xmm9, %xmm5, %xmm5 + vpxord %xmm10, %xmm6, %xmm6 + vpxord %xmm11, %xmm7, %xmm7 + vprold $7, %xmm4, %xmm4 + vprold $7, %xmm5, %xmm5 + vprold $7, %xmm6, %xmm6 + vprold $7, %xmm7, %xmm7 + vpaddd %xmm5, %xmm0, %xmm0 + vpaddd %xmm6, %xmm1, %xmm1 + vpaddd %xmm7, %xmm2, %xmm2 + vpaddd %xmm4, %xmm3, %xmm3 + vpxord %xmm0, %xmm15, %xmm15 + vpxord %xmm1, %xmm12, %xmm12 + vpxord %xmm2, %xmm13, %xmm13 + vpxord %xmm3, %xmm14, %xmm14 + vprold $16, %xmm15, %xmm15 + vprold $16, %xmm12, %xmm12 + vprold $16, %xmm13, %xmm13 + vprold $16, %xmm14, %xmm14 + vpaddd %xmm15, %xmm10, %xmm10 + vpaddd %xmm12, %xmm11, %xmm11 + vpaddd %xmm13, %xmm8, %xmm8 + vpaddd %xmm14, %xmm9, %xmm9 + vpxord %xmm10, %xmm5, %xmm5 + vpxord %xmm11, %xmm6, %xmm6 + vpxord %xmm8, %xmm7, %xmm7 + vpxord %xmm9, %xmm4, %xmm4 + vprold $12, %xmm5, %xmm5 + vprold $12, %xmm6, %xmm6 + vprold $12, %xmm7, %xmm7 + vprold $12, %xmm4, %xmm4 + vpaddd %xmm5, %xmm0, %xmm0 + vpaddd %xmm6, %xmm1, %xmm1 + vpaddd %xmm7, %xmm2, %xmm2 + vpaddd %xmm4, %xmm3, %xmm3 + vpxord %xmm0, %xmm15, %xmm15 + vpxord %xmm1, %xmm12, %xmm12 + vpxord %xmm2, %xmm13, %xmm13 + vpxord %xmm3, %xmm14, %xmm14 + vprold $8, %xmm15, %xmm15 + vprold $8, %xmm12, %xmm12 + vprold $8, %xmm13, %xmm13 + vprold $8, %xmm14, %xmm14 + vpaddd %xmm15, %xmm10, %xmm10 + vpaddd %xmm12, %xmm11, %xmm11 + vpaddd %xmm13, %xmm8, %xmm8 + vpaddd %xmm14, %xmm9, %xmm9 + vpxord %xmm10, %xmm5, %xmm5 + vpxord %xmm11, %xmm6, %xmm6 + vpxord %xmm8, %xmm7, %xmm7 + vpxord %xmm9, %xmm4, %xmm4 + vprold $7, %xmm5, %xmm5 + vprold $7, %xmm6, %xmm6 + vprold $7, %xmm7, %xmm7 + vprold $7, %xmm4, %xmm4 + decb %r8b + jnz L_chacha20_avx512vl_loop128 + vpaddd (%r9), %xmm0, %xmm0 + vpaddd 16(%r9), %xmm1, %xmm1 + vpaddd 32(%r9), %xmm2, %xmm2 + vpaddd 48(%r9), %xmm3, %xmm3 + vpaddd 64(%r9), %xmm4, %xmm4 + vpaddd 80(%r9), %xmm5, %xmm5 + vpaddd 96(%r9), %xmm6, %xmm6 + vpaddd 112(%r9), %xmm7, %xmm7 + vpaddd 128(%r9), %xmm8, %xmm8 + vpaddd 144(%r9), %xmm9, %xmm9 + vpaddd 160(%r9), %xmm10, %xmm10 + vpaddd 176(%r9), %xmm11, %xmm11 + vpaddd 192(%r9), %xmm12, %xmm12 + vpaddd 208(%r9), %xmm13, %xmm13 + vpaddd 224(%r9), %xmm14, %xmm14 + vpaddd 240(%r9), %xmm15, %xmm15 + vmovdqa %xmm8, (%r10) + vmovdqa %xmm9, 16(%r10) + vmovdqa %xmm10, 32(%r10) + vmovdqa %xmm11, 48(%r10) + vmovdqa %xmm12, 64(%r10) + vmovdqa %xmm13, 80(%r10) + vmovdqa %xmm14, 96(%r10) + vmovdqa %xmm15, 112(%r10) + vpunpckldq %xmm1, %xmm0, %xmm8 + vpunpckldq %xmm3, %xmm2, %xmm9 + vpunpckhdq %xmm1, %xmm0, %xmm12 + vpunpckhdq %xmm3, %xmm2, %xmm13 + vpunpckldq %xmm5, %xmm4, %xmm10 + vpunpckldq %xmm7, %xmm6, %xmm11 + vpunpckhdq %xmm5, %xmm4, %xmm14 + vpunpckhdq %xmm7, %xmm6, %xmm15 + vpunpcklqdq %xmm9, %xmm8, %xmm0 + vpunpcklqdq %xmm11, %xmm10, %xmm1 + vpunpckhqdq %xmm9, %xmm8, %xmm2 + vpunpckhqdq %xmm11, %xmm10, %xmm3 + vpunpcklqdq %xmm13, %xmm12, %xmm4 + vpunpcklqdq %xmm15, %xmm14, %xmm5 + vpunpckhqdq %xmm13, %xmm12, %xmm6 + vpunpckhqdq %xmm15, %xmm14, %xmm7 + vmovdqu (%rsi), %xmm8 + vmovdqu 16(%rsi), %xmm9 + vmovdqu 64(%rsi), %xmm10 + vmovdqu 80(%rsi), %xmm11 + vmovdqu 128(%rsi), %xmm12 + vmovdqu 144(%rsi), %xmm13 + vmovdqu 192(%rsi), %xmm14 + vmovdqu 208(%rsi), %xmm15 + vpxor %xmm8, %xmm0, %xmm0 + vpxor %xmm9, %xmm1, %xmm1 + vpxor %xmm10, %xmm2, %xmm2 + vpxor %xmm11, %xmm3, %xmm3 + vpxor %xmm12, %xmm4, %xmm4 + vpxor %xmm13, %xmm5, %xmm5 + vpxor %xmm14, %xmm6, %xmm6 + vpxor %xmm15, %xmm7, %xmm7 + vmovdqu %xmm0, (%rdx) + vmovdqu %xmm1, 16(%rdx) + vmovdqu %xmm2, 64(%rdx) + vmovdqu %xmm3, 80(%rdx) + vmovdqu %xmm4, 128(%rdx) + vmovdqu %xmm5, 144(%rdx) + vmovdqu %xmm6, 192(%rdx) + vmovdqu %xmm7, 208(%rdx) + vmovdqa (%r10), %xmm0 + vmovdqa 16(%r10), %xmm1 + vmovdqa 32(%r10), %xmm2 + vmovdqa 48(%r10), %xmm3 + vmovdqa 64(%r10), %xmm4 + vmovdqa 80(%r10), %xmm5 + vmovdqa 96(%r10), %xmm6 + vmovdqa 112(%r10), %xmm7 + vpunpckldq %xmm1, %xmm0, %xmm8 + vpunpckldq %xmm3, %xmm2, %xmm9 + vpunpckhdq %xmm1, %xmm0, %xmm12 + vpunpckhdq %xmm3, %xmm2, %xmm13 + vpunpckldq %xmm5, %xmm4, %xmm10 + vpunpckldq %xmm7, %xmm6, %xmm11 + vpunpckhdq %xmm5, %xmm4, %xmm14 + vpunpckhdq %xmm7, %xmm6, %xmm15 + vpunpcklqdq %xmm9, %xmm8, %xmm0 + vpunpcklqdq %xmm11, %xmm10, %xmm1 + vpunpckhqdq %xmm9, %xmm8, %xmm2 + vpunpckhqdq %xmm11, %xmm10, %xmm3 + vpunpcklqdq %xmm13, %xmm12, %xmm4 + vpunpcklqdq %xmm15, %xmm14, %xmm5 + vpunpckhqdq %xmm13, %xmm12, %xmm6 + vpunpckhqdq %xmm15, %xmm14, %xmm7 + vmovdqu 32(%rsi), %xmm8 + vmovdqu 48(%rsi), %xmm9 + vmovdqu 96(%rsi), %xmm10 + vmovdqu 112(%rsi), %xmm11 + vmovdqu 160(%rsi), %xmm12 + vmovdqu 176(%rsi), %xmm13 + vmovdqu 224(%rsi), %xmm14 + vmovdqu 240(%rsi), %xmm15 + vpxor %xmm8, %xmm0, %xmm0 + vpxor %xmm9, %xmm1, %xmm1 + vpxor %xmm10, %xmm2, %xmm2 + vpxor %xmm11, %xmm3, %xmm3 + vpxor %xmm12, %xmm4, %xmm4 + vpxor %xmm13, %xmm5, %xmm5 + vpxor %xmm14, %xmm6, %xmm6 + vpxor %xmm15, %xmm7, %xmm7 + vmovdqu %xmm0, 32(%rdx) + vmovdqu %xmm1, 48(%rdx) + vmovdqu %xmm2, 96(%rdx) + vmovdqu %xmm3, 112(%rdx) + vmovdqu %xmm4, 160(%rdx) + vmovdqu %xmm5, 176(%rdx) + vmovdqu %xmm6, 224(%rdx) + vmovdqu %xmm7, 240(%rdx) + vmovdqa 192(%r9), %xmm12 + addq $0x100, %rsi + addq $0x100, %rdx + vpaddd (%r13), %xmm12, %xmm12 + subl $0x100, %ecx + vmovdqa %xmm12, 192(%r9) + cmpl $0x100, %ecx + jl L_chacha20_avx512vl_done128 + vmovdqa (%r9), %xmm0 + vmovdqa 16(%r9), %xmm1 + vmovdqa 32(%r9), %xmm2 + vmovdqa 48(%r9), %xmm3 + vmovdqa 64(%r9), %xmm4 + vmovdqa 80(%r9), %xmm5 + vmovdqa 96(%r9), %xmm6 + vmovdqa 112(%r9), %xmm7 + vmovdqa 128(%r9), %xmm8 + vmovdqa 144(%r9), %xmm9 + vmovdqa 160(%r9), %xmm10 + vmovdqa 176(%r9), %xmm11 + vmovdqa 192(%r9), %xmm12 + vmovdqa 208(%r9), %xmm13 + vmovdqa 224(%r9), %xmm14 + vmovdqa 240(%r9), %xmm15 + jmp L_chacha20_avx512vl_start128 +L_chacha20_avx512vl_done128: + shll $2, %eax + addl %eax, 48(%rdi) +L_chacha20_avx512vl_end128: + cmpl $0x00, %ecx + je L_chacha20_avx512vl_last_done + vpbroadcastd (%rdi), %xmm0 + vpbroadcastd 4(%rdi), %xmm1 + vpbroadcastd 8(%rdi), %xmm2 + vpbroadcastd 12(%rdi), %xmm3 + vpbroadcastd 16(%rdi), %xmm4 + vpbroadcastd 20(%rdi), %xmm5 + vpbroadcastd 24(%rdi), %xmm6 + vpbroadcastd 28(%rdi), %xmm7 + vpbroadcastd 32(%rdi), %xmm8 + vpbroadcastd 36(%rdi), %xmm9 + vpbroadcastd 40(%rdi), %xmm10 + vpbroadcastd 44(%rdi), %xmm11 + vpbroadcastd 48(%rdi), %xmm12 + vpbroadcastd 52(%rdi), %xmm13 + vpbroadcastd 56(%rdi), %xmm14 + vpbroadcastd 60(%rdi), %xmm15 + vpaddd (%r12), %xmm12, %xmm12 + vmovdqa %xmm0, (%r9) + vmovdqa %xmm1, 16(%r9) + vmovdqa %xmm2, 32(%r9) + vmovdqa %xmm3, 48(%r9) + vmovdqa %xmm4, 64(%r9) + vmovdqa %xmm5, 80(%r9) + vmovdqa %xmm6, 96(%r9) + vmovdqa %xmm7, 112(%r9) + vmovdqa %xmm8, 128(%r9) + vmovdqa %xmm9, 144(%r9) + vmovdqa %xmm10, 160(%r9) + vmovdqa %xmm11, 176(%r9) + vmovdqa %xmm12, 192(%r9) + vmovdqa %xmm13, 208(%r9) + vmovdqa %xmm14, 224(%r9) + vmovdqa %xmm15, 240(%r9) + movb $10, %r8b +L_chacha20_avx512vl_last_round: + vpaddd %xmm4, %xmm0, %xmm0 + vpaddd %xmm5, %xmm1, %xmm1 + vpaddd %xmm6, %xmm2, %xmm2 + vpaddd %xmm7, %xmm3, %xmm3 + vpxord %xmm0, %xmm12, %xmm12 + vpxord %xmm1, %xmm13, %xmm13 + vpxord %xmm2, %xmm14, %xmm14 + vpxord %xmm3, %xmm15, %xmm15 + vprold $16, %xmm12, %xmm12 + vprold $16, %xmm13, %xmm13 + vprold $16, %xmm14, %xmm14 + vprold $16, %xmm15, %xmm15 + vpaddd %xmm12, %xmm8, %xmm8 + vpaddd %xmm13, %xmm9, %xmm9 + vpaddd %xmm14, %xmm10, %xmm10 + vpaddd %xmm15, %xmm11, %xmm11 + vpxord %xmm8, %xmm4, %xmm4 + vpxord %xmm9, %xmm5, %xmm5 + vpxord %xmm10, %xmm6, %xmm6 + vpxord %xmm11, %xmm7, %xmm7 + vprold $12, %xmm4, %xmm4 + vprold $12, %xmm5, %xmm5 + vprold $12, %xmm6, %xmm6 + vprold $12, %xmm7, %xmm7 + vpaddd %xmm4, %xmm0, %xmm0 + vpaddd %xmm5, %xmm1, %xmm1 + vpaddd %xmm6, %xmm2, %xmm2 + vpaddd %xmm7, %xmm3, %xmm3 + vpxord %xmm0, %xmm12, %xmm12 + vpxord %xmm1, %xmm13, %xmm13 + vpxord %xmm2, %xmm14, %xmm14 + vpxord %xmm3, %xmm15, %xmm15 + vprold $8, %xmm12, %xmm12 + vprold $8, %xmm13, %xmm13 + vprold $8, %xmm14, %xmm14 + vprold $8, %xmm15, %xmm15 + vpaddd %xmm12, %xmm8, %xmm8 + vpaddd %xmm13, %xmm9, %xmm9 + vpaddd %xmm14, %xmm10, %xmm10 + vpaddd %xmm15, %xmm11, %xmm11 + vpxord %xmm8, %xmm4, %xmm4 + vpxord %xmm9, %xmm5, %xmm5 + vpxord %xmm10, %xmm6, %xmm6 + vpxord %xmm11, %xmm7, %xmm7 + vprold $7, %xmm4, %xmm4 + vprold $7, %xmm5, %xmm5 + vprold $7, %xmm6, %xmm6 + vprold $7, %xmm7, %xmm7 + vpaddd %xmm5, %xmm0, %xmm0 + vpaddd %xmm6, %xmm1, %xmm1 + vpaddd %xmm7, %xmm2, %xmm2 + vpaddd %xmm4, %xmm3, %xmm3 + vpxord %xmm0, %xmm15, %xmm15 + vpxord %xmm1, %xmm12, %xmm12 + vpxord %xmm2, %xmm13, %xmm13 + vpxord %xmm3, %xmm14, %xmm14 + vprold $16, %xmm15, %xmm15 + vprold $16, %xmm12, %xmm12 + vprold $16, %xmm13, %xmm13 + vprold $16, %xmm14, %xmm14 + vpaddd %xmm15, %xmm10, %xmm10 + vpaddd %xmm12, %xmm11, %xmm11 + vpaddd %xmm13, %xmm8, %xmm8 + vpaddd %xmm14, %xmm9, %xmm9 + vpxord %xmm10, %xmm5, %xmm5 + vpxord %xmm11, %xmm6, %xmm6 + vpxord %xmm8, %xmm7, %xmm7 + vpxord %xmm9, %xmm4, %xmm4 + vprold $12, %xmm5, %xmm5 + vprold $12, %xmm6, %xmm6 + vprold $12, %xmm7, %xmm7 + vprold $12, %xmm4, %xmm4 + vpaddd %xmm5, %xmm0, %xmm0 + vpaddd %xmm6, %xmm1, %xmm1 + vpaddd %xmm7, %xmm2, %xmm2 + vpaddd %xmm4, %xmm3, %xmm3 + vpxord %xmm0, %xmm15, %xmm15 + vpxord %xmm1, %xmm12, %xmm12 + vpxord %xmm2, %xmm13, %xmm13 + vpxord %xmm3, %xmm14, %xmm14 + vprold $8, %xmm15, %xmm15 + vprold $8, %xmm12, %xmm12 + vprold $8, %xmm13, %xmm13 + vprold $8, %xmm14, %xmm14 + vpaddd %xmm15, %xmm10, %xmm10 + vpaddd %xmm12, %xmm11, %xmm11 + vpaddd %xmm13, %xmm8, %xmm8 + vpaddd %xmm14, %xmm9, %xmm9 + vpxord %xmm10, %xmm5, %xmm5 + vpxord %xmm11, %xmm6, %xmm6 + vpxord %xmm8, %xmm7, %xmm7 + vpxord %xmm9, %xmm4, %xmm4 + vprold $7, %xmm5, %xmm5 + vprold $7, %xmm6, %xmm6 + vprold $7, %xmm7, %xmm7 + vprold $7, %xmm4, %xmm4 + decb %r8b + jnz L_chacha20_avx512vl_last_round + vpaddd (%r9), %xmm0, %xmm0 + vpaddd 16(%r9), %xmm1, %xmm1 + vpaddd 32(%r9), %xmm2, %xmm2 + vpaddd 48(%r9), %xmm3, %xmm3 + vpaddd 64(%r9), %xmm4, %xmm4 + vpaddd 80(%r9), %xmm5, %xmm5 + vpaddd 96(%r9), %xmm6, %xmm6 + vpaddd 112(%r9), %xmm7, %xmm7 + vpaddd 128(%r9), %xmm8, %xmm8 + vpaddd 144(%r9), %xmm9, %xmm9 + vpaddd 160(%r9), %xmm10, %xmm10 + vpaddd 176(%r9), %xmm11, %xmm11 + vpaddd 192(%r9), %xmm12, %xmm12 + vpaddd 208(%r9), %xmm13, %xmm13 + vpaddd 224(%r9), %xmm14, %xmm14 + vpaddd 240(%r9), %xmm15, %xmm15 + vmovdqa %xmm8, (%r10) + vmovdqa %xmm9, 16(%r10) + vmovdqa %xmm10, 32(%r10) + vmovdqa %xmm11, 48(%r10) + vmovdqa %xmm12, 64(%r10) + vmovdqa %xmm13, 80(%r10) + vmovdqa %xmm14, 96(%r10) + vmovdqa %xmm15, 112(%r10) + vpunpckldq %xmm1, %xmm0, %xmm8 + vpunpckldq %xmm3, %xmm2, %xmm9 + vpunpckhdq %xmm1, %xmm0, %xmm12 + vpunpckhdq %xmm3, %xmm2, %xmm13 + vpunpckldq %xmm5, %xmm4, %xmm10 + vpunpckldq %xmm7, %xmm6, %xmm11 + vpunpckhdq %xmm5, %xmm4, %xmm14 + vpunpckhdq %xmm7, %xmm6, %xmm15 + vpunpcklqdq %xmm9, %xmm8, %xmm0 + vpunpcklqdq %xmm11, %xmm10, %xmm1 + vpunpckhqdq %xmm9, %xmm8, %xmm2 + vpunpckhqdq %xmm11, %xmm10, %xmm3 + vpunpcklqdq %xmm13, %xmm12, %xmm4 + vpunpcklqdq %xmm15, %xmm14, %xmm5 + vpunpckhqdq %xmm13, %xmm12, %xmm6 + vpunpckhqdq %xmm15, %xmm14, %xmm7 + vmovdqu %xmm0, (%r9) + vmovdqu %xmm1, 16(%r9) + vmovdqu %xmm2, 64(%r9) + vmovdqu %xmm3, 80(%r9) + vmovdqu %xmm4, 128(%r9) + vmovdqu %xmm5, 144(%r9) + vmovdqu %xmm6, 192(%r9) + vmovdqu %xmm7, 208(%r9) + vmovdqa (%r10), %xmm0 + vmovdqa 16(%r10), %xmm1 + vmovdqa 32(%r10), %xmm2 + vmovdqa 48(%r10), %xmm3 + vmovdqa 64(%r10), %xmm4 + vmovdqa 80(%r10), %xmm5 + vmovdqa 96(%r10), %xmm6 + vmovdqa 112(%r10), %xmm7 + vpunpckldq %xmm1, %xmm0, %xmm8 + vpunpckldq %xmm3, %xmm2, %xmm9 + vpunpckhdq %xmm1, %xmm0, %xmm12 + vpunpckhdq %xmm3, %xmm2, %xmm13 + vpunpckldq %xmm5, %xmm4, %xmm10 + vpunpckldq %xmm7, %xmm6, %xmm11 + vpunpckhdq %xmm5, %xmm4, %xmm14 + vpunpckhdq %xmm7, %xmm6, %xmm15 + vpunpcklqdq %xmm9, %xmm8, %xmm0 + vpunpcklqdq %xmm11, %xmm10, %xmm1 + vpunpckhqdq %xmm9, %xmm8, %xmm2 + vpunpckhqdq %xmm11, %xmm10, %xmm3 + vpunpcklqdq %xmm13, %xmm12, %xmm4 + vpunpcklqdq %xmm15, %xmm14, %xmm5 + vpunpckhqdq %xmm13, %xmm12, %xmm6 + vpunpckhqdq %xmm15, %xmm14, %xmm7 + vmovdqu %xmm0, 32(%r9) + vmovdqu %xmm1, 48(%r9) + vmovdqu %xmm2, 96(%r9) + vmovdqu %xmm3, 112(%r9) + vmovdqu %xmm4, 160(%r9) + vmovdqu %xmm5, 176(%r9) + vmovdqu %xmm6, 224(%r9) + vmovdqu %xmm7, 240(%r9) + cmpl $0x40, %ecx + jl L_chacha20_avx512vl_last_fdone +L_chacha20_avx512vl_last_fstart: + vmovdqu (%rsi), %xmm0 + vpxor (%r9), %xmm0, %xmm0 + vmovdqu %xmm0, (%rdx) + vmovdqu 16(%rsi), %xmm0 + vpxor 16(%r9), %xmm0, %xmm0 + vmovdqu %xmm0, 16(%rdx) + vmovdqu 32(%rsi), %xmm0 + vpxor 32(%r9), %xmm0, %xmm0 + vmovdqu %xmm0, 32(%rdx) + vmovdqu 48(%rsi), %xmm0 + vpxor 48(%r9), %xmm0, %xmm0 + vmovdqu %xmm0, 48(%rdx) + addl $0x01, 48(%rdi) + subl $0x40, %ecx + addq $0x40, %rsi + addq $0x40, %rdx + addq $0x40, %r9 + cmpl $0x40, %ecx + jge L_chacha20_avx512vl_last_fstart +L_chacha20_avx512vl_last_fdone: + cmpl $0x00, %ecx + je L_chacha20_avx512vl_last_done + leaq 80(%rdi), %r10 + vmovdqu (%r9), %xmm0 + vmovdqu %xmm0, (%r10) + vmovdqu 16(%r9), %xmm0 + vmovdqu %xmm0, 16(%r10) + vmovdqu 32(%r9), %xmm0 + vmovdqu %xmm0, 32(%r10) + vmovdqu 48(%r9), %xmm0 + vmovdqu %xmm0, 48(%r10) + addl $0x01, 48(%rdi) + movl %ecx, %r8d + xorq %r11, %r11 + andl $7, %r8d + jz L_chacha20_avx512vl_last_start64 +L_chacha20_avx512vl_last_start8: + movzbl (%r10,%r11,1), %eax + xorb (%rsi,%r11,1), %al + movb %al, (%rdx,%r11,1) + incl %r11d + cmpl %r8d, %r11d + jne L_chacha20_avx512vl_last_start8 + je L_chacha20_avx512vl_last_end64 +L_chacha20_avx512vl_last_start64: + movq (%r10,%r11,1), %rax + xorq (%rsi,%r11,1), %rax + movq %rax, (%rdx,%r11,1) + addl $8, %r11d +L_chacha20_avx512vl_last_end64: + cmpl %ecx, %r11d + jne L_chacha20_avx512vl_last_start64 + movl $0x40, %r8d + subl %r11d, %r8d + movl %r8d, 76(%rdi) +L_chacha20_avx512vl_last_done: + addq $0x190, %rsp + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size chacha_encrypt_avx512vl,.-chacha_encrypt_avx512vl +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX512 */ +#ifdef HAVE_INTEL_AVX512 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_chacha20_avx512_add: +.quad 0x0000000100000000,0x0000000300000002 +.quad 0x0000000500000004,0x0000000700000006 +.quad 0x0000000900000008,0x0000000b0000000a +.quad 0x0000000d0000000c,0x0000000f0000000e +#ifndef __APPLE__ +.text +.globl chacha_encrypt_avx512 +.type chacha_encrypt_avx512,@function +.align 16 +chacha_encrypt_avx512: +#else +.section __TEXT,__text +.globl _chacha_encrypt_avx512 +.p2align 4 +_chacha_encrypt_avx512: +#endif /* __APPLE__ */ + subq $8, %rsp + leaq L_chacha20_avx512_add(%rip), %r8 + cmpl $0x400, %ecx + jl L_chacha20_avx512_end512 +L_chacha20_avx512_start512: + vpbroadcastd (%rdi), %zmm0 + vpbroadcastd 4(%rdi), %zmm1 + vpbroadcastd 8(%rdi), %zmm2 + vpbroadcastd 12(%rdi), %zmm3 + vpbroadcastd 16(%rdi), %zmm4 + vpbroadcastd 20(%rdi), %zmm5 + vpbroadcastd 24(%rdi), %zmm6 + vpbroadcastd 28(%rdi), %zmm7 + vpbroadcastd 32(%rdi), %zmm8 + vpbroadcastd 36(%rdi), %zmm9 + vpbroadcastd 40(%rdi), %zmm10 + vpbroadcastd 44(%rdi), %zmm11 + vpbroadcastd 52(%rdi), %zmm13 + vpbroadcastd 56(%rdi), %zmm14 + vpbroadcastd 60(%rdi), %zmm15 + vpbroadcastd 48(%rdi), %zmm12 + vpaddd (%r8), %zmm12, %zmm12 + movb $10, %al +L_chacha20_avx512_loop512: + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + decb %al + jnz L_chacha20_avx512_loop512 + vpaddd (%rdi){1to16}, %zmm0, %zmm0 + vpaddd 4(%rdi){1to16}, %zmm1, %zmm1 + vpaddd 8(%rdi){1to16}, %zmm2, %zmm2 + vpaddd 12(%rdi){1to16}, %zmm3, %zmm3 + vpaddd 16(%rdi){1to16}, %zmm4, %zmm4 + vpaddd 20(%rdi){1to16}, %zmm5, %zmm5 + vpaddd 24(%rdi){1to16}, %zmm6, %zmm6 + vpaddd 28(%rdi){1to16}, %zmm7, %zmm7 + vpaddd 32(%rdi){1to16}, %zmm8, %zmm8 + vpaddd 36(%rdi){1to16}, %zmm9, %zmm9 + vpaddd 40(%rdi){1to16}, %zmm10, %zmm10 + vpaddd 44(%rdi){1to16}, %zmm11, %zmm11 + vpaddd 52(%rdi){1to16}, %zmm13, %zmm13 + vpaddd 56(%rdi){1to16}, %zmm14, %zmm14 + vpaddd 60(%rdi){1to16}, %zmm15, %zmm15 + vpbroadcastd 48(%rdi), %zmm16 + vpaddd (%r8), %zmm16, %zmm16 + vpaddd %zmm16, %zmm12, %zmm12 + vpunpckldq %zmm1, %zmm0, %zmm16 + vpunpckhdq %zmm1, %zmm0, %zmm17 + vpunpckldq %zmm3, %zmm2, %zmm18 + vpunpckhdq %zmm3, %zmm2, %zmm19 + vpunpckldq %zmm5, %zmm4, %zmm20 + vpunpckhdq %zmm5, %zmm4, %zmm21 + vpunpckldq %zmm7, %zmm6, %zmm22 + vpunpckhdq %zmm7, %zmm6, %zmm23 + vpunpckldq %zmm9, %zmm8, %zmm24 + vpunpckhdq %zmm9, %zmm8, %zmm25 + vpunpckldq %zmm11, %zmm10, %zmm26 + vpunpckhdq %zmm11, %zmm10, %zmm27 + vpunpckldq %zmm13, %zmm12, %zmm28 + vpunpckhdq %zmm13, %zmm12, %zmm29 + vpunpckldq %zmm15, %zmm14, %zmm30 + vpunpckhdq %zmm15, %zmm14, %zmm31 + vpunpcklqdq %zmm18, %zmm16, %zmm0 + vpunpckhqdq %zmm18, %zmm16, %zmm1 + vpunpcklqdq %zmm19, %zmm17, %zmm2 + vpunpckhqdq %zmm19, %zmm17, %zmm3 + vpunpcklqdq %zmm22, %zmm20, %zmm4 + vpunpckhqdq %zmm22, %zmm20, %zmm5 + vpunpcklqdq %zmm23, %zmm21, %zmm6 + vpunpckhqdq %zmm23, %zmm21, %zmm7 + vpunpcklqdq %zmm26, %zmm24, %zmm8 + vpunpckhqdq %zmm26, %zmm24, %zmm9 + vpunpcklqdq %zmm27, %zmm25, %zmm10 + vpunpckhqdq %zmm27, %zmm25, %zmm11 + vpunpcklqdq %zmm30, %zmm28, %zmm12 + vpunpckhqdq %zmm30, %zmm28, %zmm13 + vpunpcklqdq %zmm31, %zmm29, %zmm14 + vpunpckhqdq %zmm31, %zmm29, %zmm15 + vshufi32x4 $0x44, %zmm4, %zmm0, %zmm16 + vshufi32x4 $0xee, %zmm4, %zmm0, %zmm17 + vshufi32x4 $0x44, %zmm12, %zmm8, %zmm18 + vshufi32x4 $0xee, %zmm12, %zmm8, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord (%rsi), %zmm20, %zmm20 + vmovdqu64 %zmm20, (%rdx) + vpxord 256(%rsi), %zmm21, %zmm21 + vmovdqu64 %zmm21, 256(%rdx) + vpxord 512(%rsi), %zmm22, %zmm22 + vmovdqu64 %zmm22, 512(%rdx) + vpxord 768(%rsi), %zmm23, %zmm23 + vmovdqu64 %zmm23, 768(%rdx) + vshufi32x4 $0x44, %zmm5, %zmm1, %zmm16 + vshufi32x4 $0xee, %zmm5, %zmm1, %zmm17 + vshufi32x4 $0x44, %zmm13, %zmm9, %zmm18 + vshufi32x4 $0xee, %zmm13, %zmm9, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 64(%rsi), %zmm20, %zmm20 + vmovdqu64 %zmm20, 64(%rdx) + vpxord 320(%rsi), %zmm21, %zmm21 + vmovdqu64 %zmm21, 320(%rdx) + vpxord 576(%rsi), %zmm22, %zmm22 + vmovdqu64 %zmm22, 576(%rdx) + vpxord 832(%rsi), %zmm23, %zmm23 + vmovdqu64 %zmm23, 832(%rdx) + vshufi32x4 $0x44, %zmm6, %zmm2, %zmm16 + vshufi32x4 $0xee, %zmm6, %zmm2, %zmm17 + vshufi32x4 $0x44, %zmm14, %zmm10, %zmm18 + vshufi32x4 $0xee, %zmm14, %zmm10, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 128(%rsi), %zmm20, %zmm20 + vmovdqu64 %zmm20, 128(%rdx) + vpxord 384(%rsi), %zmm21, %zmm21 + vmovdqu64 %zmm21, 384(%rdx) + vpxord 640(%rsi), %zmm22, %zmm22 + vmovdqu64 %zmm22, 640(%rdx) + vpxord 896(%rsi), %zmm23, %zmm23 + vmovdqu64 %zmm23, 896(%rdx) + vshufi32x4 $0x44, %zmm7, %zmm3, %zmm16 + vshufi32x4 $0xee, %zmm7, %zmm3, %zmm17 + vshufi32x4 $0x44, %zmm15, %zmm11, %zmm18 + vshufi32x4 $0xee, %zmm15, %zmm11, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 192(%rsi), %zmm20, %zmm20 + vmovdqu64 %zmm20, 192(%rdx) + vpxord 448(%rsi), %zmm21, %zmm21 + vmovdqu64 %zmm21, 448(%rdx) + vpxord 704(%rsi), %zmm22, %zmm22 + vmovdqu64 %zmm22, 704(%rdx) + vpxord 960(%rsi), %zmm23, %zmm23 + vmovdqu64 %zmm23, 960(%rdx) + addq $0x400, %rsi + addq $0x400, %rdx + addl $16, 48(%rdi) + subl $0x400, %ecx + cmpl $0x400, %ecx + jge L_chacha20_avx512_start512 +L_chacha20_avx512_end512: +#ifndef __APPLE__ + callq chacha_encrypt_avx2@plt +#else + callq _chacha_encrypt_avx2 +#endif /* __APPLE__ */ + vzeroupper + addq $8, %rsp + repz retq +#ifndef __APPLE__ +.size chacha_encrypt_avx512,.-chacha_encrypt_avx512 +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX512 */ +#ifdef HAVE_INTEL_AVX512 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_chacha20_poly1305_add: +.quad 0x0000000100000000,0x0000000300000002 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_chacha20_poly1305_four: +.quad 0x0000000400000004,0x0000000400000004 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_chacha20_poly1305_mask: +.quad 0x0000000003ffffff,0x0000000003ffffff +.quad 0x0000000003ffffff,0x0000000003ffffff +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_chacha20_poly1305_hibit: +.quad 0x0000000001000000,0x0000000001000000 +.quad 0x0000000001000000,0x0000000001000000 +#ifndef __APPLE__ +.text +.globl chacha20_poly1305_avx512 +.type chacha20_poly1305_avx512,@function +.align 16 +chacha20_poly1305_avx512: +#else +.section __TEXT,__text +.globl _chacha20_poly1305_avx512 +.p2align 4 +_chacha20_poly1305_avx512: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + subq $0x2d0, %rsp + leaq L_chacha20_poly1305_add(%rip), %r10 + leaq L_chacha20_poly1305_four(%rip), %r11 + leaq L_chacha20_poly1305_mask(%rip), %r12 + leaq L_chacha20_poly1305_hibit(%rip), %r13 + movq %rsp, %r14 + addq $15, %r14 + andq $-16, %r14 + leaq 272(%rsp), %r15 + addq $15, %r15 + andq $-16, %r15 + leaq 416(%rsp), %rbx + leaq 576(%rsp), %rbp + vpxor %xmm15, %xmm15, %xmm15 + leaq 64(%rsi), %r9 + vmovdqu (%r9), %ymm0 + vmovdqu 32(%r9), %ymm1 + vmovdqu 64(%r9), %ymm2 + vmovdqu 96(%r9), %ymm3 + vmovdqu 128(%r9), %ymm4 + vmovdqu 320(%rsi), %ymm13 + vpermq $0x00, %ymm13, %ymm5 + vpsrlq $32, %ymm13, %ymm14 + vpermq $0x55, %ymm13, %ymm7 + vpermq $0xaa, %ymm13, %ymm9 + vpermq $0x00, %ymm14, %ymm6 + vpermq $0x55, %ymm14, %ymm8 + vpslld $2, %ymm6, %ymm10 + vpslld $2, %ymm7, %ymm11 + vpslld $2, %ymm8, %ymm12 + vpslld $2, %ymm9, %ymm13 + vpaddq %ymm10, %ymm6, %ymm10 + vpaddq %ymm11, %ymm7, %ymm11 + vpaddq %ymm12, %ymm8, %ymm12 + vpaddq %ymm13, %ymm9, %ymm13 + vmovdqu %ymm10, (%rbp) + vmovdqu %ymm11, 32(%rbp) + vmovdqu %ymm12, 64(%rbp) + vmovdqu %ymm13, 96(%rbp) + vmovdqu %ymm5, (%rbx) + vmovdqu %ymm6, 32(%rbx) + vmovdqu %ymm7, 64(%rbx) + vmovdqu %ymm8, 96(%rbx) + vmovdqu %ymm9, 128(%rbx) + vmovdqu (%r12), %ymm14 + vpbroadcastd (%rdi), %xmm16 + vpbroadcastd 4(%rdi), %xmm17 + vpbroadcastd 8(%rdi), %xmm18 + vpbroadcastd 12(%rdi), %xmm19 + vpbroadcastd 16(%rdi), %xmm20 + vpbroadcastd 20(%rdi), %xmm21 + vpbroadcastd 24(%rdi), %xmm22 + vpbroadcastd 28(%rdi), %xmm23 + vpbroadcastd 32(%rdi), %xmm24 + vpbroadcastd 36(%rdi), %xmm25 + vpbroadcastd 40(%rdi), %xmm26 + vpbroadcastd 44(%rdi), %xmm27 + vpbroadcastd 48(%rdi), %xmm28 + vpbroadcastd 52(%rdi), %xmm29 + vpbroadcastd 56(%rdi), %xmm30 + vpbroadcastd 60(%rdi), %xmm31 + vpaddd (%r10), %xmm28, %xmm28 + vmovdqa64 %xmm16, (%r14) + vmovdqa64 %xmm17, 16(%r14) + vmovdqa64 %xmm18, 32(%r14) + vmovdqa64 %xmm19, 48(%r14) + vmovdqa64 %xmm20, 64(%r14) + vmovdqa64 %xmm21, 80(%r14) + vmovdqa64 %xmm22, 96(%r14) + vmovdqa64 %xmm23, 112(%r14) + vmovdqa64 %xmm24, 128(%r14) + vmovdqa64 %xmm25, 144(%r14) + vmovdqa64 %xmm26, 160(%r14) + vmovdqa64 %xmm27, 176(%r14) + vmovdqa64 %xmm28, 192(%r14) + vmovdqa64 %xmm29, 208(%r14) + vmovdqa64 %xmm30, 224(%r14) + vmovdqa64 %xmm31, 240(%r14) + movb $10, %al +L_chacha20_poly1305_rounds: + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + decb %al + jnz L_chacha20_poly1305_rounds + vpaddd (%r14), %xmm16, %xmm16 + vpaddd 16(%r14), %xmm17, %xmm17 + vpaddd 32(%r14), %xmm18, %xmm18 + vpaddd 48(%r14), %xmm19, %xmm19 + vpaddd 64(%r14), %xmm20, %xmm20 + vpaddd 80(%r14), %xmm21, %xmm21 + vpaddd 96(%r14), %xmm22, %xmm22 + vpaddd 112(%r14), %xmm23, %xmm23 + vpaddd 128(%r14), %xmm24, %xmm24 + vpaddd 144(%r14), %xmm25, %xmm25 + vpaddd 160(%r14), %xmm26, %xmm26 + vpaddd 176(%r14), %xmm27, %xmm27 + vpaddd 192(%r14), %xmm28, %xmm28 + vpaddd 208(%r14), %xmm29, %xmm29 + vpaddd 224(%r14), %xmm30, %xmm30 + vpaddd 240(%r14), %xmm31, %xmm31 + vmovdqa64 %xmm24, (%r15) + vmovdqa64 %xmm25, 16(%r15) + vmovdqa64 %xmm26, 32(%r15) + vmovdqa64 %xmm27, 48(%r15) + vmovdqa64 %xmm28, 64(%r15) + vmovdqa64 %xmm29, 80(%r15) + vmovdqa64 %xmm30, 96(%r15) + vmovdqa64 %xmm31, 112(%r15) + vpunpckldq %xmm17, %xmm16, %xmm24 + vpunpckldq %xmm19, %xmm18, %xmm25 + vpunpckhdq %xmm17, %xmm16, %xmm28 + vpunpckhdq %xmm19, %xmm18, %xmm29 + vpunpckldq %xmm21, %xmm20, %xmm26 + vpunpckldq %xmm23, %xmm22, %xmm27 + vpunpckhdq %xmm21, %xmm20, %xmm30 + vpunpckhdq %xmm23, %xmm22, %xmm31 + vpunpcklqdq %xmm25, %xmm24, %xmm16 + vpunpcklqdq %xmm27, %xmm26, %xmm17 + vpunpckhqdq %xmm25, %xmm24, %xmm18 + vpunpckhqdq %xmm27, %xmm26, %xmm19 + vpunpcklqdq %xmm29, %xmm28, %xmm20 + vpunpcklqdq %xmm31, %xmm30, %xmm21 + vpunpckhqdq %xmm29, %xmm28, %xmm22 + vpunpckhqdq %xmm31, %xmm30, %xmm23 + vmovdqu64 (%rdx), %xmm24 + vmovdqu64 16(%rdx), %xmm25 + vmovdqu64 64(%rdx), %xmm26 + vmovdqu64 80(%rdx), %xmm27 + vmovdqu64 128(%rdx), %xmm28 + vmovdqu64 144(%rdx), %xmm29 + vmovdqu64 192(%rdx), %xmm30 + vmovdqu64 208(%rdx), %xmm31 + vpxord %xmm24, %xmm16, %xmm16 + vpxord %xmm25, %xmm17, %xmm17 + vpxord %xmm26, %xmm18, %xmm18 + vpxord %xmm27, %xmm19, %xmm19 + vpxord %xmm28, %xmm20, %xmm20 + vpxord %xmm29, %xmm21, %xmm21 + vpxord %xmm30, %xmm22, %xmm22 + vpxord %xmm31, %xmm23, %xmm23 + vmovdqu64 %xmm16, (%rcx) + vmovdqu64 %xmm17, 16(%rcx) + vmovdqu64 %xmm18, 64(%rcx) + vmovdqu64 %xmm19, 80(%rcx) + vmovdqu64 %xmm20, 128(%rcx) + vmovdqu64 %xmm21, 144(%rcx) + vmovdqu64 %xmm22, 192(%rcx) + vmovdqu64 %xmm23, 208(%rcx) + vmovdqa64 (%r15), %xmm16 + vmovdqa64 16(%r15), %xmm17 + vmovdqa64 32(%r15), %xmm18 + vmovdqa64 48(%r15), %xmm19 + vmovdqa64 64(%r15), %xmm20 + vmovdqa64 80(%r15), %xmm21 + vmovdqa64 96(%r15), %xmm22 + vmovdqa64 112(%r15), %xmm23 + vpunpckldq %xmm17, %xmm16, %xmm24 + vpunpckldq %xmm19, %xmm18, %xmm25 + vpunpckhdq %xmm17, %xmm16, %xmm28 + vpunpckhdq %xmm19, %xmm18, %xmm29 + vpunpckldq %xmm21, %xmm20, %xmm26 + vpunpckldq %xmm23, %xmm22, %xmm27 + vpunpckhdq %xmm21, %xmm20, %xmm30 + vpunpckhdq %xmm23, %xmm22, %xmm31 + vpunpcklqdq %xmm25, %xmm24, %xmm16 + vpunpcklqdq %xmm27, %xmm26, %xmm17 + vpunpckhqdq %xmm25, %xmm24, %xmm18 + vpunpckhqdq %xmm27, %xmm26, %xmm19 + vpunpcklqdq %xmm29, %xmm28, %xmm20 + vpunpcklqdq %xmm31, %xmm30, %xmm21 + vpunpckhqdq %xmm29, %xmm28, %xmm22 + vpunpckhqdq %xmm31, %xmm30, %xmm23 + vmovdqu64 32(%rdx), %xmm24 + vmovdqu64 48(%rdx), %xmm25 + vmovdqu64 96(%rdx), %xmm26 + vmovdqu64 112(%rdx), %xmm27 + vmovdqu64 160(%rdx), %xmm28 + vmovdqu64 176(%rdx), %xmm29 + vmovdqu64 224(%rdx), %xmm30 + vmovdqu64 240(%rdx), %xmm31 + vpxord %xmm24, %xmm16, %xmm16 + vpxord %xmm25, %xmm17, %xmm17 + vpxord %xmm26, %xmm18, %xmm18 + vpxord %xmm27, %xmm19, %xmm19 + vpxord %xmm28, %xmm20, %xmm20 + vpxord %xmm29, %xmm21, %xmm21 + vpxord %xmm30, %xmm22, %xmm22 + vpxord %xmm31, %xmm23, %xmm23 + vmovdqu64 %xmm16, 32(%rcx) + vmovdqu64 %xmm17, 48(%rcx) + vmovdqu64 %xmm18, 96(%rcx) + vmovdqu64 %xmm19, 112(%rcx) + vmovdqu64 %xmm20, 160(%rcx) + vmovdqu64 %xmm21, 176(%rcx) + vmovdqu64 %xmm22, 224(%rcx) + vmovdqu64 %xmm23, 240(%rcx) + vmovdqa64 192(%r14), %xmm28 + vpaddd (%r11), %xmm28, %xmm28 + vmovdqa64 %xmm28, 192(%r14) + vmovdqa64 (%r14), %xmm16 + vmovdqa64 16(%r14), %xmm17 + vmovdqa64 32(%r14), %xmm18 + vmovdqa64 48(%r14), %xmm19 + vmovdqa64 64(%r14), %xmm20 + vmovdqa64 80(%r14), %xmm21 + vmovdqa64 96(%r14), %xmm22 + vmovdqa64 112(%r14), %xmm23 + vmovdqa64 128(%r14), %xmm24 + vmovdqa64 144(%r14), %xmm25 + vmovdqa64 160(%r14), %xmm26 + vmovdqa64 176(%r14), %xmm27 + vmovdqa64 192(%r14), %xmm28 + vmovdqa64 208(%r14), %xmm29 + vmovdqa64 224(%r14), %xmm30 + vmovdqa64 240(%r14), %xmm31 + addq $0x100, %rdx + addq $0x100, %rcx + subl $0x100, %r8d + jz L_chacha20_poly1305_epilogue +L_chacha20_poly1305_start: + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vmovdqu -256(%rcx), %ymm5 + vmovdqu -224(%rcx), %ymm6 + vperm2i128 $32, %ymm6, %ymm5, %ymm7 + vperm2i128 $49, %ymm6, %ymm5, %ymm5 + vpunpckldq %ymm5, %ymm7, %ymm6 + vpunpckhdq %ymm5, %ymm7, %ymm8 + vpunpckldq %ymm15, %ymm6, %ymm5 + vpunpckhdq %ymm15, %ymm6, %ymm6 + vpunpckldq %ymm15, %ymm8, %ymm7 + vpunpckhdq %ymm15, %ymm8, %ymm8 + vmovdqu (%r13), %ymm9 + vpsllq $6, %ymm6, %ymm6 + vpsllq $12, %ymm7, %ymm7 + vpsllq $18, %ymm8, %ymm8 + vpmuludq (%rbp), %ymm4, %ymm10 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 32(%rbp), %ymm3, %ymm10 + vpmuludq 32(%rbp), %ymm4, %ymm11 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 64(%rbp), %ymm3, %ymm11 + vpmuludq 64(%rbp), %ymm4, %ymm12 + vpaddq %ymm7, %ymm12, %ymm7 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 64(%rbp), %ymm2, %ymm12 + vpmuludq 96(%rbp), %ymm4, %ymm13 + vpaddq %ymm8, %ymm13, %ymm8 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 96(%rbp), %ymm1, %ymm13 + vpmuludq 96(%rbp), %ymm2, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpmuludq 96(%rbp), %ymm3, %ymm11 + vpmuludq (%rbx), %ymm3, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq (%rbx), %ymm4, %ymm13 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq (%rbx), %ymm0, %ymm13 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq (%rbx), %ymm1, %ymm10 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq (%rbx), %ymm2, %ymm11 + vpmuludq 32(%rbx), %ymm2, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq 32(%rbx), %ymm3, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 32(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 32(%rbx), %ymm1, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 64(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpmuludq 64(%rbx), %ymm2, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 64(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 96(%rbx), %ymm0, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 96(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm7, %ymm10, %ymm7 + vpmuludq 128(%rbx), %ymm0, %ymm13 + vpaddq %ymm8, %ymm11, %ymm8 + vpaddq %ymm9, %ymm12, %ymm9 + vpaddq %ymm9, %ymm13, %ymm9 + vpsrlq $26, %ymm5, %ymm10 + vpsrlq $26, %ymm8, %ymm11 + vpand %ymm14, %ymm5, %ymm5 + vpand %ymm14, %ymm8, %ymm8 + vpaddq %ymm6, %ymm10, %ymm6 + vpaddq %ymm9, %ymm11, %ymm9 + vpsrlq $26, %ymm6, %ymm10 + vpsrlq $26, %ymm9, %ymm11 + vpand %ymm14, %ymm6, %ymm1 + vpand %ymm14, %ymm9, %ymm4 + vpaddq %ymm7, %ymm10, %ymm7 + vpslld $2, %ymm11, %ymm12 + vpaddd %ymm12, %ymm11, %ymm12 + vpsrlq $26, %ymm7, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpsrlq $26, %ymm5, %ymm11 + vpand %ymm14, %ymm7, %ymm2 + vpand %ymm14, %ymm5, %ymm0 + vpaddq %ymm8, %ymm10, %ymm8 + vpaddq %ymm1, %ymm11, %ymm1 + vpsrlq $26, %ymm8, %ymm10 + vpand %ymm14, %ymm8, %ymm3 + vpaddq %ymm4, %ymm10, %ymm4 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vmovdqu -192(%rcx), %ymm5 + vmovdqu -160(%rcx), %ymm6 + vperm2i128 $32, %ymm6, %ymm5, %ymm7 + vperm2i128 $49, %ymm6, %ymm5, %ymm5 + vpunpckldq %ymm5, %ymm7, %ymm6 + vpunpckhdq %ymm5, %ymm7, %ymm8 + vpunpckldq %ymm15, %ymm6, %ymm5 + vpunpckhdq %ymm15, %ymm6, %ymm6 + vpunpckldq %ymm15, %ymm8, %ymm7 + vpunpckhdq %ymm15, %ymm8, %ymm8 + vmovdqu (%r13), %ymm9 + vpsllq $6, %ymm6, %ymm6 + vpsllq $12, %ymm7, %ymm7 + vpsllq $18, %ymm8, %ymm8 + vpmuludq (%rbp), %ymm4, %ymm10 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 32(%rbp), %ymm3, %ymm10 + vpmuludq 32(%rbp), %ymm4, %ymm11 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 64(%rbp), %ymm3, %ymm11 + vpmuludq 64(%rbp), %ymm4, %ymm12 + vpaddq %ymm7, %ymm12, %ymm7 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 64(%rbp), %ymm2, %ymm12 + vpmuludq 96(%rbp), %ymm4, %ymm13 + vpaddq %ymm8, %ymm13, %ymm8 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 96(%rbp), %ymm1, %ymm13 + vpmuludq 96(%rbp), %ymm2, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpmuludq 96(%rbp), %ymm3, %ymm11 + vpmuludq (%rbx), %ymm3, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq (%rbx), %ymm4, %ymm13 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq (%rbx), %ymm0, %ymm13 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq (%rbx), %ymm1, %ymm10 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq (%rbx), %ymm2, %ymm11 + vpmuludq 32(%rbx), %ymm2, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq 32(%rbx), %ymm3, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 32(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 32(%rbx), %ymm1, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 64(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpmuludq 64(%rbx), %ymm2, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 64(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 96(%rbx), %ymm0, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 96(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm7, %ymm10, %ymm7 + vpmuludq 128(%rbx), %ymm0, %ymm13 + vpaddq %ymm8, %ymm11, %ymm8 + vpaddq %ymm9, %ymm12, %ymm9 + vpaddq %ymm9, %ymm13, %ymm9 + vpsrlq $26, %ymm5, %ymm10 + vpsrlq $26, %ymm8, %ymm11 + vpand %ymm14, %ymm5, %ymm5 + vpand %ymm14, %ymm8, %ymm8 + vpaddq %ymm6, %ymm10, %ymm6 + vpaddq %ymm9, %ymm11, %ymm9 + vpsrlq $26, %ymm6, %ymm10 + vpsrlq $26, %ymm9, %ymm11 + vpand %ymm14, %ymm6, %ymm1 + vpand %ymm14, %ymm9, %ymm4 + vpaddq %ymm7, %ymm10, %ymm7 + vpslld $2, %ymm11, %ymm12 + vpaddd %ymm12, %ymm11, %ymm12 + vpsrlq $26, %ymm7, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpsrlq $26, %ymm5, %ymm11 + vpand %ymm14, %ymm7, %ymm2 + vpand %ymm14, %ymm5, %ymm0 + vpaddq %ymm8, %ymm10, %ymm8 + vpaddq %ymm1, %ymm11, %ymm1 + vpsrlq $26, %ymm8, %ymm10 + vpand %ymm14, %ymm8, %ymm3 + vpaddq %ymm4, %ymm10, %ymm4 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vmovdqu -128(%rcx), %ymm5 + vmovdqu -96(%rcx), %ymm6 + vperm2i128 $32, %ymm6, %ymm5, %ymm7 + vperm2i128 $49, %ymm6, %ymm5, %ymm5 + vpunpckldq %ymm5, %ymm7, %ymm6 + vpunpckhdq %ymm5, %ymm7, %ymm8 + vpunpckldq %ymm15, %ymm6, %ymm5 + vpunpckhdq %ymm15, %ymm6, %ymm6 + vpunpckldq %ymm15, %ymm8, %ymm7 + vpunpckhdq %ymm15, %ymm8, %ymm8 + vmovdqu (%r13), %ymm9 + vpsllq $6, %ymm6, %ymm6 + vpsllq $12, %ymm7, %ymm7 + vpsllq $18, %ymm8, %ymm8 + vpmuludq (%rbp), %ymm4, %ymm10 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 32(%rbp), %ymm3, %ymm10 + vpmuludq 32(%rbp), %ymm4, %ymm11 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 64(%rbp), %ymm3, %ymm11 + vpmuludq 64(%rbp), %ymm4, %ymm12 + vpaddq %ymm7, %ymm12, %ymm7 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 64(%rbp), %ymm2, %ymm12 + vpmuludq 96(%rbp), %ymm4, %ymm13 + vpaddq %ymm8, %ymm13, %ymm8 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 96(%rbp), %ymm1, %ymm13 + vpmuludq 96(%rbp), %ymm2, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpmuludq 96(%rbp), %ymm3, %ymm11 + vpmuludq (%rbx), %ymm3, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq (%rbx), %ymm4, %ymm13 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq (%rbx), %ymm0, %ymm13 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq (%rbx), %ymm1, %ymm10 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq (%rbx), %ymm2, %ymm11 + vpmuludq 32(%rbx), %ymm2, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq 32(%rbx), %ymm3, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 32(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 32(%rbx), %ymm1, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 64(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpmuludq 64(%rbx), %ymm2, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 64(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 96(%rbx), %ymm0, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 96(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm7, %ymm10, %ymm7 + vpmuludq 128(%rbx), %ymm0, %ymm13 + vpaddq %ymm8, %ymm11, %ymm8 + vpaddq %ymm9, %ymm12, %ymm9 + vpaddq %ymm9, %ymm13, %ymm9 + vpsrlq $26, %ymm5, %ymm10 + vpsrlq $26, %ymm8, %ymm11 + vpand %ymm14, %ymm5, %ymm5 + vpand %ymm14, %ymm8, %ymm8 + vpaddq %ymm6, %ymm10, %ymm6 + vpaddq %ymm9, %ymm11, %ymm9 + vpsrlq $26, %ymm6, %ymm10 + vpsrlq $26, %ymm9, %ymm11 + vpand %ymm14, %ymm6, %ymm1 + vpand %ymm14, %ymm9, %ymm4 + vpaddq %ymm7, %ymm10, %ymm7 + vpslld $2, %ymm11, %ymm12 + vpaddd %ymm12, %ymm11, %ymm12 + vpsrlq $26, %ymm7, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpsrlq $26, %ymm5, %ymm11 + vpand %ymm14, %ymm7, %ymm2 + vpand %ymm14, %ymm5, %ymm0 + vpaddq %ymm8, %ymm10, %ymm8 + vpaddq %ymm1, %ymm11, %ymm1 + vpsrlq $26, %ymm8, %ymm10 + vpand %ymm14, %ymm8, %ymm3 + vpaddq %ymm4, %ymm10, %ymm4 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vmovdqu -64(%rcx), %ymm5 + vmovdqu -32(%rcx), %ymm6 + vperm2i128 $32, %ymm6, %ymm5, %ymm7 + vperm2i128 $49, %ymm6, %ymm5, %ymm5 + vpunpckldq %ymm5, %ymm7, %ymm6 + vpunpckhdq %ymm5, %ymm7, %ymm8 + vpunpckldq %ymm15, %ymm6, %ymm5 + vpunpckhdq %ymm15, %ymm6, %ymm6 + vpunpckldq %ymm15, %ymm8, %ymm7 + vpunpckhdq %ymm15, %ymm8, %ymm8 + vmovdqu (%r13), %ymm9 + vpsllq $6, %ymm6, %ymm6 + vpsllq $12, %ymm7, %ymm7 + vpsllq $18, %ymm8, %ymm8 + vpmuludq (%rbp), %ymm4, %ymm10 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 32(%rbp), %ymm3, %ymm10 + vpmuludq 32(%rbp), %ymm4, %ymm11 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 64(%rbp), %ymm3, %ymm11 + vpmuludq 64(%rbp), %ymm4, %ymm12 + vpaddq %ymm7, %ymm12, %ymm7 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 64(%rbp), %ymm2, %ymm12 + vpmuludq 96(%rbp), %ymm4, %ymm13 + vpaddq %ymm8, %ymm13, %ymm8 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 96(%rbp), %ymm1, %ymm13 + vpmuludq 96(%rbp), %ymm2, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpmuludq 96(%rbp), %ymm3, %ymm11 + vpmuludq (%rbx), %ymm3, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq (%rbx), %ymm4, %ymm13 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq (%rbx), %ymm0, %ymm13 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq (%rbx), %ymm1, %ymm10 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq (%rbx), %ymm2, %ymm11 + vpmuludq 32(%rbx), %ymm2, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq 32(%rbx), %ymm3, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 32(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 32(%rbx), %ymm1, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 64(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpmuludq 64(%rbx), %ymm2, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 64(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 96(%rbx), %ymm0, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 96(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm7, %ymm10, %ymm7 + vpmuludq 128(%rbx), %ymm0, %ymm13 + vpaddq %ymm8, %ymm11, %ymm8 + vpaddq %ymm9, %ymm12, %ymm9 + vpaddq %ymm9, %ymm13, %ymm9 + vpsrlq $26, %ymm5, %ymm10 + vpsrlq $26, %ymm8, %ymm11 + vpand %ymm14, %ymm5, %ymm5 + vpand %ymm14, %ymm8, %ymm8 + vpaddq %ymm6, %ymm10, %ymm6 + vpaddq %ymm9, %ymm11, %ymm9 + vpsrlq $26, %ymm6, %ymm10 + vpsrlq $26, %ymm9, %ymm11 + vpand %ymm14, %ymm6, %ymm1 + vpand %ymm14, %ymm9, %ymm4 + vpaddq %ymm7, %ymm10, %ymm7 + vpslld $2, %ymm11, %ymm12 + vpaddd %ymm12, %ymm11, %ymm12 + vpsrlq $26, %ymm7, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpsrlq $26, %ymm5, %ymm11 + vpand %ymm14, %ymm7, %ymm2 + vpand %ymm14, %ymm5, %ymm0 + vpaddq %ymm8, %ymm10, %ymm8 + vpaddq %ymm1, %ymm11, %ymm1 + vpsrlq $26, %ymm8, %ymm10 + vpand %ymm14, %ymm8, %ymm3 + vpaddq %ymm4, %ymm10, %ymm4 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vpaddd %xmm20, %xmm16, %xmm16 + vpaddd %xmm21, %xmm17, %xmm17 + vpaddd %xmm22, %xmm18, %xmm18 + vpaddd %xmm23, %xmm19, %xmm19 + vpxord %xmm16, %xmm28, %xmm28 + vpxord %xmm17, %xmm29, %xmm29 + vpxord %xmm18, %xmm30, %xmm30 + vpxord %xmm19, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vpaddd %xmm28, %xmm24, %xmm24 + vpaddd %xmm29, %xmm25, %xmm25 + vpaddd %xmm30, %xmm26, %xmm26 + vpaddd %xmm31, %xmm27, %xmm27 + vpxord %xmm24, %xmm20, %xmm20 + vpxord %xmm25, %xmm21, %xmm21 + vpxord %xmm26, %xmm22, %xmm22 + vpxord %xmm27, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $16, %xmm31, %xmm31 + vprold $16, %xmm28, %xmm28 + vprold $16, %xmm29, %xmm29 + vprold $16, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $12, %xmm21, %xmm21 + vprold $12, %xmm22, %xmm22 + vprold $12, %xmm23, %xmm23 + vprold $12, %xmm20, %xmm20 + vpaddd %xmm21, %xmm16, %xmm16 + vpaddd %xmm22, %xmm17, %xmm17 + vpaddd %xmm23, %xmm18, %xmm18 + vpaddd %xmm20, %xmm19, %xmm19 + vpxord %xmm16, %xmm31, %xmm31 + vpxord %xmm17, %xmm28, %xmm28 + vpxord %xmm18, %xmm29, %xmm29 + vpxord %xmm19, %xmm30, %xmm30 + vprold $8, %xmm31, %xmm31 + vprold $8, %xmm28, %xmm28 + vprold $8, %xmm29, %xmm29 + vprold $8, %xmm30, %xmm30 + vpaddd %xmm31, %xmm26, %xmm26 + vpaddd %xmm28, %xmm27, %xmm27 + vpaddd %xmm29, %xmm24, %xmm24 + vpaddd %xmm30, %xmm25, %xmm25 + vpxord %xmm26, %xmm21, %xmm21 + vpxord %xmm27, %xmm22, %xmm22 + vpxord %xmm24, %xmm23, %xmm23 + vpxord %xmm25, %xmm20, %xmm20 + vprold $7, %xmm21, %xmm21 + vprold $7, %xmm22, %xmm22 + vprold $7, %xmm23, %xmm23 + vprold $7, %xmm20, %xmm20 + vpaddd (%r14), %xmm16, %xmm16 + vpaddd 16(%r14), %xmm17, %xmm17 + vpaddd 32(%r14), %xmm18, %xmm18 + vpaddd 48(%r14), %xmm19, %xmm19 + vpaddd 64(%r14), %xmm20, %xmm20 + vpaddd 80(%r14), %xmm21, %xmm21 + vpaddd 96(%r14), %xmm22, %xmm22 + vpaddd 112(%r14), %xmm23, %xmm23 + vpaddd 128(%r14), %xmm24, %xmm24 + vpaddd 144(%r14), %xmm25, %xmm25 + vpaddd 160(%r14), %xmm26, %xmm26 + vpaddd 176(%r14), %xmm27, %xmm27 + vpaddd 192(%r14), %xmm28, %xmm28 + vpaddd 208(%r14), %xmm29, %xmm29 + vpaddd 224(%r14), %xmm30, %xmm30 + vpaddd 240(%r14), %xmm31, %xmm31 + vmovdqa64 %xmm24, (%r15) + vmovdqa64 %xmm25, 16(%r15) + vmovdqa64 %xmm26, 32(%r15) + vmovdqa64 %xmm27, 48(%r15) + vmovdqa64 %xmm28, 64(%r15) + vmovdqa64 %xmm29, 80(%r15) + vmovdqa64 %xmm30, 96(%r15) + vmovdqa64 %xmm31, 112(%r15) + vpunpckldq %xmm17, %xmm16, %xmm24 + vpunpckldq %xmm19, %xmm18, %xmm25 + vpunpckhdq %xmm17, %xmm16, %xmm28 + vpunpckhdq %xmm19, %xmm18, %xmm29 + vpunpckldq %xmm21, %xmm20, %xmm26 + vpunpckldq %xmm23, %xmm22, %xmm27 + vpunpckhdq %xmm21, %xmm20, %xmm30 + vpunpckhdq %xmm23, %xmm22, %xmm31 + vpunpcklqdq %xmm25, %xmm24, %xmm16 + vpunpcklqdq %xmm27, %xmm26, %xmm17 + vpunpckhqdq %xmm25, %xmm24, %xmm18 + vpunpckhqdq %xmm27, %xmm26, %xmm19 + vpunpcklqdq %xmm29, %xmm28, %xmm20 + vpunpcklqdq %xmm31, %xmm30, %xmm21 + vpunpckhqdq %xmm29, %xmm28, %xmm22 + vpunpckhqdq %xmm31, %xmm30, %xmm23 + vmovdqu64 (%rdx), %xmm24 + vmovdqu64 16(%rdx), %xmm25 + vmovdqu64 64(%rdx), %xmm26 + vmovdqu64 80(%rdx), %xmm27 + vmovdqu64 128(%rdx), %xmm28 + vmovdqu64 144(%rdx), %xmm29 + vmovdqu64 192(%rdx), %xmm30 + vmovdqu64 208(%rdx), %xmm31 + vpxord %xmm24, %xmm16, %xmm16 + vpxord %xmm25, %xmm17, %xmm17 + vpxord %xmm26, %xmm18, %xmm18 + vpxord %xmm27, %xmm19, %xmm19 + vpxord %xmm28, %xmm20, %xmm20 + vpxord %xmm29, %xmm21, %xmm21 + vpxord %xmm30, %xmm22, %xmm22 + vpxord %xmm31, %xmm23, %xmm23 + vmovdqu64 %xmm16, (%rcx) + vmovdqu64 %xmm17, 16(%rcx) + vmovdqu64 %xmm18, 64(%rcx) + vmovdqu64 %xmm19, 80(%rcx) + vmovdqu64 %xmm20, 128(%rcx) + vmovdqu64 %xmm21, 144(%rcx) + vmovdqu64 %xmm22, 192(%rcx) + vmovdqu64 %xmm23, 208(%rcx) + vmovdqa64 (%r15), %xmm16 + vmovdqa64 16(%r15), %xmm17 + vmovdqa64 32(%r15), %xmm18 + vmovdqa64 48(%r15), %xmm19 + vmovdqa64 64(%r15), %xmm20 + vmovdqa64 80(%r15), %xmm21 + vmovdqa64 96(%r15), %xmm22 + vmovdqa64 112(%r15), %xmm23 + vpunpckldq %xmm17, %xmm16, %xmm24 + vpunpckldq %xmm19, %xmm18, %xmm25 + vpunpckhdq %xmm17, %xmm16, %xmm28 + vpunpckhdq %xmm19, %xmm18, %xmm29 + vpunpckldq %xmm21, %xmm20, %xmm26 + vpunpckldq %xmm23, %xmm22, %xmm27 + vpunpckhdq %xmm21, %xmm20, %xmm30 + vpunpckhdq %xmm23, %xmm22, %xmm31 + vpunpcklqdq %xmm25, %xmm24, %xmm16 + vpunpcklqdq %xmm27, %xmm26, %xmm17 + vpunpckhqdq %xmm25, %xmm24, %xmm18 + vpunpckhqdq %xmm27, %xmm26, %xmm19 + vpunpcklqdq %xmm29, %xmm28, %xmm20 + vpunpcklqdq %xmm31, %xmm30, %xmm21 + vpunpckhqdq %xmm29, %xmm28, %xmm22 + vpunpckhqdq %xmm31, %xmm30, %xmm23 + vmovdqu64 32(%rdx), %xmm24 + vmovdqu64 48(%rdx), %xmm25 + vmovdqu64 96(%rdx), %xmm26 + vmovdqu64 112(%rdx), %xmm27 + vmovdqu64 160(%rdx), %xmm28 + vmovdqu64 176(%rdx), %xmm29 + vmovdqu64 224(%rdx), %xmm30 + vmovdqu64 240(%rdx), %xmm31 + vpxord %xmm24, %xmm16, %xmm16 + vpxord %xmm25, %xmm17, %xmm17 + vpxord %xmm26, %xmm18, %xmm18 + vpxord %xmm27, %xmm19, %xmm19 + vpxord %xmm28, %xmm20, %xmm20 + vpxord %xmm29, %xmm21, %xmm21 + vpxord %xmm30, %xmm22, %xmm22 + vpxord %xmm31, %xmm23, %xmm23 + vmovdqu64 %xmm16, 32(%rcx) + vmovdqu64 %xmm17, 48(%rcx) + vmovdqu64 %xmm18, 96(%rcx) + vmovdqu64 %xmm19, 112(%rcx) + vmovdqu64 %xmm20, 160(%rcx) + vmovdqu64 %xmm21, 176(%rcx) + vmovdqu64 %xmm22, 224(%rcx) + vmovdqu64 %xmm23, 240(%rcx) + vmovdqa64 192(%r14), %xmm28 + vpaddd (%r11), %xmm28, %xmm28 + vmovdqa64 %xmm28, 192(%r14) + vmovdqa64 (%r14), %xmm16 + vmovdqa64 16(%r14), %xmm17 + vmovdqa64 32(%r14), %xmm18 + vmovdqa64 48(%r14), %xmm19 + vmovdqa64 64(%r14), %xmm20 + vmovdqa64 80(%r14), %xmm21 + vmovdqa64 96(%r14), %xmm22 + vmovdqa64 112(%r14), %xmm23 + vmovdqa64 128(%r14), %xmm24 + vmovdqa64 144(%r14), %xmm25 + vmovdqa64 160(%r14), %xmm26 + vmovdqa64 176(%r14), %xmm27 + vmovdqa64 192(%r14), %xmm28 + vmovdqa64 208(%r14), %xmm29 + vmovdqa64 224(%r14), %xmm30 + vmovdqa64 240(%r14), %xmm31 + addq $0x100, %rdx + addq $0x100, %rcx + subl $0x100, %r8d + jnz L_chacha20_poly1305_start +L_chacha20_poly1305_epilogue: + vmovdqu -256(%rcx), %ymm5 + vmovdqu -224(%rcx), %ymm6 + vperm2i128 $32, %ymm6, %ymm5, %ymm7 + vperm2i128 $49, %ymm6, %ymm5, %ymm5 + vpunpckldq %ymm5, %ymm7, %ymm6 + vpunpckhdq %ymm5, %ymm7, %ymm8 + vpunpckldq %ymm15, %ymm6, %ymm5 + vpunpckhdq %ymm15, %ymm6, %ymm6 + vpunpckldq %ymm15, %ymm8, %ymm7 + vpunpckhdq %ymm15, %ymm8, %ymm8 + vmovdqu (%r13), %ymm9 + vpsllq $6, %ymm6, %ymm6 + vpsllq $12, %ymm7, %ymm7 + vpsllq $18, %ymm8, %ymm8 + vpmuludq (%rbp), %ymm4, %ymm10 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 32(%rbp), %ymm3, %ymm10 + vpmuludq 32(%rbp), %ymm4, %ymm11 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 64(%rbp), %ymm3, %ymm11 + vpmuludq 64(%rbp), %ymm4, %ymm12 + vpaddq %ymm7, %ymm12, %ymm7 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 64(%rbp), %ymm2, %ymm12 + vpmuludq 96(%rbp), %ymm4, %ymm13 + vpaddq %ymm8, %ymm13, %ymm8 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 96(%rbp), %ymm1, %ymm13 + vpmuludq 96(%rbp), %ymm2, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpmuludq 96(%rbp), %ymm3, %ymm11 + vpmuludq (%rbx), %ymm3, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq (%rbx), %ymm4, %ymm13 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq (%rbx), %ymm0, %ymm13 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq (%rbx), %ymm1, %ymm10 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq (%rbx), %ymm2, %ymm11 + vpmuludq 32(%rbx), %ymm2, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq 32(%rbx), %ymm3, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 32(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 32(%rbx), %ymm1, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 64(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpmuludq 64(%rbx), %ymm2, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 64(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 96(%rbx), %ymm0, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 96(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm7, %ymm10, %ymm7 + vpmuludq 128(%rbx), %ymm0, %ymm13 + vpaddq %ymm8, %ymm11, %ymm8 + vpaddq %ymm9, %ymm12, %ymm9 + vpaddq %ymm9, %ymm13, %ymm9 + vpsrlq $26, %ymm5, %ymm10 + vpsrlq $26, %ymm8, %ymm11 + vpand %ymm14, %ymm5, %ymm5 + vpand %ymm14, %ymm8, %ymm8 + vpaddq %ymm6, %ymm10, %ymm6 + vpaddq %ymm9, %ymm11, %ymm9 + vpsrlq $26, %ymm6, %ymm10 + vpsrlq $26, %ymm9, %ymm11 + vpand %ymm14, %ymm6, %ymm1 + vpand %ymm14, %ymm9, %ymm4 + vpaddq %ymm7, %ymm10, %ymm7 + vpslld $2, %ymm11, %ymm12 + vpaddd %ymm12, %ymm11, %ymm12 + vpsrlq $26, %ymm7, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpsrlq $26, %ymm5, %ymm11 + vpand %ymm14, %ymm7, %ymm2 + vpand %ymm14, %ymm5, %ymm0 + vpaddq %ymm8, %ymm10, %ymm8 + vpaddq %ymm1, %ymm11, %ymm1 + vpsrlq $26, %ymm8, %ymm10 + vpand %ymm14, %ymm8, %ymm3 + vpaddq %ymm4, %ymm10, %ymm4 + vmovdqu -192(%rcx), %ymm5 + vmovdqu -160(%rcx), %ymm6 + vperm2i128 $32, %ymm6, %ymm5, %ymm7 + vperm2i128 $49, %ymm6, %ymm5, %ymm5 + vpunpckldq %ymm5, %ymm7, %ymm6 + vpunpckhdq %ymm5, %ymm7, %ymm8 + vpunpckldq %ymm15, %ymm6, %ymm5 + vpunpckhdq %ymm15, %ymm6, %ymm6 + vpunpckldq %ymm15, %ymm8, %ymm7 + vpunpckhdq %ymm15, %ymm8, %ymm8 + vmovdqu (%r13), %ymm9 + vpsllq $6, %ymm6, %ymm6 + vpsllq $12, %ymm7, %ymm7 + vpsllq $18, %ymm8, %ymm8 + vpmuludq (%rbp), %ymm4, %ymm10 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 32(%rbp), %ymm3, %ymm10 + vpmuludq 32(%rbp), %ymm4, %ymm11 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 64(%rbp), %ymm3, %ymm11 + vpmuludq 64(%rbp), %ymm4, %ymm12 + vpaddq %ymm7, %ymm12, %ymm7 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 64(%rbp), %ymm2, %ymm12 + vpmuludq 96(%rbp), %ymm4, %ymm13 + vpaddq %ymm8, %ymm13, %ymm8 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 96(%rbp), %ymm1, %ymm13 + vpmuludq 96(%rbp), %ymm2, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpmuludq 96(%rbp), %ymm3, %ymm11 + vpmuludq (%rbx), %ymm3, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq (%rbx), %ymm4, %ymm13 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq (%rbx), %ymm0, %ymm13 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq (%rbx), %ymm1, %ymm10 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq (%rbx), %ymm2, %ymm11 + vpmuludq 32(%rbx), %ymm2, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq 32(%rbx), %ymm3, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 32(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 32(%rbx), %ymm1, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 64(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpmuludq 64(%rbx), %ymm2, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 64(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 96(%rbx), %ymm0, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 96(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm7, %ymm10, %ymm7 + vpmuludq 128(%rbx), %ymm0, %ymm13 + vpaddq %ymm8, %ymm11, %ymm8 + vpaddq %ymm9, %ymm12, %ymm9 + vpaddq %ymm9, %ymm13, %ymm9 + vpsrlq $26, %ymm5, %ymm10 + vpsrlq $26, %ymm8, %ymm11 + vpand %ymm14, %ymm5, %ymm5 + vpand %ymm14, %ymm8, %ymm8 + vpaddq %ymm6, %ymm10, %ymm6 + vpaddq %ymm9, %ymm11, %ymm9 + vpsrlq $26, %ymm6, %ymm10 + vpsrlq $26, %ymm9, %ymm11 + vpand %ymm14, %ymm6, %ymm1 + vpand %ymm14, %ymm9, %ymm4 + vpaddq %ymm7, %ymm10, %ymm7 + vpslld $2, %ymm11, %ymm12 + vpaddd %ymm12, %ymm11, %ymm12 + vpsrlq $26, %ymm7, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpsrlq $26, %ymm5, %ymm11 + vpand %ymm14, %ymm7, %ymm2 + vpand %ymm14, %ymm5, %ymm0 + vpaddq %ymm8, %ymm10, %ymm8 + vpaddq %ymm1, %ymm11, %ymm1 + vpsrlq $26, %ymm8, %ymm10 + vpand %ymm14, %ymm8, %ymm3 + vpaddq %ymm4, %ymm10, %ymm4 + vmovdqu -128(%rcx), %ymm5 + vmovdqu -96(%rcx), %ymm6 + vperm2i128 $32, %ymm6, %ymm5, %ymm7 + vperm2i128 $49, %ymm6, %ymm5, %ymm5 + vpunpckldq %ymm5, %ymm7, %ymm6 + vpunpckhdq %ymm5, %ymm7, %ymm8 + vpunpckldq %ymm15, %ymm6, %ymm5 + vpunpckhdq %ymm15, %ymm6, %ymm6 + vpunpckldq %ymm15, %ymm8, %ymm7 + vpunpckhdq %ymm15, %ymm8, %ymm8 + vmovdqu (%r13), %ymm9 + vpsllq $6, %ymm6, %ymm6 + vpsllq $12, %ymm7, %ymm7 + vpsllq $18, %ymm8, %ymm8 + vpmuludq (%rbp), %ymm4, %ymm10 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 32(%rbp), %ymm3, %ymm10 + vpmuludq 32(%rbp), %ymm4, %ymm11 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 64(%rbp), %ymm3, %ymm11 + vpmuludq 64(%rbp), %ymm4, %ymm12 + vpaddq %ymm7, %ymm12, %ymm7 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 64(%rbp), %ymm2, %ymm12 + vpmuludq 96(%rbp), %ymm4, %ymm13 + vpaddq %ymm8, %ymm13, %ymm8 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 96(%rbp), %ymm1, %ymm13 + vpmuludq 96(%rbp), %ymm2, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpmuludq 96(%rbp), %ymm3, %ymm11 + vpmuludq (%rbx), %ymm3, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq (%rbx), %ymm4, %ymm13 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq (%rbx), %ymm0, %ymm13 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq (%rbx), %ymm1, %ymm10 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq (%rbx), %ymm2, %ymm11 + vpmuludq 32(%rbx), %ymm2, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq 32(%rbx), %ymm3, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 32(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 32(%rbx), %ymm1, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 64(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpmuludq 64(%rbx), %ymm2, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 64(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 96(%rbx), %ymm0, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 96(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm7, %ymm10, %ymm7 + vpmuludq 128(%rbx), %ymm0, %ymm13 + vpaddq %ymm8, %ymm11, %ymm8 + vpaddq %ymm9, %ymm12, %ymm9 + vpaddq %ymm9, %ymm13, %ymm9 + vpsrlq $26, %ymm5, %ymm10 + vpsrlq $26, %ymm8, %ymm11 + vpand %ymm14, %ymm5, %ymm5 + vpand %ymm14, %ymm8, %ymm8 + vpaddq %ymm6, %ymm10, %ymm6 + vpaddq %ymm9, %ymm11, %ymm9 + vpsrlq $26, %ymm6, %ymm10 + vpsrlq $26, %ymm9, %ymm11 + vpand %ymm14, %ymm6, %ymm1 + vpand %ymm14, %ymm9, %ymm4 + vpaddq %ymm7, %ymm10, %ymm7 + vpslld $2, %ymm11, %ymm12 + vpaddd %ymm12, %ymm11, %ymm12 + vpsrlq $26, %ymm7, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpsrlq $26, %ymm5, %ymm11 + vpand %ymm14, %ymm7, %ymm2 + vpand %ymm14, %ymm5, %ymm0 + vpaddq %ymm8, %ymm10, %ymm8 + vpaddq %ymm1, %ymm11, %ymm1 + vpsrlq $26, %ymm8, %ymm10 + vpand %ymm14, %ymm8, %ymm3 + vpaddq %ymm4, %ymm10, %ymm4 + vmovdqu -64(%rcx), %ymm5 + vmovdqu -32(%rcx), %ymm6 + vperm2i128 $32, %ymm6, %ymm5, %ymm7 + vperm2i128 $49, %ymm6, %ymm5, %ymm5 + vpunpckldq %ymm5, %ymm7, %ymm6 + vpunpckhdq %ymm5, %ymm7, %ymm8 + vpunpckldq %ymm15, %ymm6, %ymm5 + vpunpckhdq %ymm15, %ymm6, %ymm6 + vpunpckldq %ymm15, %ymm8, %ymm7 + vpunpckhdq %ymm15, %ymm8, %ymm8 + vmovdqu (%r13), %ymm9 + vpsllq $6, %ymm6, %ymm6 + vpsllq $12, %ymm7, %ymm7 + vpsllq $18, %ymm8, %ymm8 + vpmuludq (%rbp), %ymm4, %ymm10 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 32(%rbp), %ymm3, %ymm10 + vpmuludq 32(%rbp), %ymm4, %ymm11 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 64(%rbp), %ymm3, %ymm11 + vpmuludq 64(%rbp), %ymm4, %ymm12 + vpaddq %ymm7, %ymm12, %ymm7 + vpaddq %ymm5, %ymm10, %ymm5 + vpmuludq 64(%rbp), %ymm2, %ymm12 + vpmuludq 96(%rbp), %ymm4, %ymm13 + vpaddq %ymm8, %ymm13, %ymm8 + vpaddq %ymm6, %ymm11, %ymm6 + vpmuludq 96(%rbp), %ymm1, %ymm13 + vpmuludq 96(%rbp), %ymm2, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpmuludq 96(%rbp), %ymm3, %ymm11 + vpmuludq (%rbx), %ymm3, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq (%rbx), %ymm4, %ymm13 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq (%rbx), %ymm0, %ymm13 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq (%rbx), %ymm1, %ymm10 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq (%rbx), %ymm2, %ymm11 + vpmuludq 32(%rbx), %ymm2, %ymm12 + vpaddq %ymm5, %ymm13, %ymm5 + vpmuludq 32(%rbx), %ymm3, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 32(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 32(%rbx), %ymm1, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 64(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpmuludq 64(%rbx), %ymm2, %ymm13 + vpaddq %ymm6, %ymm10, %ymm6 + vpmuludq 64(%rbx), %ymm0, %ymm10 + vpaddq %ymm7, %ymm11, %ymm7 + vpmuludq 96(%rbx), %ymm0, %ymm11 + vpaddq %ymm8, %ymm12, %ymm8 + vpmuludq 96(%rbx), %ymm1, %ymm12 + vpaddq %ymm9, %ymm13, %ymm9 + vpaddq %ymm7, %ymm10, %ymm7 + vpmuludq 128(%rbx), %ymm0, %ymm13 + vpaddq %ymm8, %ymm11, %ymm8 + vpaddq %ymm9, %ymm12, %ymm9 + vpaddq %ymm9, %ymm13, %ymm9 + vpsrlq $26, %ymm5, %ymm10 + vpsrlq $26, %ymm8, %ymm11 + vpand %ymm14, %ymm5, %ymm5 + vpand %ymm14, %ymm8, %ymm8 + vpaddq %ymm6, %ymm10, %ymm6 + vpaddq %ymm9, %ymm11, %ymm9 + vpsrlq $26, %ymm6, %ymm10 + vpsrlq $26, %ymm9, %ymm11 + vpand %ymm14, %ymm6, %ymm1 + vpand %ymm14, %ymm9, %ymm4 + vpaddq %ymm7, %ymm10, %ymm7 + vpslld $2, %ymm11, %ymm12 + vpaddd %ymm12, %ymm11, %ymm12 + vpsrlq $26, %ymm7, %ymm10 + vpaddq %ymm5, %ymm12, %ymm5 + vpsrlq $26, %ymm5, %ymm11 + vpand %ymm14, %ymm7, %ymm2 + vpand %ymm14, %ymm5, %ymm0 + vpaddq %ymm8, %ymm10, %ymm8 + vpaddq %ymm1, %ymm11, %ymm1 + vpsrlq $26, %ymm8, %ymm10 + vpand %ymm14, %ymm8, %ymm3 + vpaddq %ymm4, %ymm10, %ymm4 + vmovdqu %ymm0, (%r9) + vmovdqu %ymm1, 32(%r9) + vmovdqu %ymm2, 64(%r9) + vmovdqu %ymm3, 96(%r9) + vmovdqu %ymm4, 128(%r9) + vmovd %xmm28, 48(%rdi) + vzeroupper + addq $0x2d0, %rsp + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size chacha20_poly1305_avx512,.-chacha20_poly1305_avx512 +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX512 */ +#ifdef HAVE_INTEL_AVX512 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_cp512_add: +.quad 0x0000000100000000,0x0000000300000002 +.quad 0x0000000500000004,0x0000000700000006 +.quad 0x0000000900000008,0x0000000b0000000a +.quad 0x0000000d0000000c,0x0000000f0000000e +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_cp512_pc: +.quad 0x00000fffffffffff,0x00000fffffffffff +.quad 0x00000fffffffffff,0x00000fffffffffff +.quad 0x00000fffffffffff,0x00000fffffffffff +.quad 0x00000fffffffffff,0x00000fffffffffff +.quad 0x0000000000ffffff,0x0000000000ffffff +.quad 0x0000000000ffffff,0x0000000000ffffff +.quad 0x0000000000ffffff,0x0000000000ffffff +.quad 0x0000000000ffffff,0x0000000000ffffff +.quad 0x0000010000000000,0x0000010000000000 +.quad 0x0000010000000000,0x0000010000000000 +.quad 0x0000010000000000,0x0000010000000000 +.quad 0x0000010000000000,0x0000010000000000 +.quad 0x0000000000000000,0x0000000000000002 +.quad 0x0000000000000004,0x0000000000000006 +.quad 0x0000000000000008,0x000000000000000a +.quad 0x000000000000000c,0x000000000000000e +.quad 0x0000000000000001,0x0000000000000003 +.quad 0x0000000000000005,0x0000000000000007 +.quad 0x0000000000000009,0x000000000000000b +.quad 0x000000000000000d,0x000000000000000f +.quad 0x0000001000000010,0x0000001000000010 +.quad 0x0000001000000010,0x0000001000000010 +.quad 0x0000001000000010,0x0000001000000010 +.quad 0x0000001000000010,0x0000001000000010 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_cp512_rx: +.quad 0x000000000000000c,0x0000000000000008 +.quad 0x0000000000000004,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x000000000000000d,0x0000000000000009 +.quad 0x0000000000000005,0x0000000000000001 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x000000000000000e,0x000000000000000a +.quad 0x0000000000000006,0x0000000000000002 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +#ifndef __APPLE__ +.text +.globl chacha20_poly1305_ifma +.type chacha20_poly1305_ifma,@function +.align 16 +chacha20_poly1305_ifma: +#else +.section __TEXT,__text +.globl _chacha20_poly1305_ifma +.p2align 4 +_chacha20_poly1305_ifma: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + subq $0x4b0, %rsp + leaq L_cp512_pc(%rip), %rax + leaq L_cp512_rx(%rip), %r10 + leaq L_cp512_add(%rip), %r9 + leaq 32(%rsp), %r11 + addq $63, %r11 + andq $-64, %r11 + vpxorq %zmm16, %zmm16, %zmm16 + vpxorq %zmm17, %zmm17, %zmm17 + vpxorq %zmm18, %zmm18, %zmm18 + vmovdqu64 %zmm16, 752(%rsi) + vmovdqu64 %zmm17, 816(%rsi) + vmovdqu64 %zmm18, 880(%rsi) + vpbroadcastq 720(%rsi), %zmm19 + vpbroadcastq 728(%rsi), %zmm20 + vpbroadcastq 736(%rsi), %zmm21 + vpsllq $2, %zmm20, %zmm30 + vpsllq $4, %zmm20, %zmm22 + vpaddq %zmm30, %zmm22, %zmm22 + vpsllq $2, %zmm21, %zmm30 + vpsllq $4, %zmm21, %zmm23 + vpaddq %zmm30, %zmm23, %zmm23 + vpbroadcastd (%rdi), %zmm0 + vpbroadcastd 4(%rdi), %zmm1 + vpbroadcastd 8(%rdi), %zmm2 + vpbroadcastd 12(%rdi), %zmm3 + vpbroadcastd 16(%rdi), %zmm4 + vpbroadcastd 20(%rdi), %zmm5 + vpbroadcastd 24(%rdi), %zmm6 + vpbroadcastd 28(%rdi), %zmm7 + vpbroadcastd 32(%rdi), %zmm8 + vpbroadcastd 36(%rdi), %zmm9 + vpbroadcastd 40(%rdi), %zmm10 + vpbroadcastd 44(%rdi), %zmm11 + vpbroadcastd 48(%rdi), %zmm12 + vpbroadcastd 52(%rdi), %zmm13 + vpbroadcastd 56(%rdi), %zmm14 + vpbroadcastd 60(%rdi), %zmm15 + vpaddd (%r9), %zmm12, %zmm12 + vmovdqa64 %zmm0, (%r11) + vmovdqa64 %zmm1, 64(%r11) + vmovdqa64 %zmm2, 128(%r11) + vmovdqa64 %zmm3, 192(%r11) + vmovdqa64 %zmm4, 256(%r11) + vmovdqa64 %zmm5, 320(%r11) + vmovdqa64 %zmm6, 384(%r11) + vmovdqa64 %zmm7, 448(%r11) + vmovdqa64 %zmm8, 512(%r11) + vmovdqa64 %zmm9, 576(%r11) + vmovdqa64 %zmm10, 640(%r11) + vmovdqa64 %zmm11, 704(%r11) + vmovdqa64 %zmm12, 768(%r11) + vmovdqa64 %zmm13, 832(%r11) + vmovdqa64 %zmm14, 896(%r11) + vmovdqa64 %zmm15, 960(%r11) + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd (%r11), %zmm0, %zmm0 + vpaddd 64(%r11), %zmm1, %zmm1 + vpaddd 128(%r11), %zmm2, %zmm2 + vpaddd 192(%r11), %zmm3, %zmm3 + vpaddd 256(%r11), %zmm4, %zmm4 + vpaddd 320(%r11), %zmm5, %zmm5 + vpaddd 384(%r11), %zmm6, %zmm6 + vpaddd 448(%r11), %zmm7, %zmm7 + vpaddd 512(%r11), %zmm8, %zmm8 + vpaddd 576(%r11), %zmm9, %zmm9 + vpaddd 640(%r11), %zmm10, %zmm10 + vpaddd 704(%r11), %zmm11, %zmm11 + vpaddd 768(%r11), %zmm12, %zmm12 + vpaddd 832(%r11), %zmm13, %zmm13 + vpaddd 896(%r11), %zmm14, %zmm14 + vpaddd 960(%r11), %zmm15, %zmm15 + vpunpckldq %zmm1, %zmm0, %zmm16 + vpunpckhdq %zmm1, %zmm0, %zmm17 + vpunpckldq %zmm3, %zmm2, %zmm18 + vpunpckhdq %zmm3, %zmm2, %zmm19 + vpunpckldq %zmm5, %zmm4, %zmm20 + vpunpckhdq %zmm5, %zmm4, %zmm21 + vpunpckldq %zmm7, %zmm6, %zmm22 + vpunpckhdq %zmm7, %zmm6, %zmm23 + vpunpckldq %zmm9, %zmm8, %zmm24 + vpunpckhdq %zmm9, %zmm8, %zmm25 + vpunpckldq %zmm11, %zmm10, %zmm26 + vpunpckhdq %zmm11, %zmm10, %zmm27 + vpunpckldq %zmm13, %zmm12, %zmm28 + vpunpckhdq %zmm13, %zmm12, %zmm29 + vpunpckldq %zmm15, %zmm14, %zmm30 + vpunpckhdq %zmm15, %zmm14, %zmm31 + vpunpcklqdq %zmm18, %zmm16, %zmm0 + vpunpckhqdq %zmm18, %zmm16, %zmm1 + vpunpcklqdq %zmm19, %zmm17, %zmm2 + vpunpckhqdq %zmm19, %zmm17, %zmm3 + vpunpcklqdq %zmm22, %zmm20, %zmm4 + vpunpckhqdq %zmm22, %zmm20, %zmm5 + vpunpcklqdq %zmm23, %zmm21, %zmm6 + vpunpckhqdq %zmm23, %zmm21, %zmm7 + vpunpcklqdq %zmm26, %zmm24, %zmm8 + vpunpckhqdq %zmm26, %zmm24, %zmm9 + vpunpcklqdq %zmm27, %zmm25, %zmm10 + vpunpckhqdq %zmm27, %zmm25, %zmm11 + vpunpcklqdq %zmm30, %zmm28, %zmm12 + vpunpckhqdq %zmm30, %zmm28, %zmm13 + vpunpcklqdq %zmm31, %zmm29, %zmm14 + vpunpckhqdq %zmm31, %zmm29, %zmm15 + vshufi32x4 $0x44, %zmm4, %zmm0, %zmm16 + vshufi32x4 $0xee, %zmm4, %zmm0, %zmm17 + vshufi32x4 $0x44, %zmm12, %zmm8, %zmm18 + vshufi32x4 $0xee, %zmm12, %zmm8, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord (%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, (%rcx) + vpxord 256(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 256(%rcx) + vpxord 512(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 512(%rcx) + vpxord 768(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 768(%rcx) + vshufi32x4 $0x44, %zmm5, %zmm1, %zmm16 + vshufi32x4 $0xee, %zmm5, %zmm1, %zmm17 + vshufi32x4 $0x44, %zmm13, %zmm9, %zmm18 + vshufi32x4 $0xee, %zmm13, %zmm9, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 64(%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, 64(%rcx) + vpxord 320(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 320(%rcx) + vpxord 576(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 576(%rcx) + vpxord 832(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 832(%rcx) + vshufi32x4 $0x44, %zmm6, %zmm2, %zmm16 + vshufi32x4 $0xee, %zmm6, %zmm2, %zmm17 + vshufi32x4 $0x44, %zmm14, %zmm10, %zmm18 + vshufi32x4 $0xee, %zmm14, %zmm10, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 128(%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, 128(%rcx) + vpxord 384(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 384(%rcx) + vpxord 640(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 640(%rcx) + vpxord 896(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 896(%rcx) + vshufi32x4 $0x44, %zmm7, %zmm3, %zmm16 + vshufi32x4 $0xee, %zmm7, %zmm3, %zmm17 + vshufi32x4 $0x44, %zmm15, %zmm11, %zmm18 + vshufi32x4 $0xee, %zmm15, %zmm11, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 192(%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, 192(%rcx) + vpxord 448(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 448(%rcx) + vpxord 704(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 704(%rcx) + vpxord 960(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 960(%rcx) + vmovdqa64 768(%r11), %zmm12 + vpaddd 320(%rax), %zmm12, %zmm12 + vmovdqa64 %zmm12, 768(%r11) + vmovdqa64 (%r11), %zmm0 + vmovdqa64 64(%r11), %zmm1 + vmovdqa64 128(%r11), %zmm2 + vmovdqa64 192(%r11), %zmm3 + vmovdqa64 256(%r11), %zmm4 + vmovdqa64 320(%r11), %zmm5 + vmovdqa64 384(%r11), %zmm6 + vmovdqa64 448(%r11), %zmm7 + vmovdqa64 512(%r11), %zmm8 + vmovdqa64 576(%r11), %zmm9 + vmovdqa64 640(%r11), %zmm10 + vmovdqa64 704(%r11), %zmm11 + vmovdqa64 768(%r11), %zmm12 + vmovdqa64 832(%r11), %zmm13 + vmovdqa64 896(%r11), %zmm14 + vmovdqa64 960(%r11), %zmm15 + addq $0x400, %rdx + addq $0x400, %rcx + subl $0x400, %r8d + jz L_cp512_epi +L_cp512_start: + vmovdqu64 752(%rsi), %zmm16 + vmovdqu64 816(%rsi), %zmm17 + vmovdqu64 880(%rsi), %zmm18 + vpbroadcastq 720(%rsi), %zmm19 + vpbroadcastq 728(%rsi), %zmm20 + vpbroadcastq 736(%rsi), %zmm21 + vpsllq $2, %zmm20, %zmm30 + vpsllq $4, %zmm20, %zmm22 + vpaddq %zmm30, %zmm22, %zmm22 + vpsllq $2, %zmm21, %zmm30 + vpsllq $4, %zmm21, %zmm23 + vpaddq %zmm30, %zmm23, %zmm23 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 -1024(%rcx), %zmm27 + vmovdqu64 -960(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 -896(%rcx), %zmm27 + vmovdqu64 -832(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 -768(%rcx), %zmm27 + vmovdqu64 -704(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 -640(%rcx), %zmm27 + vmovdqu64 -576(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 -512(%rcx), %zmm27 + vmovdqu64 -448(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 -384(%rcx), %zmm27 + vmovdqu64 -320(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 -256(%rcx), %zmm27 + vmovdqu64 -192(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 -128(%rcx), %zmm27 + vmovdqu64 -64(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd (%r11), %zmm0, %zmm0 + vpaddd 64(%r11), %zmm1, %zmm1 + vpaddd 128(%r11), %zmm2, %zmm2 + vpaddd 192(%r11), %zmm3, %zmm3 + vpaddd 256(%r11), %zmm4, %zmm4 + vpaddd 320(%r11), %zmm5, %zmm5 + vpaddd 384(%r11), %zmm6, %zmm6 + vpaddd 448(%r11), %zmm7, %zmm7 + vpaddd 512(%r11), %zmm8, %zmm8 + vpaddd 576(%r11), %zmm9, %zmm9 + vpaddd 640(%r11), %zmm10, %zmm10 + vpaddd 704(%r11), %zmm11, %zmm11 + vpaddd 768(%r11), %zmm12, %zmm12 + vpaddd 832(%r11), %zmm13, %zmm13 + vpaddd 896(%r11), %zmm14, %zmm14 + vpaddd 960(%r11), %zmm15, %zmm15 + vmovdqu64 %zmm16, 752(%rsi) + vmovdqu64 %zmm17, 816(%rsi) + vmovdqu64 %zmm18, 880(%rsi) + vpunpckldq %zmm1, %zmm0, %zmm16 + vpunpckhdq %zmm1, %zmm0, %zmm17 + vpunpckldq %zmm3, %zmm2, %zmm18 + vpunpckhdq %zmm3, %zmm2, %zmm19 + vpunpckldq %zmm5, %zmm4, %zmm20 + vpunpckhdq %zmm5, %zmm4, %zmm21 + vpunpckldq %zmm7, %zmm6, %zmm22 + vpunpckhdq %zmm7, %zmm6, %zmm23 + vpunpckldq %zmm9, %zmm8, %zmm24 + vpunpckhdq %zmm9, %zmm8, %zmm25 + vpunpckldq %zmm11, %zmm10, %zmm26 + vpunpckhdq %zmm11, %zmm10, %zmm27 + vpunpckldq %zmm13, %zmm12, %zmm28 + vpunpckhdq %zmm13, %zmm12, %zmm29 + vpunpckldq %zmm15, %zmm14, %zmm30 + vpunpckhdq %zmm15, %zmm14, %zmm31 + vpunpcklqdq %zmm18, %zmm16, %zmm0 + vpunpckhqdq %zmm18, %zmm16, %zmm1 + vpunpcklqdq %zmm19, %zmm17, %zmm2 + vpunpckhqdq %zmm19, %zmm17, %zmm3 + vpunpcklqdq %zmm22, %zmm20, %zmm4 + vpunpckhqdq %zmm22, %zmm20, %zmm5 + vpunpcklqdq %zmm23, %zmm21, %zmm6 + vpunpckhqdq %zmm23, %zmm21, %zmm7 + vpunpcklqdq %zmm26, %zmm24, %zmm8 + vpunpckhqdq %zmm26, %zmm24, %zmm9 + vpunpcklqdq %zmm27, %zmm25, %zmm10 + vpunpckhqdq %zmm27, %zmm25, %zmm11 + vpunpcklqdq %zmm30, %zmm28, %zmm12 + vpunpckhqdq %zmm30, %zmm28, %zmm13 + vpunpcklqdq %zmm31, %zmm29, %zmm14 + vpunpckhqdq %zmm31, %zmm29, %zmm15 + vshufi32x4 $0x44, %zmm4, %zmm0, %zmm16 + vshufi32x4 $0xee, %zmm4, %zmm0, %zmm17 + vshufi32x4 $0x44, %zmm12, %zmm8, %zmm18 + vshufi32x4 $0xee, %zmm12, %zmm8, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord (%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, (%rcx) + vpxord 256(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 256(%rcx) + vpxord 512(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 512(%rcx) + vpxord 768(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 768(%rcx) + vshufi32x4 $0x44, %zmm5, %zmm1, %zmm16 + vshufi32x4 $0xee, %zmm5, %zmm1, %zmm17 + vshufi32x4 $0x44, %zmm13, %zmm9, %zmm18 + vshufi32x4 $0xee, %zmm13, %zmm9, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 64(%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, 64(%rcx) + vpxord 320(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 320(%rcx) + vpxord 576(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 576(%rcx) + vpxord 832(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 832(%rcx) + vshufi32x4 $0x44, %zmm6, %zmm2, %zmm16 + vshufi32x4 $0xee, %zmm6, %zmm2, %zmm17 + vshufi32x4 $0x44, %zmm14, %zmm10, %zmm18 + vshufi32x4 $0xee, %zmm14, %zmm10, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 128(%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, 128(%rcx) + vpxord 384(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 384(%rcx) + vpxord 640(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 640(%rcx) + vpxord 896(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 896(%rcx) + vshufi32x4 $0x44, %zmm7, %zmm3, %zmm16 + vshufi32x4 $0xee, %zmm7, %zmm3, %zmm17 + vshufi32x4 $0x44, %zmm15, %zmm11, %zmm18 + vshufi32x4 $0xee, %zmm15, %zmm11, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 192(%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, 192(%rcx) + vpxord 448(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 448(%rcx) + vpxord 704(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 704(%rcx) + vpxord 960(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 960(%rcx) + vmovdqa64 768(%r11), %zmm12 + vpaddd 320(%rax), %zmm12, %zmm12 + vmovdqa64 %zmm12, 768(%r11) + vmovdqa64 (%r11), %zmm0 + vmovdqa64 64(%r11), %zmm1 + vmovdqa64 128(%r11), %zmm2 + vmovdqa64 192(%r11), %zmm3 + vmovdqa64 256(%r11), %zmm4 + vmovdqa64 320(%r11), %zmm5 + vmovdqa64 384(%r11), %zmm6 + vmovdqa64 448(%r11), %zmm7 + vmovdqa64 512(%r11), %zmm8 + vmovdqa64 576(%r11), %zmm9 + vmovdqa64 640(%r11), %zmm10 + vmovdqa64 704(%r11), %zmm11 + vmovdqa64 768(%r11), %zmm12 + vmovdqa64 832(%r11), %zmm13 + vmovdqa64 896(%r11), %zmm14 + vmovdqa64 960(%r11), %zmm15 + addq $0x400, %rdx + addq $0x400, %rcx + subl $0x400, %r8d + jnz L_cp512_start +L_cp512_epi: + vmovdqu64 752(%rsi), %zmm16 + vmovdqu64 816(%rsi), %zmm17 + vmovdqu64 880(%rsi), %zmm18 + vpbroadcastq 720(%rsi), %zmm19 + vpbroadcastq 728(%rsi), %zmm20 + vpbroadcastq 736(%rsi), %zmm21 + vpsllq $2, %zmm20, %zmm30 + vpsllq $4, %zmm20, %zmm22 + vpaddq %zmm30, %zmm22, %zmm22 + vpsllq $2, %zmm21, %zmm30 + vpsllq $4, %zmm21, %zmm23 + vpaddq %zmm30, %zmm23, %zmm23 + vmovdqu64 -1024(%rcx), %zmm27 + vmovdqu64 -960(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vmovdqu64 -896(%rcx), %zmm27 + vmovdqu64 -832(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vmovdqu64 -768(%rcx), %zmm27 + vmovdqu64 -704(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vmovdqu64 -640(%rcx), %zmm27 + vmovdqu64 -576(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vmovdqu64 -512(%rcx), %zmm27 + vmovdqu64 -448(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vmovdqu64 -384(%rcx), %zmm27 + vmovdqu64 -320(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vmovdqu64 -256(%rcx), %zmm27 + vmovdqu64 -192(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vmovdqu64 -128(%rcx), %zmm27 + vmovdqu64 -64(%rcx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vmovdqu64 224(%rsi), %zmm24 + vmovdqu64 288(%rsi), %zmm25 + vmovdqu64 624(%rsi), %zmm26 + vmovdqu64 688(%rsi), %zmm27 + vmovdqu64 (%r10), %zmm28 + vpermi2q %zmm27, %zmm26, %zmm28 + vmovdqu64 (%r10), %zmm29 + vpermi2q %zmm25, %zmm24, %zmm29 + vinserti64x4 $0x01, %ymm29, %zmm28, %zmm19 + vmovdqu64 64(%r10), %zmm28 + vpermi2q %zmm27, %zmm26, %zmm28 + vmovdqu64 64(%r10), %zmm29 + vpermi2q %zmm25, %zmm24, %zmm29 + vinserti64x4 $0x01, %ymm29, %zmm28, %zmm20 + vmovdqu64 128(%r10), %zmm28 + vpermi2q %zmm27, %zmm26, %zmm28 + vmovdqu64 128(%r10), %zmm29 + vpermi2q %zmm25, %zmm24, %zmm29 + vinserti64x4 $0x01, %ymm29, %zmm28, %zmm21 + vpsllq $2, %zmm20, %zmm30 + vpsllq $4, %zmm20, %zmm22 + vpaddq %zmm30, %zmm22, %zmm22 + vpsllq $2, %zmm21, %zmm30 + vpsllq $4, %zmm21, %zmm23 + vpaddq %zmm30, %zmm23, %zmm23 + vpxorq %zmm24, %zmm24, %zmm24 + vpxorq %zmm25, %zmm25, %zmm25 + vpxorq %zmm26, %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vshufi64x2 $0x4e, %zmm16, %zmm16, %zmm24 + vshufi64x2 $0x4e, %zmm17, %zmm17, %zmm25 + vshufi64x2 $0x4e, %zmm18, %zmm18, %zmm26 + vpaddq %zmm16, %zmm24, %zmm16 + vpaddq %zmm17, %zmm25, %zmm17 + vpaddq %zmm18, %zmm26, %zmm18 + vpsrldq $8, %zmm16, %zmm24 + vpsrldq $8, %zmm17, %zmm25 + vpsrldq $8, %zmm18, %zmm26 + vpaddq %zmm16, %zmm24, %zmm16 + vpaddq %zmm17, %zmm25, %zmm17 + vpaddq %zmm18, %zmm26, %zmm18 + vpermq $2, %zmm16, %zmm24 + vpermq $2, %zmm17, %zmm25 + vpermq $2, %zmm18, %zmm26 + vpaddq %zmm16, %zmm24, %zmm16 + vpaddq %zmm17, %zmm25, %zmm17 + vpaddq %zmm18, %zmm26, %zmm18 + vmovq %xmm16, %r12 + vmovq %xmm17, %r13 + vmovq %xmm18, %r14 + movq %r13, %r10 + shrq $20, %r10 + movq %r14, %r11 + shrq $40, %r11 + movq %r12, %rax + movq %r13, %r12 + shlq $44, %r12 + addq %r12, %rax + adcq $0x00, %r10 + movq %r14, %r12 + shlq $24, %r12 + addq %r12, %r10 + adcq $0x00, %r11 + movq %r11, %r9 + andq $3, %r11 + shrq $2, %r9 + leaq 0(%r9,%r9,4), %r9 + addq %r9, %rax + adcq $0x00, %r10 + adcq $0x00, %r11 + movq 24(%rsi), %r12 + movq %r12, 64(%rsi) + movq 32(%rsi), %r12 + movq %r12, 72(%rsi) + movq 40(%rsi), %r12 + movq %r12, 80(%rsi) + movq %rax, 24(%rsi) + movq %r10, 32(%rsi) + movq %r11, 40(%rsi) + vmovd %xmm12, 48(%rdi) + vzeroupper + addq $0x4b0, %rsp + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size chacha20_poly1305_ifma,.-chacha20_poly1305_ifma +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl chacha20_poly1305_ifma_decrypt +.type chacha20_poly1305_ifma_decrypt,@function +.align 16 +chacha20_poly1305_ifma_decrypt: +#else +.section __TEXT,__text +.globl _chacha20_poly1305_ifma_decrypt +.p2align 4 +_chacha20_poly1305_ifma_decrypt: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + subq $0x4b0, %rsp + leaq L_cp512_pc(%rip), %rax + leaq L_cp512_rx(%rip), %r10 + leaq L_cp512_add(%rip), %r9 + leaq 32(%rsp), %r11 + addq $63, %r11 + andq $-64, %r11 + vpxorq %zmm16, %zmm16, %zmm16 + vpxorq %zmm17, %zmm17, %zmm17 + vpxorq %zmm18, %zmm18, %zmm18 + vmovdqu64 %zmm16, 752(%rsi) + vmovdqu64 %zmm17, 816(%rsi) + vmovdqu64 %zmm18, 880(%rsi) + vpbroadcastd (%rdi), %zmm0 + vpbroadcastd 4(%rdi), %zmm1 + vpbroadcastd 8(%rdi), %zmm2 + vpbroadcastd 12(%rdi), %zmm3 + vpbroadcastd 16(%rdi), %zmm4 + vpbroadcastd 20(%rdi), %zmm5 + vpbroadcastd 24(%rdi), %zmm6 + vpbroadcastd 28(%rdi), %zmm7 + vpbroadcastd 32(%rdi), %zmm8 + vpbroadcastd 36(%rdi), %zmm9 + vpbroadcastd 40(%rdi), %zmm10 + vpbroadcastd 44(%rdi), %zmm11 + vpbroadcastd 48(%rdi), %zmm12 + vpbroadcastd 52(%rdi), %zmm13 + vpbroadcastd 56(%rdi), %zmm14 + vpbroadcastd 60(%rdi), %zmm15 + vpaddd (%r9), %zmm12, %zmm12 + vmovdqa64 %zmm0, (%r11) + vmovdqa64 %zmm1, 64(%r11) + vmovdqa64 %zmm2, 128(%r11) + vmovdqa64 %zmm3, 192(%r11) + vmovdqa64 %zmm4, 256(%r11) + vmovdqa64 %zmm5, 320(%r11) + vmovdqa64 %zmm6, 384(%r11) + vmovdqa64 %zmm7, 448(%r11) + vmovdqa64 %zmm8, 512(%r11) + vmovdqa64 %zmm9, 576(%r11) + vmovdqa64 %zmm10, 640(%r11) + vmovdqa64 %zmm11, 704(%r11) + vmovdqa64 %zmm12, 768(%r11) + vmovdqa64 %zmm13, 832(%r11) + vmovdqa64 %zmm14, 896(%r11) + vmovdqa64 %zmm15, 960(%r11) +L_cp512_dstart: + vmovdqu64 752(%rsi), %zmm16 + vmovdqu64 816(%rsi), %zmm17 + vmovdqu64 880(%rsi), %zmm18 + vpbroadcastq 720(%rsi), %zmm19 + vpbroadcastq 728(%rsi), %zmm20 + vpbroadcastq 736(%rsi), %zmm21 + vpsllq $2, %zmm20, %zmm30 + vpsllq $4, %zmm20, %zmm22 + vpaddq %zmm30, %zmm22, %zmm22 + vpsllq $2, %zmm21, %zmm30 + vpsllq $4, %zmm21, %zmm23 + vpaddq %zmm30, %zmm23, %zmm23 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 (%rdx), %zmm27 + vmovdqu64 64(%rdx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 128(%rdx), %zmm27 + vmovdqu64 192(%rdx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 256(%rdx), %zmm27 + vmovdqu64 320(%rdx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 384(%rdx), %zmm27 + vmovdqu64 448(%rdx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 512(%rdx), %zmm27 + vmovdqu64 576(%rdx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 640(%rdx), %zmm27 + vmovdqu64 704(%rdx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 768(%rdx), %zmm27 + vmovdqu64 832(%rdx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vmovdqu64 896(%rdx), %zmm27 + vmovdqu64 960(%rdx), %zmm28 + vmovdqu64 192(%rax), %zmm29 + vpermi2q %zmm28, %zmm27, %zmm29 + vmovdqu64 256(%rax), %zmm30 + vpermi2q %zmm28, %zmm27, %zmm30 + vpandq (%rax), %zmm29, %zmm24 + vpsrlq $44, %zmm29, %zmm27 + vpandq 64(%rax), %zmm30, %zmm28 + vpsllq $20, %zmm28, %zmm28 + vporq %zmm27, %zmm28, %zmm25 + vpsrlq $24, %zmm30, %zmm26 + vporq 128(%rax), %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vpaddd %zmm4, %zmm0, %zmm0 + vpaddd %zmm5, %zmm1, %zmm1 + vpaddd %zmm6, %zmm2, %zmm2 + vpaddd %zmm7, %zmm3, %zmm3 + vpxord %zmm0, %zmm12, %zmm12 + vpxord %zmm1, %zmm13, %zmm13 + vpxord %zmm2, %zmm14, %zmm14 + vpxord %zmm3, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vpaddd %zmm12, %zmm8, %zmm8 + vpaddd %zmm13, %zmm9, %zmm9 + vpaddd %zmm14, %zmm10, %zmm10 + vpaddd %zmm15, %zmm11, %zmm11 + vpxord %zmm8, %zmm4, %zmm4 + vpxord %zmm9, %zmm5, %zmm5 + vpxord %zmm10, %zmm6, %zmm6 + vpxord %zmm11, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $16, %zmm15, %zmm15 + vprold $16, %zmm12, %zmm12 + vprold $16, %zmm13, %zmm13 + vprold $16, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $12, %zmm5, %zmm5 + vprold $12, %zmm6, %zmm6 + vprold $12, %zmm7, %zmm7 + vprold $12, %zmm4, %zmm4 + vpaddd %zmm5, %zmm0, %zmm0 + vpaddd %zmm6, %zmm1, %zmm1 + vpaddd %zmm7, %zmm2, %zmm2 + vpaddd %zmm4, %zmm3, %zmm3 + vpxord %zmm0, %zmm15, %zmm15 + vpxord %zmm1, %zmm12, %zmm12 + vpxord %zmm2, %zmm13, %zmm13 + vpxord %zmm3, %zmm14, %zmm14 + vprold $8, %zmm15, %zmm15 + vprold $8, %zmm12, %zmm12 + vprold $8, %zmm13, %zmm13 + vprold $8, %zmm14, %zmm14 + vpaddd %zmm15, %zmm10, %zmm10 + vpaddd %zmm12, %zmm11, %zmm11 + vpaddd %zmm13, %zmm8, %zmm8 + vpaddd %zmm14, %zmm9, %zmm9 + vpxord %zmm10, %zmm5, %zmm5 + vpxord %zmm11, %zmm6, %zmm6 + vpxord %zmm8, %zmm7, %zmm7 + vpxord %zmm9, %zmm4, %zmm4 + vprold $7, %zmm5, %zmm5 + vprold $7, %zmm6, %zmm6 + vprold $7, %zmm7, %zmm7 + vprold $7, %zmm4, %zmm4 + vpaddd (%r11), %zmm0, %zmm0 + vpaddd 64(%r11), %zmm1, %zmm1 + vpaddd 128(%r11), %zmm2, %zmm2 + vpaddd 192(%r11), %zmm3, %zmm3 + vpaddd 256(%r11), %zmm4, %zmm4 + vpaddd 320(%r11), %zmm5, %zmm5 + vpaddd 384(%r11), %zmm6, %zmm6 + vpaddd 448(%r11), %zmm7, %zmm7 + vpaddd 512(%r11), %zmm8, %zmm8 + vpaddd 576(%r11), %zmm9, %zmm9 + vpaddd 640(%r11), %zmm10, %zmm10 + vpaddd 704(%r11), %zmm11, %zmm11 + vpaddd 768(%r11), %zmm12, %zmm12 + vpaddd 832(%r11), %zmm13, %zmm13 + vpaddd 896(%r11), %zmm14, %zmm14 + vpaddd 960(%r11), %zmm15, %zmm15 + vmovdqu64 %zmm16, 752(%rsi) + vmovdqu64 %zmm17, 816(%rsi) + vmovdqu64 %zmm18, 880(%rsi) + vpunpckldq %zmm1, %zmm0, %zmm16 + vpunpckhdq %zmm1, %zmm0, %zmm17 + vpunpckldq %zmm3, %zmm2, %zmm18 + vpunpckhdq %zmm3, %zmm2, %zmm19 + vpunpckldq %zmm5, %zmm4, %zmm20 + vpunpckhdq %zmm5, %zmm4, %zmm21 + vpunpckldq %zmm7, %zmm6, %zmm22 + vpunpckhdq %zmm7, %zmm6, %zmm23 + vpunpckldq %zmm9, %zmm8, %zmm24 + vpunpckhdq %zmm9, %zmm8, %zmm25 + vpunpckldq %zmm11, %zmm10, %zmm26 + vpunpckhdq %zmm11, %zmm10, %zmm27 + vpunpckldq %zmm13, %zmm12, %zmm28 + vpunpckhdq %zmm13, %zmm12, %zmm29 + vpunpckldq %zmm15, %zmm14, %zmm30 + vpunpckhdq %zmm15, %zmm14, %zmm31 + vpunpcklqdq %zmm18, %zmm16, %zmm0 + vpunpckhqdq %zmm18, %zmm16, %zmm1 + vpunpcklqdq %zmm19, %zmm17, %zmm2 + vpunpckhqdq %zmm19, %zmm17, %zmm3 + vpunpcklqdq %zmm22, %zmm20, %zmm4 + vpunpckhqdq %zmm22, %zmm20, %zmm5 + vpunpcklqdq %zmm23, %zmm21, %zmm6 + vpunpckhqdq %zmm23, %zmm21, %zmm7 + vpunpcklqdq %zmm26, %zmm24, %zmm8 + vpunpckhqdq %zmm26, %zmm24, %zmm9 + vpunpcklqdq %zmm27, %zmm25, %zmm10 + vpunpckhqdq %zmm27, %zmm25, %zmm11 + vpunpcklqdq %zmm30, %zmm28, %zmm12 + vpunpckhqdq %zmm30, %zmm28, %zmm13 + vpunpcklqdq %zmm31, %zmm29, %zmm14 + vpunpckhqdq %zmm31, %zmm29, %zmm15 + vshufi32x4 $0x44, %zmm4, %zmm0, %zmm16 + vshufi32x4 $0xee, %zmm4, %zmm0, %zmm17 + vshufi32x4 $0x44, %zmm12, %zmm8, %zmm18 + vshufi32x4 $0xee, %zmm12, %zmm8, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord (%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, (%rcx) + vpxord 256(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 256(%rcx) + vpxord 512(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 512(%rcx) + vpxord 768(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 768(%rcx) + vshufi32x4 $0x44, %zmm5, %zmm1, %zmm16 + vshufi32x4 $0xee, %zmm5, %zmm1, %zmm17 + vshufi32x4 $0x44, %zmm13, %zmm9, %zmm18 + vshufi32x4 $0xee, %zmm13, %zmm9, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 64(%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, 64(%rcx) + vpxord 320(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 320(%rcx) + vpxord 576(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 576(%rcx) + vpxord 832(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 832(%rcx) + vshufi32x4 $0x44, %zmm6, %zmm2, %zmm16 + vshufi32x4 $0xee, %zmm6, %zmm2, %zmm17 + vshufi32x4 $0x44, %zmm14, %zmm10, %zmm18 + vshufi32x4 $0xee, %zmm14, %zmm10, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 128(%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, 128(%rcx) + vpxord 384(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 384(%rcx) + vpxord 640(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 640(%rcx) + vpxord 896(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 896(%rcx) + vshufi32x4 $0x44, %zmm7, %zmm3, %zmm16 + vshufi32x4 $0xee, %zmm7, %zmm3, %zmm17 + vshufi32x4 $0x44, %zmm15, %zmm11, %zmm18 + vshufi32x4 $0xee, %zmm15, %zmm11, %zmm19 + vshufi32x4 $0x88, %zmm18, %zmm16, %zmm20 + vshufi32x4 $0xdd, %zmm18, %zmm16, %zmm21 + vshufi32x4 $0x88, %zmm19, %zmm17, %zmm22 + vshufi32x4 $0xdd, %zmm19, %zmm17, %zmm23 + vpxord 192(%rdx), %zmm20, %zmm20 + vmovdqu64 %zmm20, 192(%rcx) + vpxord 448(%rdx), %zmm21, %zmm21 + vmovdqu64 %zmm21, 448(%rcx) + vpxord 704(%rdx), %zmm22, %zmm22 + vmovdqu64 %zmm22, 704(%rcx) + vpxord 960(%rdx), %zmm23, %zmm23 + vmovdqu64 %zmm23, 960(%rcx) + vmovdqa64 768(%r11), %zmm12 + vpaddd 320(%rax), %zmm12, %zmm12 + vmovdqa64 %zmm12, 768(%r11) + vmovdqa64 (%r11), %zmm0 + vmovdqa64 64(%r11), %zmm1 + vmovdqa64 128(%r11), %zmm2 + vmovdqa64 192(%r11), %zmm3 + vmovdqa64 256(%r11), %zmm4 + vmovdqa64 320(%r11), %zmm5 + vmovdqa64 384(%r11), %zmm6 + vmovdqa64 448(%r11), %zmm7 + vmovdqa64 512(%r11), %zmm8 + vmovdqa64 576(%r11), %zmm9 + vmovdqa64 640(%r11), %zmm10 + vmovdqa64 704(%r11), %zmm11 + vmovdqa64 768(%r11), %zmm12 + vmovdqa64 832(%r11), %zmm13 + vmovdqa64 896(%r11), %zmm14 + vmovdqa64 960(%r11), %zmm15 + addq $0x400, %rdx + addq $0x400, %rcx + subl $0x400, %r8d + jnz L_cp512_dstart + vmovdqu64 752(%rsi), %zmm16 + vmovdqu64 816(%rsi), %zmm17 + vmovdqu64 880(%rsi), %zmm18 + vmovdqu64 224(%rsi), %zmm24 + vmovdqu64 288(%rsi), %zmm25 + vmovdqu64 624(%rsi), %zmm26 + vmovdqu64 688(%rsi), %zmm27 + vmovdqu64 (%r10), %zmm28 + vpermi2q %zmm27, %zmm26, %zmm28 + vmovdqu64 (%r10), %zmm29 + vpermi2q %zmm25, %zmm24, %zmm29 + vinserti64x4 $0x01, %ymm29, %zmm28, %zmm19 + vmovdqu64 64(%r10), %zmm28 + vpermi2q %zmm27, %zmm26, %zmm28 + vmovdqu64 64(%r10), %zmm29 + vpermi2q %zmm25, %zmm24, %zmm29 + vinserti64x4 $0x01, %ymm29, %zmm28, %zmm20 + vmovdqu64 128(%r10), %zmm28 + vpermi2q %zmm27, %zmm26, %zmm28 + vmovdqu64 128(%r10), %zmm29 + vpermi2q %zmm25, %zmm24, %zmm29 + vinserti64x4 $0x01, %ymm29, %zmm28, %zmm21 + vpsllq $2, %zmm20, %zmm30 + vpsllq $4, %zmm20, %zmm22 + vpaddq %zmm30, %zmm22, %zmm22 + vpsllq $2, %zmm21, %zmm30 + vpsllq $4, %zmm21, %zmm23 + vpaddq %zmm30, %zmm23, %zmm23 + vpxorq %zmm24, %zmm24, %zmm24 + vpxorq %zmm25, %zmm25, %zmm25 + vpxorq %zmm26, %zmm26, %zmm26 + vpxorq %zmm27, %zmm27, %zmm27 + vpxorq %zmm28, %zmm28, %zmm28 + vpxorq %zmm29, %zmm29, %zmm29 + vpmadd52luq %zmm19, %zmm16, %zmm24 + vpmadd52luq %zmm23, %zmm17, %zmm24 + vpmadd52luq %zmm22, %zmm18, %zmm24 + vpmadd52huq %zmm19, %zmm16, %zmm27 + vpmadd52huq %zmm23, %zmm17, %zmm27 + vpmadd52huq %zmm22, %zmm18, %zmm27 + vpmadd52luq %zmm20, %zmm16, %zmm25 + vpmadd52luq %zmm19, %zmm17, %zmm25 + vpmadd52luq %zmm23, %zmm18, %zmm25 + vpmadd52huq %zmm20, %zmm16, %zmm28 + vpmadd52huq %zmm19, %zmm17, %zmm28 + vpmadd52huq %zmm23, %zmm18, %zmm28 + vpmadd52luq %zmm21, %zmm16, %zmm26 + vpmadd52luq %zmm20, %zmm17, %zmm26 + vpmadd52luq %zmm19, %zmm18, %zmm26 + vpmadd52huq %zmm21, %zmm16, %zmm29 + vpmadd52huq %zmm20, %zmm17, %zmm29 + vpmadd52huq %zmm19, %zmm18, %zmm29 + vpsllq $8, %zmm27, %zmm30 + vpaddq %zmm25, %zmm30, %zmm25 + vpsllq $8, %zmm28, %zmm30 + vpaddq %zmm26, %zmm30, %zmm26 + vpsllq $8, %zmm29, %zmm31 + vpsllq $2, %zmm31, %zmm30 + vpsllq $4, %zmm31, %zmm31 + vpaddq %zmm30, %zmm31, %zmm31 + vpaddq %zmm24, %zmm31, %zmm24 + vpsrlq $44, %zmm24, %zmm30 + vpandq (%rax), %zmm24, %zmm16 + vpaddq %zmm25, %zmm30, %zmm25 + vpsrlq $44, %zmm25, %zmm30 + vpandq (%rax), %zmm25, %zmm17 + vpaddq %zmm26, %zmm30, %zmm26 + vpsrlq $44, %zmm26, %zmm30 + vpandq (%rax), %zmm26, %zmm18 + vpsllq $2, %zmm30, %zmm31 + vpsllq $4, %zmm30, %zmm30 + vpaddq %zmm31, %zmm30, %zmm30 + vpaddq %zmm16, %zmm30, %zmm16 + vshufi64x2 $0x4e, %zmm16, %zmm16, %zmm24 + vshufi64x2 $0x4e, %zmm17, %zmm17, %zmm25 + vshufi64x2 $0x4e, %zmm18, %zmm18, %zmm26 + vpaddq %zmm16, %zmm24, %zmm16 + vpaddq %zmm17, %zmm25, %zmm17 + vpaddq %zmm18, %zmm26, %zmm18 + vpsrldq $8, %zmm16, %zmm24 + vpsrldq $8, %zmm17, %zmm25 + vpsrldq $8, %zmm18, %zmm26 + vpaddq %zmm16, %zmm24, %zmm16 + vpaddq %zmm17, %zmm25, %zmm17 + vpaddq %zmm18, %zmm26, %zmm18 + vpermq $2, %zmm16, %zmm24 + vpermq $2, %zmm17, %zmm25 + vpermq $2, %zmm18, %zmm26 + vpaddq %zmm16, %zmm24, %zmm16 + vpaddq %zmm17, %zmm25, %zmm17 + vpaddq %zmm18, %zmm26, %zmm18 + vmovq %xmm16, %r12 + vmovq %xmm17, %r13 + vmovq %xmm18, %r14 + movq %r13, %r10 + shrq $20, %r10 + movq %r14, %r11 + shrq $40, %r11 + movq %r12, %rax + movq %r13, %r12 + shlq $44, %r12 + addq %r12, %rax + adcq $0x00, %r10 + movq %r14, %r12 + shlq $24, %r12 + addq %r12, %r10 + adcq $0x00, %r11 + movq %r11, %r9 + andq $3, %r11 + shrq $2, %r9 + leaq 0(%r9,%r9,4), %r9 + addq %r9, %rax + adcq $0x00, %r10 + adcq $0x00, %r11 + movq 24(%rsi), %r12 + movq %r12, 64(%rsi) + movq 32(%rsi), %r12 + movq %r12, 72(%rsi) + movq 40(%rsi), %r12 + movq %r12, 80(%rsi) + movq %rax, 24(%rsi) + movq %r10, 32(%rsi) + movq %r11, 40(%rsi) + vmovd %xmm12, 48(%rdi) + vzeroupper + addq $0x4b0, %rsp + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size chacha20_poly1305_ifma_decrypt,.-chacha20_poly1305_ifma_decrypt +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX512 */ +#ifdef HAVE_INTEL_AVX2 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_chacha20_poly1305_small_enc_rotl8: +.quad 0x0605040702010003,0x0e0d0c0f0a09080b +.quad 0x0605040702010003,0x0e0d0c0f0a09080b +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_chacha20_poly1305_small_enc_rotl16: +.quad 0x0504070601000302,0x0d0c0f0e09080b0a +.quad 0x0504070601000302,0x0d0c0f0e09080b0a +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_chacha20_poly1305_small_enc_ymm_inc: +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000001,0x0000000000000000 +#ifndef __APPLE__ +.text +.globl chacha20_poly1305_small_enc +.type chacha20_poly1305_small_enc,@function +.align 16 +chacha20_poly1305_small_enc: +#else +.section __TEXT,__text +.globl _chacha20_poly1305_small_enc +.p2align 4 +_chacha20_poly1305_small_enc: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + subq $0xc0, %rsp + movl 248(%rsp), %eax + movq %rax, 128(%rsp) + movq 256(%rsp), %rax + movq %rax, 152(%rsp) + movq %rcx, 136(%rsp) + movq %r8, %rax + movq %rax, 144(%rsp) + leaq L_chacha20_poly1305_small_enc_rotl8(%rip), %r11 + leaq L_chacha20_poly1305_small_enc_rotl16(%rip), %r12 + leaq L_chacha20_poly1305_small_enc_ymm_inc(%rip), %r13 + vbroadcasti128 (%rdi), %ymm0 + vbroadcasti128 16(%rdi), %ymm1 + vbroadcasti128 32(%rdi), %ymm2 + vbroadcasti128 48(%rdi), %ymm3 + vpaddd (%r13), %ymm3, %ymm3 + vmovdqa %ymm0, %ymm10 + vmovdqa %ymm1, %ymm11 + vmovdqa %ymm2, %ymm12 + vmovdqa %ymm3, %ymm13 + movb $10, %cl +L_c20p1305_small_enc_crypt2_start: + vpaddd %ymm1, %ymm0, %ymm0 + vpxor %ymm0, %ymm3, %ymm3 + vpshufb (%r12), %ymm3, %ymm3 + vpaddd %ymm3, %ymm2, %ymm2 + vpxor %ymm2, %ymm1, %ymm1 + vpsrld $20, %ymm1, %ymm8 + vpslld $12, %ymm1, %ymm1 + vpxor %ymm8, %ymm1, %ymm1 + vpaddd %ymm1, %ymm0, %ymm0 + vpxor %ymm0, %ymm3, %ymm3 + vpshufb (%r11), %ymm3, %ymm3 + vpaddd %ymm3, %ymm2, %ymm2 + vpxor %ymm2, %ymm1, %ymm1 + vpsrld $25, %ymm1, %ymm8 + vpslld $7, %ymm1, %ymm1 + vpxor %ymm8, %ymm1, %ymm1 + vpshufd $57, %ymm1, %ymm1 + vpshufd $0x4e, %ymm2, %ymm2 + vpshufd $0x93, %ymm3, %ymm3 + vpaddd %ymm1, %ymm0, %ymm0 + vpxor %ymm0, %ymm3, %ymm3 + vpshufb (%r12), %ymm3, %ymm3 + vpaddd %ymm3, %ymm2, %ymm2 + vpxor %ymm2, %ymm1, %ymm1 + vpsrld $20, %ymm1, %ymm8 + vpslld $12, %ymm1, %ymm1 + vpxor %ymm8, %ymm1, %ymm1 + vpaddd %ymm1, %ymm0, %ymm0 + vpxor %ymm0, %ymm3, %ymm3 + vpshufb (%r11), %ymm3, %ymm3 + vpaddd %ymm3, %ymm2, %ymm2 + vpxor %ymm2, %ymm1, %ymm1 + vpsrld $25, %ymm1, %ymm8 + vpslld $7, %ymm1, %ymm1 + vpxor %ymm8, %ymm1, %ymm1 + vpshufd $0x93, %ymm1, %ymm1 + vpshufd $0x4e, %ymm2, %ymm2 + vpshufd $57, %ymm3, %ymm3 + decb %cl + jnz L_c20p1305_small_enc_crypt2_start + vpaddd %ymm10, %ymm0, %ymm0 + vpaddd %ymm11, %ymm1, %ymm1 + vpaddd %ymm12, %ymm2, %ymm2 + vpaddd %ymm13, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm4 + vextracti128 $0x01, %ymm1, %xmm5 + vextracti128 $0x01, %ymm2, %xmm6 + vextracti128 $0x01, %ymm3, %xmm7 + vmovdqu %xmm0, (%rsp) + vmovdqu %xmm1, 16(%rsp) + vmovdqu %xmm4, 32(%rsp) + vmovdqu %xmm5, 48(%rsp) + vmovdqu %xmm6, 64(%rsp) + vmovdqu %xmm7, 80(%rsp) + movq 136(%rsp), %rcx + movq 144(%rsp), %rbp + leaq 32(%rsp), %rbx +L_chacha20_poly1305_small_enc_x16: + cmpq $16, %rbp + jl L_chacha20_poly1305_small_enc_xtail + vmovdqu (%rdx), %xmm8 + vpxor (%rbx), %xmm8, %xmm8 + vmovdqu %xmm8, (%rcx) + addq $16, %rdx + addq $16, %rcx + addq $16, %rbx + subq $16, %rbp + jmp L_chacha20_poly1305_small_enc_x16 +L_chacha20_poly1305_small_enc_xtail: + vzeroupper + testq %rbp, %rbp + jz L_chacha20_poly1305_small_enc_xdone + xorq %rdi, %rdi +L_chacha20_poly1305_small_enc_xbyte: + cmpq %rbp, %rdi + jge L_chacha20_poly1305_small_enc_xdone + movzbl (%rdx,%rdi,1), %eax + xorb (%rbx,%rdi,1), %al + movb %al, (%rcx,%rdi,1) + incq %rdi + jmp L_chacha20_poly1305_small_enc_xbyte +L_chacha20_poly1305_small_enc_xdone: + movq %rsi, %r10 + movabsq $0xffffffc0fffffff, %rax + movabsq $0xffffffc0ffffffc, %rdx + movq (%rsp), %r11 + andq %rax, %r11 + movq 8(%rsp), %r12 + andq %rdx, %r12 + movq 16(%rsp), %rax + movq %rax, 48(%r10) + movq 24(%rsp), %rax + movq %rax, 56(%r10) + xorq %rax, %rax + movq %rax, 352(%r10) + movq %rax, 408(%r10) + movq %r11, 360(%r10) + movq %r12, 416(%r10) + movq %r11, %rcx + movq %r12, %rsi + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 368(%r10) + movq %rsi, 424(%r10) + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 376(%r10) + movq %rsi, 432(%r10) + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 384(%r10) + movq %rsi, 440(%r10) + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 392(%r10) + movq %rsi, 448(%r10) + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 400(%r10) + movq %rsi, 456(%r10) + xorq %r13, %r13 + xorq %r14, %r14 + xorq %r15, %r15 + movq %r9, %rbx + movq 128(%rsp), %rbp +L_c20p1305_small_aad_full: + cmpq $16, %rbp + jl L_c20p1305_small_aad_part + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 + addq $16, %rbx + subq $16, %rbp + jmp L_c20p1305_small_aad_full +L_c20p1305_small_aad_part: + testq %rbp, %rbp + jz L_c20p1305_small_aad_done + xorq %rax, %rax + movq %rax, 96(%rsp) + movq %rax, 104(%rsp) + leaq 96(%rsp), %r9 + cmpq $8, %rbp + jl L_c20p1305_small_aad_c4 + movq (%rbx), %rax + movq %rax, (%r9) + addq $8, %rbx + addq $8, %r9 + subq $8, %rbp +L_c20p1305_small_aad_c4: + cmpq $4, %rbp + jl L_c20p1305_small_aad_cby + movl (%rbx), %eax + movl %eax, (%r9) + addq $4, %rbx + addq $4, %r9 + subq $4, %rbp +L_c20p1305_small_aad_cby: + testq %rbp, %rbp + jz L_c20p1305_small_aad_cpyd +L_c20p1305_small_aad_cbyl: + movzbl (%rbx), %eax + movb %al, (%r9) + addq $0x01, %rbx + addq $0x01, %r9 + subq $0x01, %rbp + jnz L_c20p1305_small_aad_cbyl +L_c20p1305_small_aad_cpyd: + leaq 96(%rsp), %rbx + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 +L_c20p1305_small_aad_done: + movq 136(%rsp), %rbx + movq 144(%rsp), %rbp +L_c20p1305_small_ct_full: + cmpq $16, %rbp + jl L_c20p1305_small_ct_part + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 + addq $16, %rbx + subq $16, %rbp + jmp L_c20p1305_small_ct_full +L_c20p1305_small_ct_part: + testq %rbp, %rbp + jz L_c20p1305_small_ct_done + xorq %rax, %rax + movq %rax, 96(%rsp) + movq %rax, 104(%rsp) + leaq 96(%rsp), %r9 + cmpq $8, %rbp + jl L_c20p1305_small_ct_c4 + movq (%rbx), %rax + movq %rax, (%r9) + addq $8, %rbx + addq $8, %r9 + subq $8, %rbp +L_c20p1305_small_ct_c4: + cmpq $4, %rbp + jl L_c20p1305_small_ct_cby + movl (%rbx), %eax + movl %eax, (%r9) + addq $4, %rbx + addq $4, %r9 + subq $4, %rbp +L_c20p1305_small_ct_cby: + testq %rbp, %rbp + jz L_c20p1305_small_ct_cpyd +L_c20p1305_small_ct_cbyl: + movzbl (%rbx), %eax + movb %al, (%r9) + addq $0x01, %rbx + addq $0x01, %r9 + subq $0x01, %rbp + jnz L_c20p1305_small_ct_cbyl +L_c20p1305_small_ct_cpyd: + leaq 96(%rsp), %rbx + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 +L_c20p1305_small_ct_done: + movq 128(%rsp), %rax + movq %rax, 112(%rsp) + movq 144(%rsp), %rax + movq %rax, 120(%rsp) + leaq 112(%rsp), %rbx + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 + movq 152(%rsp), %rbx + movq %r15, %rcx + andq $3, %r15 + shrq $2, %rcx + leaq 0(%rcx,%rcx,4), %rcx + addq %rcx, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + movq %r13, %rcx + movq %r14, %rsi + movq %r15, %rdi + addq $5, %rcx + adcq $0x00, %rsi + adcq $0x00, %rdi + cmpq $4, %rdi + cmoveq %rcx, %r13 + cmoveq %rsi, %r14 + addq 48(%r10), %r13 + adcq 56(%r10), %r14 + movq %r13, (%rbx) + movq %r14, 8(%rbx) + vpxor %xmm0, %xmm0, %xmm0 + vmovdqu %xmm0, (%rsp) + vmovdqu %xmm0, 16(%rsp) + vmovdqu %xmm0, 32(%rsp) + vmovdqu %xmm0, 48(%rsp) + vmovdqu %xmm0, 64(%rsp) + vmovdqu %xmm0, 80(%rsp) + addq $0xc0, %rsp + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size chacha20_poly1305_small_enc,.-chacha20_poly1305_small_enc +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl chacha20_poly1305_small_dec +.type chacha20_poly1305_small_dec,@function +.align 16 +chacha20_poly1305_small_dec: +#else +.section __TEXT,__text +.globl _chacha20_poly1305_small_dec +.p2align 4 +_chacha20_poly1305_small_dec: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + subq $0xa8, %rsp + movl 224(%rsp), %eax + movq %rax, 128(%rsp) + movq 232(%rsp), %rax + movq %rax, 144(%rsp) + movq %r8, %rax + movq %rax, 136(%rsp) + movq %rdx, %rax + movq %rax, 152(%rsp) + movq %rcx, %rax + movq %rax, 160(%rsp) + leaq L_chacha20_poly1305_small_enc_rotl8(%rip), %r11 + leaq L_chacha20_poly1305_small_enc_rotl16(%rip), %r12 + leaq L_chacha20_poly1305_small_enc_ymm_inc(%rip), %r13 + vbroadcasti128 (%rdi), %ymm0 + vbroadcasti128 16(%rdi), %ymm1 + vbroadcasti128 32(%rdi), %ymm2 + vbroadcasti128 48(%rdi), %ymm3 + vpaddd (%r13), %ymm3, %ymm3 + vmovdqa %ymm0, %ymm10 + vmovdqa %ymm1, %ymm11 + vmovdqa %ymm2, %ymm12 + vmovdqa %ymm3, %ymm13 + movb $10, %cl +L_c20p1305_small_dec_crypt2_start: + vpaddd %ymm1, %ymm0, %ymm0 + vpxor %ymm0, %ymm3, %ymm3 + vpshufb (%r12), %ymm3, %ymm3 + vpaddd %ymm3, %ymm2, %ymm2 + vpxor %ymm2, %ymm1, %ymm1 + vpsrld $20, %ymm1, %ymm8 + vpslld $12, %ymm1, %ymm1 + vpxor %ymm8, %ymm1, %ymm1 + vpaddd %ymm1, %ymm0, %ymm0 + vpxor %ymm0, %ymm3, %ymm3 + vpshufb (%r11), %ymm3, %ymm3 + vpaddd %ymm3, %ymm2, %ymm2 + vpxor %ymm2, %ymm1, %ymm1 + vpsrld $25, %ymm1, %ymm8 + vpslld $7, %ymm1, %ymm1 + vpxor %ymm8, %ymm1, %ymm1 + vpshufd $57, %ymm1, %ymm1 + vpshufd $0x4e, %ymm2, %ymm2 + vpshufd $0x93, %ymm3, %ymm3 + vpaddd %ymm1, %ymm0, %ymm0 + vpxor %ymm0, %ymm3, %ymm3 + vpshufb (%r12), %ymm3, %ymm3 + vpaddd %ymm3, %ymm2, %ymm2 + vpxor %ymm2, %ymm1, %ymm1 + vpsrld $20, %ymm1, %ymm8 + vpslld $12, %ymm1, %ymm1 + vpxor %ymm8, %ymm1, %ymm1 + vpaddd %ymm1, %ymm0, %ymm0 + vpxor %ymm0, %ymm3, %ymm3 + vpshufb (%r11), %ymm3, %ymm3 + vpaddd %ymm3, %ymm2, %ymm2 + vpxor %ymm2, %ymm1, %ymm1 + vpsrld $25, %ymm1, %ymm8 + vpslld $7, %ymm1, %ymm1 + vpxor %ymm8, %ymm1, %ymm1 + vpshufd $0x93, %ymm1, %ymm1 + vpshufd $0x4e, %ymm2, %ymm2 + vpshufd $57, %ymm3, %ymm3 + decb %cl + jnz L_c20p1305_small_dec_crypt2_start + vpaddd %ymm10, %ymm0, %ymm0 + vpaddd %ymm11, %ymm1, %ymm1 + vpaddd %ymm12, %ymm2, %ymm2 + vpaddd %ymm13, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm4 + vextracti128 $0x01, %ymm1, %xmm5 + vextracti128 $0x01, %ymm2, %xmm6 + vextracti128 $0x01, %ymm3, %xmm7 + movq %rsi, %r10 + vmovdqu %xmm0, (%rsp) + vmovdqu %xmm1, 16(%rsp) + vmovdqu %xmm4, 32(%rsp) + vmovdqu %xmm5, 48(%rsp) + vmovdqu %xmm6, 64(%rsp) + vmovdqu %xmm7, 80(%rsp) + movabsq $0xffffffc0fffffff, %rax + movabsq $0xffffffc0ffffffc, %rdx + movq (%rsp), %r11 + andq %rax, %r11 + movq 8(%rsp), %r12 + andq %rdx, %r12 + movq 16(%rsp), %rax + movq %rax, 48(%r10) + movq 24(%rsp), %rax + movq %rax, 56(%r10) + xorq %rax, %rax + movq %rax, 352(%r10) + movq %rax, 408(%r10) + movq %r11, 360(%r10) + movq %r12, 416(%r10) + movq %r11, %rcx + movq %r12, %rsi + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 368(%r10) + movq %rsi, 424(%r10) + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 376(%r10) + movq %rsi, 432(%r10) + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 384(%r10) + movq %rsi, 440(%r10) + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 392(%r10) + movq %rsi, 448(%r10) + addq %r11, %rcx + addq %r12, %rsi + movq %rcx, 400(%r10) + movq %rsi, 456(%r10) + xorq %r13, %r13 + xorq %r14, %r14 + xorq %r15, %r15 + movq %r9, %rbx + movq 128(%rsp), %rbp +L_c20p1305_small_dec_aad_full: + cmpq $16, %rbp + jl L_c20p1305_small_dec_aad_part + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 + addq $16, %rbx + subq $16, %rbp + jmp L_c20p1305_small_dec_aad_full +L_c20p1305_small_dec_aad_part: + testq %rbp, %rbp + jz L_c20p1305_small_dec_aad_done + xorq %rax, %rax + movq %rax, 96(%rsp) + movq %rax, 104(%rsp) + leaq 96(%rsp), %r9 + cmpq $8, %rbp + jl L_c20p1305_small_dec_aad_c4 + movq (%rbx), %rax + movq %rax, (%r9) + addq $8, %rbx + addq $8, %r9 + subq $8, %rbp +L_c20p1305_small_dec_aad_c4: + cmpq $4, %rbp + jl L_c20p1305_small_dec_aad_cby + movl (%rbx), %eax + movl %eax, (%r9) + addq $4, %rbx + addq $4, %r9 + subq $4, %rbp +L_c20p1305_small_dec_aad_cby: + testq %rbp, %rbp + jz L_c20p1305_small_dec_aad_cpyd +L_c20p1305_small_dec_aad_cbyl: + movzbl (%rbx), %eax + movb %al, (%r9) + addq $0x01, %rbx + addq $0x01, %r9 + subq $0x01, %rbp + jnz L_c20p1305_small_dec_aad_cbyl +L_c20p1305_small_dec_aad_cpyd: + leaq 96(%rsp), %rbx + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 +L_c20p1305_small_dec_aad_done: + movq 152(%rsp), %rbx + movq 136(%rsp), %rbp +L_c20p1305_small_dec_ct_full: + cmpq $16, %rbp + jl L_c20p1305_small_dec_ct_part + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 + addq $16, %rbx + subq $16, %rbp + jmp L_c20p1305_small_dec_ct_full +L_c20p1305_small_dec_ct_part: + testq %rbp, %rbp + jz L_c20p1305_small_dec_ct_done + xorq %rax, %rax + movq %rax, 96(%rsp) + movq %rax, 104(%rsp) + leaq 96(%rsp), %r9 + cmpq $8, %rbp + jl L_c20p1305_small_dec_ct_c4 + movq (%rbx), %rax + movq %rax, (%r9) + addq $8, %rbx + addq $8, %r9 + subq $8, %rbp +L_c20p1305_small_dec_ct_c4: + cmpq $4, %rbp + jl L_c20p1305_small_dec_ct_cby + movl (%rbx), %eax + movl %eax, (%r9) + addq $4, %rbx + addq $4, %r9 + subq $4, %rbp +L_c20p1305_small_dec_ct_cby: + testq %rbp, %rbp + jz L_c20p1305_small_dec_ct_cpyd +L_c20p1305_small_dec_ct_cbyl: + movzbl (%rbx), %eax + movb %al, (%r9) + addq $0x01, %rbx + addq $0x01, %r9 + subq $0x01, %rbp + jnz L_c20p1305_small_dec_ct_cbyl +L_c20p1305_small_dec_ct_cpyd: + leaq 96(%rsp), %rbx + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 +L_c20p1305_small_dec_ct_done: + movq 128(%rsp), %rax + movq %rax, 112(%rsp) + movq 136(%rsp), %rax + movq %rax, 120(%rsp) + leaq 112(%rsp), %rbx + movq (%rbx), %rcx + movq 8(%rbx), %rsi + addq %rcx, %r13 + adcq %rsi, %r14 + movq %r12, %rax + adcq $0x01, %r15 + mulq %r13 + movq %rax, %rsi + movq %rdx, %rdi + movq %r11, %rax + mulq %r14 + addq %rax, %rsi + movq %r11, %rax + adcq %rdx, %rdi + mulq %r13 + movq %rax, %rcx + movq %rdx, %r9 + movq %r12, %rax + mulq %r14 + addq 352(%r10,%r15,8), %rdi + movq %rdx, %r8 + addq %r9, %rsi + adcq %rax, %rdi + adcq 408(%r10,%r15,8), %r8 + movq %rdi, %r15 + andq $-4, %rdi + andq $3, %r15 + addq %rdi, %rcx + movq %rdi, %r13 + adcq %r8, %rsi + adcq $0x00, %r15 + shrdq $2, %r8, %r13 + shrq $2, %r8 + addq %rcx, %r13 + adcq %r8, %rsi + movq %rsi, %r14 + adcq $0x00, %r15 + movq 152(%rsp), %rdx + movq 160(%rsp), %rcx + movq 136(%rsp), %rbp + leaq 32(%rsp), %rbx +L_chacha20_poly1305_small_dec_x16: + cmpq $16, %rbp + jl L_chacha20_poly1305_small_dec_xtail + vmovdqu (%rdx), %xmm8 + vpxor (%rbx), %xmm8, %xmm8 + vmovdqu %xmm8, (%rcx) + addq $16, %rdx + addq $16, %rcx + addq $16, %rbx + subq $16, %rbp + jmp L_chacha20_poly1305_small_dec_x16 +L_chacha20_poly1305_small_dec_xtail: + testq %rbp, %rbp + jz L_chacha20_poly1305_small_dec_xdone + xorq %rdi, %rdi +L_chacha20_poly1305_small_dec_xbyte: + cmpq %rbp, %rdi + jge L_chacha20_poly1305_small_dec_xdone + movzbl (%rdx,%rdi,1), %eax + xorb (%rbx,%rdi,1), %al + movb %al, (%rcx,%rdi,1) + incq %rdi + jmp L_chacha20_poly1305_small_dec_xbyte +L_chacha20_poly1305_small_dec_xdone: + vpxor %xmm0, %xmm0, %xmm0 + vmovdqu %xmm0, (%rsp) + vmovdqu %xmm0, 16(%rsp) + vmovdqu %xmm0, 32(%rsp) + vmovdqu %xmm0, 48(%rsp) + vmovdqu %xmm0, 64(%rsp) + vmovdqu %xmm0, 80(%rsp) + vzeroupper + movq 144(%rsp), %rbx + movq %r15, %rcx + andq $3, %r15 + shrq $2, %rcx + leaq 0(%rcx,%rcx,4), %rcx + addq %rcx, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + movq %r13, %rcx + movq %r14, %rsi + movq %r15, %rdi + addq $5, %rcx + adcq $0x00, %rsi + adcq $0x00, %rdi + cmpq $4, %rdi + cmoveq %rcx, %r13 + cmoveq %rsi, %r14 + addq 48(%r10), %r13 + adcq 56(%r10), %r14 + xorq (%rbx), %r13 + xorq 8(%rbx), %r14 + orq %r14, %r13 + movq %r13, %rax + negq %rax + orq %r13, %rax + shrq $63, %rax + addq $0xa8, %rsp + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size chacha20_poly1305_small_dec,.-chacha20_poly1305_small_dec +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX2 */ #endif /* WOLFSSL_X86_64_BUILD */ #if defined(__linux__) && defined(__ELF__) diff --git a/wolfcrypt/src/chacha_asm.asm b/wolfcrypt/src/chacha_asm.asm index 80afbfdb3b0..1a160882bc6 100644 --- a/wolfcrypt/src/chacha_asm.asm +++ b/wolfcrypt/src/chacha_asm.asm @@ -74,117 +74,105 @@ L_chacha_x64_start: mov r14d, DWORD PTR [rcx+56] mov r15d, DWORD PTR [rcx+60] mov BYTE PTR [rsp], 10 - mov edx, DWORD PTR [rsp+8] - mov ebp, DWORD PTR [rsp+12] L_chacha_x64_block_crypt_start: add eax, r8d add ebx, r9d - xor r12d, eax - xor r13d, ebx - rol r12d, 16 - rol r13d, 16 - add edx, r12d - add ebp, r13d - xor r8d, edx - xor r9d, ebp - rol r8d, 12 - rol r9d, 12 - add eax, r8d - add ebx, r9d - xor r12d, eax - xor r13d, ebx - rol r12d, 8 - rol r13d, 8 - add edx, r12d - add ebp, r13d - xor r8d, edx - xor r9d, ebp - rol r8d, 7 - rol r9d, 7 - mov DWORD PTR [rsp+8], edx - mov DWORD PTR [rsp+12], ebp - mov edx, DWORD PTR [rsp+16] - mov ebp, DWORD PTR [rsp+20] add r9d, r10d add r8d, r11d + xor r12d, eax + xor r13d, ebx xor r14d, r9d xor r15d, r8d + rol r12d, 16 + rol r13d, 16 rol r14d, 16 rol r15d, 16 - add edx, r14d - add ebp, r15d - xor r10d, edx - xor r11d, ebp + add DWORD PTR [rsp+8], r12d + add DWORD PTR [rsp+12], r13d + add DWORD PTR [rsp+16], r14d + add DWORD PTR [rsp+20], r15d + xor r8d, DWORD PTR [rsp+8] + xor r9d, DWORD PTR [rsp+12] + xor r10d, DWORD PTR [rsp+16] + xor r11d, DWORD PTR [rsp+20] + rol r8d, 12 + rol r9d, 12 rol r10d, 12 rol r11d, 12 + add eax, r8d + add ebx, r9d add r9d, r10d add r8d, r11d + xor r12d, eax + xor r13d, ebx xor r14d, r9d xor r15d, r8d + rol r12d, 8 + rol r13d, 8 rol r14d, 8 rol r15d, 8 - add edx, r14d - add ebp, r15d - xor r10d, edx - xor r11d, ebp + add DWORD PTR [rsp+8], r12d + add DWORD PTR [rsp+12], r13d + add DWORD PTR [rsp+16], r14d + add DWORD PTR [rsp+20], r15d + xor r8d, DWORD PTR [rsp+8] + xor r9d, DWORD PTR [rsp+12] + xor r10d, DWORD PTR [rsp+16] + xor r11d, DWORD PTR [rsp+20] + rol r8d, 7 + rol r9d, 7 rol r10d, 7 rol r11d, 7 add eax, r9d add ebx, r10d - xor r15d, eax - xor r12d, ebx - rol r15d, 16 - rol r12d, 16 - add edx, r15d - add ebp, r12d - xor r9d, edx - xor r10d, ebp - rol r9d, 12 - rol r10d, 12 - add eax, r9d - add ebx, r10d - xor r15d, eax - xor r12d, ebx - rol r15d, 8 - rol r12d, 8 - add edx, r15d - add ebp, r12d - xor r9d, edx - xor r10d, ebp - rol r9d, 7 - rol r10d, 7 - mov DWORD PTR [rsp+16], edx - mov DWORD PTR [rsp+20], ebp - mov edx, DWORD PTR [rsp+8] - mov ebp, DWORD PTR [rsp+12] add r9d, r11d add r8d, r8d + xor r15d, eax + xor r12d, ebx xor r13d, r9d xor r14d, r8d + rol r15d, 16 + rol r12d, 16 rol r13d, 16 rol r14d, 16 - add edx, r13d - add ebp, r14d - xor r11d, edx - xor r8d, ebp + add DWORD PTR [rsp+16], r15d + add DWORD PTR [rsp+20], r12d + add DWORD PTR [rsp+8], r13d + add DWORD PTR [rsp+12], r14d + xor r9d, DWORD PTR [rsp+16] + xor r10d, DWORD PTR [rsp+20] + xor r11d, DWORD PTR [rsp+8] + xor r8d, DWORD PTR [rsp+12] + rol r9d, 12 + rol r10d, 12 rol r11d, 12 rol r8d, 12 + add eax, r9d + add ebx, r10d add r9d, r11d add r8d, r8d + xor r15d, eax + xor r12d, ebx xor r13d, r9d xor r14d, r8d + rol r15d, 8 + rol r12d, 8 rol r13d, 8 rol r14d, 8 - add edx, r13d - add ebp, r14d - xor r11d, edx - xor r8d, ebp + add DWORD PTR [rsp+16], r15d + add DWORD PTR [rsp+20], r12d + add DWORD PTR [rsp+8], r13d + add DWORD PTR [rsp+12], r14d + xor r9d, DWORD PTR [rsp+16] + xor r10d, DWORD PTR [rsp+20] + xor r11d, DWORD PTR [rsp+8] + xor r8d, DWORD PTR [rsp+12] + rol r9d, 7 + rol r10d, 7 rol r11d, 7 rol r8d, 7 dec BYTE PTR [rsp] jnz L_chacha_x64_block_crypt_start - mov DWORD PTR [rsp+8], edx - mov DWORD PTR [rsp+12], ebp mov rdx, QWORD PTR [rsp+32] mov rbp, QWORD PTR [rsp+24] add eax, DWORD PTR [rcx] @@ -272,117 +260,105 @@ L_chacha_x64_small: mov r14d, DWORD PTR [rcx+56] mov r15d, DWORD PTR [rcx+60] mov BYTE PTR [rsp], 10 - mov edx, DWORD PTR [rsp+8] - mov ebp, DWORD PTR [rsp+12] L_chacha_x64_partial_crypt_start: add eax, r8d add ebx, r9d - xor r12d, eax - xor r13d, ebx - rol r12d, 16 - rol r13d, 16 - add edx, r12d - add ebp, r13d - xor r8d, edx - xor r9d, ebp - rol r8d, 12 - rol r9d, 12 - add eax, r8d - add ebx, r9d - xor r12d, eax - xor r13d, ebx - rol r12d, 8 - rol r13d, 8 - add edx, r12d - add ebp, r13d - xor r8d, edx - xor r9d, ebp - rol r8d, 7 - rol r9d, 7 - mov DWORD PTR [rsp+8], edx - mov DWORD PTR [rsp+12], ebp - mov edx, DWORD PTR [rsp+16] - mov ebp, DWORD PTR [rsp+20] add r9d, r10d add r8d, r11d + xor r12d, eax + xor r13d, ebx xor r14d, r9d xor r15d, r8d + rol r12d, 16 + rol r13d, 16 rol r14d, 16 rol r15d, 16 - add edx, r14d - add ebp, r15d - xor r10d, edx - xor r11d, ebp + add DWORD PTR [rsp+8], r12d + add DWORD PTR [rsp+12], r13d + add DWORD PTR [rsp+16], r14d + add DWORD PTR [rsp+20], r15d + xor r8d, DWORD PTR [rsp+8] + xor r9d, DWORD PTR [rsp+12] + xor r10d, DWORD PTR [rsp+16] + xor r11d, DWORD PTR [rsp+20] + rol r8d, 12 + rol r9d, 12 rol r10d, 12 rol r11d, 12 + add eax, r8d + add ebx, r9d add r9d, r10d add r8d, r11d + xor r12d, eax + xor r13d, ebx xor r14d, r9d xor r15d, r8d + rol r12d, 8 + rol r13d, 8 rol r14d, 8 rol r15d, 8 - add edx, r14d - add ebp, r15d - xor r10d, edx - xor r11d, ebp + add DWORD PTR [rsp+8], r12d + add DWORD PTR [rsp+12], r13d + add DWORD PTR [rsp+16], r14d + add DWORD PTR [rsp+20], r15d + xor r8d, DWORD PTR [rsp+8] + xor r9d, DWORD PTR [rsp+12] + xor r10d, DWORD PTR [rsp+16] + xor r11d, DWORD PTR [rsp+20] + rol r8d, 7 + rol r9d, 7 rol r10d, 7 rol r11d, 7 add eax, r9d add ebx, r10d - xor r15d, eax - xor r12d, ebx - rol r15d, 16 - rol r12d, 16 - add edx, r15d - add ebp, r12d - xor r9d, edx - xor r10d, ebp - rol r9d, 12 - rol r10d, 12 - add eax, r9d - add ebx, r10d - xor r15d, eax - xor r12d, ebx - rol r15d, 8 - rol r12d, 8 - add edx, r15d - add ebp, r12d - xor r9d, edx - xor r10d, ebp - rol r9d, 7 - rol r10d, 7 - mov DWORD PTR [rsp+16], edx - mov DWORD PTR [rsp+20], ebp - mov edx, DWORD PTR [rsp+8] - mov ebp, DWORD PTR [rsp+12] add r9d, r11d add r8d, r8d + xor r15d, eax + xor r12d, ebx xor r13d, r9d xor r14d, r8d + rol r15d, 16 + rol r12d, 16 rol r13d, 16 rol r14d, 16 - add edx, r13d - add ebp, r14d - xor r11d, edx - xor r8d, ebp + add DWORD PTR [rsp+16], r15d + add DWORD PTR [rsp+20], r12d + add DWORD PTR [rsp+8], r13d + add DWORD PTR [rsp+12], r14d + xor r9d, DWORD PTR [rsp+16] + xor r10d, DWORD PTR [rsp+20] + xor r11d, DWORD PTR [rsp+8] + xor r8d, DWORD PTR [rsp+12] + rol r9d, 12 + rol r10d, 12 rol r11d, 12 rol r8d, 12 + add eax, r9d + add ebx, r10d add r9d, r11d add r8d, r8d + xor r15d, eax + xor r12d, ebx xor r13d, r9d xor r14d, r8d + rol r15d, 8 + rol r12d, 8 rol r13d, 8 rol r14d, 8 - add edx, r13d - add ebp, r14d - xor r11d, edx - xor r8d, ebp + add DWORD PTR [rsp+16], r15d + add DWORD PTR [rsp+20], r12d + add DWORD PTR [rsp+8], r13d + add DWORD PTR [rsp+12], r14d + xor r9d, DWORD PTR [rsp+16] + xor r10d, DWORD PTR [rsp+20] + xor r11d, DWORD PTR [rsp+8] + xor r8d, DWORD PTR [rsp+12] + rol r9d, 7 + rol r10d, 7 rol r11d, 7 rol r8d, 7 dec BYTE PTR [rsp] jnz L_chacha_x64_partial_crypt_start - mov DWORD PTR [rsp+8], edx - mov DWORD PTR [rsp+12], ebp mov rdx, QWORD PTR [rsp+32] add eax, DWORD PTR [rcx] add ebx, DWORD PTR [rcx+4] @@ -459,6 +435,373 @@ L_chacha_x64_done: ret chacha_encrypt_x64 ENDP _TEXT ENDS +IFNDEF HAVE_INTEL_SSSE3 +HAVE_INTEL_SSSE3 = 1 +ENDIF +IFDEF HAVE_INTEL_SSSE3 +_DATA SEGMENT +ALIGN 16 +L_chacha20_sse3_rotl8 QWORD 0605040702010003h, 0e0d0c0f0a09080bh +ptr_L_chacha20_sse3_rotl8 QWORD L_chacha20_sse3_rotl8 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_sse3_rotl16 QWORD 0504070601000302h, 0d0c0f0e09080b0ah +ptr_L_chacha20_sse3_rotl16 QWORD L_chacha20_sse3_rotl16 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_sse3_one QWORD 0000000000000001h, 0000000000000000h +ptr_L_chacha20_sse3_one QWORD L_chacha20_sse3_one +_DATA ENDS +_TEXT SEGMENT READONLY PARA +chacha_encrypt_sse3 PROC + push r12 + push r13 + push r14 + push r15 + sub rsp, 160 + vmovdqu OWORD PTR [rsp], xmm6 + vmovdqu OWORD PTR [rsp+16], xmm7 + vmovdqu OWORD PTR [rsp+32], xmm8 + vmovdqu OWORD PTR [rsp+48], xmm9 + vmovdqu OWORD PTR [rsp+64], xmm10 + vmovdqu OWORD PTR [rsp+80], xmm11 + vmovdqu OWORD PTR [rsp+96], xmm12 + vmovdqu OWORD PTR [rsp+112], xmm13 + vmovdqu OWORD PTR [rsp+128], xmm14 + vmovdqu OWORD PTR [rsp+144], xmm15 + mov r13, QWORD PTR [ptr_L_chacha20_sse3_rotl8] + mov r14, QWORD PTR [ptr_L_chacha20_sse3_rotl16] + mov r15, QWORD PTR [ptr_L_chacha20_sse3_one] + cmp r9d, 128 + jl L_chacha20_sse3_128_done +L_chacha20_sse3_128_start: + movdqu xmm0, OWORD PTR [rcx] + movdqu xmm1, OWORD PTR [rcx+16] + movdqu xmm2, OWORD PTR [rcx+32] + movdqu xmm3, OWORD PTR [rcx+48] + movdqa xmm10, xmm0 + movdqa xmm11, xmm1 + movdqa xmm12, xmm2 + movdqa xmm13, xmm3 + movdqa xmm4, xmm0 + movdqa xmm5, xmm1 + movdqa xmm6, xmm2 + movdqa xmm7, xmm3 + paddd xmm7, OWORD PTR [r15] + mov al, 10 +L_chacha20_sse3_128_crypt2_start: + paddd xmm0, xmm1 + paddd xmm4, xmm5 + pxor xmm3, xmm0 + pxor xmm7, xmm4 + pshufb xmm3, OWORD PTR [r14] + pshufb xmm7, OWORD PTR [r14] + paddd xmm2, xmm3 + paddd xmm6, xmm7 + pxor xmm1, xmm2 + pxor xmm5, xmm6 + movdqa xmm8, xmm1 + movdqa xmm9, xmm5 + psrld xmm8, 20 + psrld xmm9, 20 + pslld xmm1, 12 + pslld xmm5, 12 + pxor xmm1, xmm8 + pxor xmm5, xmm9 + paddd xmm0, xmm1 + paddd xmm4, xmm5 + pxor xmm3, xmm0 + pxor xmm7, xmm4 + pshufb xmm3, OWORD PTR [r13] + pshufb xmm7, OWORD PTR [r13] + paddd xmm2, xmm3 + paddd xmm6, xmm7 + pxor xmm1, xmm2 + pxor xmm5, xmm6 + movdqa xmm8, xmm1 + movdqa xmm9, xmm5 + psrld xmm8, 25 + psrld xmm9, 25 + pslld xmm1, 7 + pslld xmm5, 7 + pxor xmm1, xmm8 + pxor xmm5, xmm9 + pshufd xmm1, xmm1, 57 + pshufd xmm2, xmm2, 78 + pshufd xmm3, xmm3, 147 + pshufd xmm5, xmm5, 57 + pshufd xmm6, xmm6, 78 + pshufd xmm7, xmm7, 147 + paddd xmm0, xmm1 + paddd xmm4, xmm5 + pxor xmm3, xmm0 + pxor xmm7, xmm4 + pshufb xmm3, OWORD PTR [r14] + pshufb xmm7, OWORD PTR [r14] + paddd xmm2, xmm3 + paddd xmm6, xmm7 + pxor xmm1, xmm2 + pxor xmm5, xmm6 + movdqa xmm8, xmm1 + movdqa xmm9, xmm5 + psrld xmm8, 20 + psrld xmm9, 20 + pslld xmm1, 12 + pslld xmm5, 12 + pxor xmm1, xmm8 + pxor xmm5, xmm9 + paddd xmm0, xmm1 + paddd xmm4, xmm5 + pxor xmm3, xmm0 + pxor xmm7, xmm4 + pshufb xmm3, OWORD PTR [r13] + pshufb xmm7, OWORD PTR [r13] + paddd xmm2, xmm3 + paddd xmm6, xmm7 + pxor xmm1, xmm2 + pxor xmm5, xmm6 + movdqa xmm8, xmm1 + movdqa xmm9, xmm5 + psrld xmm8, 25 + psrld xmm9, 25 + pslld xmm1, 7 + pslld xmm5, 7 + pxor xmm1, xmm8 + pxor xmm5, xmm9 + pshufd xmm1, xmm1, 147 + pshufd xmm2, xmm2, 78 + pshufd xmm3, xmm3, 57 + pshufd xmm5, xmm5, 147 + pshufd xmm6, xmm6, 78 + pshufd xmm7, xmm7, 57 + dec al + jnz L_chacha20_sse3_128_crypt2_start + paddd xmm0, xmm10 + paddd xmm1, xmm11 + paddd xmm2, xmm12 + paddd xmm3, xmm13 + paddd xmm4, xmm10 + paddd xmm5, xmm11 + paddd xmm6, xmm12 + paddd xmm7, xmm13 + paddd xmm7, OWORD PTR [r15] + movdqu xmm8, OWORD PTR [rdx] + pxor xmm0, xmm8 + movdqu OWORD PTR [r8], xmm0 + movdqu xmm8, OWORD PTR [rdx+16] + pxor xmm1, xmm8 + movdqu OWORD PTR [r8+16], xmm1 + movdqu xmm8, OWORD PTR [rdx+32] + pxor xmm2, xmm8 + movdqu OWORD PTR [r8+32], xmm2 + movdqu xmm8, OWORD PTR [rdx+48] + pxor xmm3, xmm8 + movdqu OWORD PTR [r8+48], xmm3 + movdqu xmm8, OWORD PTR [rdx+64] + pxor xmm4, xmm8 + movdqu OWORD PTR [r8+64], xmm4 + movdqu xmm8, OWORD PTR [rdx+80] + pxor xmm5, xmm8 + movdqu OWORD PTR [r8+80], xmm5 + movdqu xmm8, OWORD PTR [rdx+96] + pxor xmm6, xmm8 + movdqu OWORD PTR [r8+96], xmm6 + movdqu xmm8, OWORD PTR [rdx+112] + pxor xmm7, xmm8 + movdqu OWORD PTR [r8+112], xmm7 + add DWORD PTR [rcx+48], 2 + sub r9d, 128 + add rdx, 128 + add r8, 128 + cmp r9d, 128 + jge L_chacha20_sse3_128_start +L_chacha20_sse3_128_done: + cmp r9d, 0 + je L_chacha20_sse3_last_done + movdqu xmm0, OWORD PTR [rcx] + movdqu xmm1, OWORD PTR [rcx+16] + movdqu xmm2, OWORD PTR [rcx+32] + movdqu xmm3, OWORD PTR [rcx+48] + movdqa xmm10, xmm0 + movdqa xmm11, xmm1 + movdqa xmm12, xmm2 + movdqa xmm13, xmm3 + movdqa xmm4, xmm0 + movdqa xmm5, xmm1 + movdqa xmm6, xmm2 + movdqa xmm7, xmm3 + paddd xmm7, OWORD PTR [r15] + mov al, 10 +L_chacha20_sse3_last_crypt2_start: + paddd xmm0, xmm1 + paddd xmm4, xmm5 + pxor xmm3, xmm0 + pxor xmm7, xmm4 + pshufb xmm3, OWORD PTR [r14] + pshufb xmm7, OWORD PTR [r14] + paddd xmm2, xmm3 + paddd xmm6, xmm7 + pxor xmm1, xmm2 + pxor xmm5, xmm6 + movdqa xmm8, xmm1 + movdqa xmm9, xmm5 + psrld xmm8, 20 + psrld xmm9, 20 + pslld xmm1, 12 + pslld xmm5, 12 + pxor xmm1, xmm8 + pxor xmm5, xmm9 + paddd xmm0, xmm1 + paddd xmm4, xmm5 + pxor xmm3, xmm0 + pxor xmm7, xmm4 + pshufb xmm3, OWORD PTR [r13] + pshufb xmm7, OWORD PTR [r13] + paddd xmm2, xmm3 + paddd xmm6, xmm7 + pxor xmm1, xmm2 + pxor xmm5, xmm6 + movdqa xmm8, xmm1 + movdqa xmm9, xmm5 + psrld xmm8, 25 + psrld xmm9, 25 + pslld xmm1, 7 + pslld xmm5, 7 + pxor xmm1, xmm8 + pxor xmm5, xmm9 + pshufd xmm1, xmm1, 57 + pshufd xmm2, xmm2, 78 + pshufd xmm3, xmm3, 147 + pshufd xmm5, xmm5, 57 + pshufd xmm6, xmm6, 78 + pshufd xmm7, xmm7, 147 + paddd xmm0, xmm1 + paddd xmm4, xmm5 + pxor xmm3, xmm0 + pxor xmm7, xmm4 + pshufb xmm3, OWORD PTR [r14] + pshufb xmm7, OWORD PTR [r14] + paddd xmm2, xmm3 + paddd xmm6, xmm7 + pxor xmm1, xmm2 + pxor xmm5, xmm6 + movdqa xmm8, xmm1 + movdqa xmm9, xmm5 + psrld xmm8, 20 + psrld xmm9, 20 + pslld xmm1, 12 + pslld xmm5, 12 + pxor xmm1, xmm8 + pxor xmm5, xmm9 + paddd xmm0, xmm1 + paddd xmm4, xmm5 + pxor xmm3, xmm0 + pxor xmm7, xmm4 + pshufb xmm3, OWORD PTR [r13] + pshufb xmm7, OWORD PTR [r13] + paddd xmm2, xmm3 + paddd xmm6, xmm7 + pxor xmm1, xmm2 + pxor xmm5, xmm6 + movdqa xmm8, xmm1 + movdqa xmm9, xmm5 + psrld xmm8, 25 + psrld xmm9, 25 + pslld xmm1, 7 + pslld xmm5, 7 + pxor xmm1, xmm8 + pxor xmm5, xmm9 + pshufd xmm1, xmm1, 147 + pshufd xmm2, xmm2, 78 + pshufd xmm3, xmm3, 57 + pshufd xmm5, xmm5, 147 + pshufd xmm6, xmm6, 78 + pshufd xmm7, xmm7, 57 + dec al + jnz L_chacha20_sse3_last_crypt2_start + paddd xmm0, xmm10 + paddd xmm1, xmm11 + paddd xmm2, xmm12 + paddd xmm3, xmm13 + paddd xmm4, xmm10 + paddd xmm5, xmm11 + paddd xmm6, xmm12 + paddd xmm7, xmm13 + paddd xmm7, OWORD PTR [r15] + cmp r9d, 64 + jle L_chacha20_sse3_last_lt64 + movdqu xmm8, OWORD PTR [rdx] + pxor xmm0, xmm8 + movdqu OWORD PTR [r8], xmm0 + movdqu xmm8, OWORD PTR [rdx+16] + pxor xmm1, xmm8 + movdqu OWORD PTR [r8+16], xmm1 + movdqu xmm8, OWORD PTR [rdx+32] + pxor xmm2, xmm8 + movdqu OWORD PTR [r8+32], xmm2 + movdqu xmm8, OWORD PTR [rdx+48] + pxor xmm3, xmm8 + movdqu OWORD PTR [r8+48], xmm3 + movdqa xmm0, xmm4 + movdqa xmm1, xmm5 + movdqa xmm2, xmm6 + movdqa xmm3, xmm7 + add DWORD PTR [rcx+48], 1 + sub r9d, 64 + add rdx, 64 + add r8, 64 +L_chacha20_sse3_last_lt64: + lea r10, QWORD PTR [rcx+80] + movdqu OWORD PTR [r10], xmm0 + movdqu OWORD PTR [r10+16], xmm1 + movdqu OWORD PTR [r10+32], xmm2 + movdqu OWORD PTR [r10+48], xmm3 + add DWORD PTR [rcx+48], 1 + mov eax, r9d + xor r11, r11 + and eax, 7 + jz L_chacha20_sse3_last_start64 +L_chacha20_sse3_last_start8: + movzx r12d, BYTE PTR [r10+r11] + xor r12b, BYTE PTR [rdx+r11] + mov BYTE PTR [r8+r11], r12b + inc r11d + cmp r11d, eax + jne L_chacha20_sse3_last_start8 + je L_chacha20_sse3_last_end64 +L_chacha20_sse3_last_start64: + mov r12, QWORD PTR [r10+r11] + xor r12, QWORD PTR [rdx+r11] + mov QWORD PTR [r8+r11], r12 + add r11d, 8 +L_chacha20_sse3_last_end64: + cmp r11d, r9d + jne L_chacha20_sse3_last_start64 + mov eax, 64 + sub eax, r11d + mov DWORD PTR [rcx+76], eax +L_chacha20_sse3_last_done: + vmovdqu xmm6, OWORD PTR [rsp] + vmovdqu xmm7, OWORD PTR [rsp+16] + vmovdqu xmm8, OWORD PTR [rsp+32] + vmovdqu xmm9, OWORD PTR [rsp+48] + vmovdqu xmm10, OWORD PTR [rsp+64] + vmovdqu xmm11, OWORD PTR [rsp+80] + vmovdqu xmm12, OWORD PTR [rsp+96] + vmovdqu xmm13, OWORD PTR [rsp+112] + vmovdqu xmm14, OWORD PTR [rsp+128] + vmovdqu xmm15, OWORD PTR [rsp+144] + add rsp, 160 + pop r15 + pop r14 + pop r13 + pop r12 + ret +chacha_encrypt_sse3 ENDP +_TEXT ENDS +ENDIF IFDEF HAVE_INTEL_AVX1 _DATA SEGMENT ALIGN 16 @@ -1423,4 +1766,9225 @@ L_chacha20_avx2_end256: chacha_encrypt_avx2 ENDP _TEXT ENDS ENDIF +IFDEF HAVE_INTEL_AVX512 +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx512vl_add QWORD 0000000100000000h, 0000000300000002h +ptr_L_chacha20_avx512vl_add QWORD L_chacha20_avx512vl_add +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx512vl_four QWORD 0000000400000004h, 0000000400000004h +ptr_L_chacha20_avx512vl_four QWORD L_chacha20_avx512vl_four +_DATA ENDS +_TEXT SEGMENT READONLY PARA +chacha_encrypt_avx512vl PROC + push r12 + push r13 + push r14 + push r15 + sub rsp, 560 + vmovdqu OWORD PTR [rsp+400], xmm6 + vmovdqu OWORD PTR [rsp+416], xmm7 + vmovdqu OWORD PTR [rsp+432], xmm8 + vmovdqu OWORD PTR [rsp+448], xmm9 + vmovdqu OWORD PTR [rsp+464], xmm10 + vmovdqu OWORD PTR [rsp+480], xmm11 + vmovdqu OWORD PTR [rsp+496], xmm12 + vmovdqu OWORD PTR [rsp+512], xmm13 + vmovdqu OWORD PTR [rsp+528], xmm14 + vmovdqu OWORD PTR [rsp+544], xmm15 + mov r11, rsp + lea r12, QWORD PTR [rsp+256] + mov r14, QWORD PTR [ptr_L_chacha20_avx512vl_add] + mov r15, QWORD PTR [ptr_L_chacha20_avx512vl_four] + add r11, 15 + add r12, 15 + and r11, -16 + and r12, -16 + mov eax, r9d + shr eax, 8 + jz L_chacha20_avx512vl_end128 + vpbroadcastd xmm0, DWORD PTR [rcx] + vpbroadcastd xmm1, DWORD PTR [rcx+4] + vpbroadcastd xmm2, DWORD PTR [rcx+8] + vpbroadcastd xmm3, DWORD PTR [rcx+12] + vpbroadcastd xmm4, DWORD PTR [rcx+16] + vpbroadcastd xmm5, DWORD PTR [rcx+20] + vpbroadcastd xmm6, DWORD PTR [rcx+24] + vpbroadcastd xmm7, DWORD PTR [rcx+28] + vpbroadcastd xmm8, DWORD PTR [rcx+32] + vpbroadcastd xmm9, DWORD PTR [rcx+36] + vpbroadcastd xmm10, DWORD PTR [rcx+40] + vpbroadcastd xmm11, DWORD PTR [rcx+44] + vpbroadcastd xmm12, DWORD PTR [rcx+48] + vpbroadcastd xmm13, DWORD PTR [rcx+52] + vpbroadcastd xmm14, DWORD PTR [rcx+56] + vpbroadcastd xmm15, DWORD PTR [rcx+60] + vpaddd xmm12, xmm12, OWORD PTR [r14] + vmovdqa OWORD PTR [r11], xmm0 + vmovdqa OWORD PTR [r11+16], xmm1 + vmovdqa OWORD PTR [r11+32], xmm2 + vmovdqa OWORD PTR [r11+48], xmm3 + vmovdqa OWORD PTR [r11+64], xmm4 + vmovdqa OWORD PTR [r11+80], xmm5 + vmovdqa OWORD PTR [r11+96], xmm6 + vmovdqa OWORD PTR [r11+112], xmm7 + vmovdqa OWORD PTR [r11+128], xmm8 + vmovdqa OWORD PTR [r11+144], xmm9 + vmovdqa OWORD PTR [r11+160], xmm10 + vmovdqa OWORD PTR [r11+176], xmm11 + vmovdqa OWORD PTR [r11+192], xmm12 + vmovdqa OWORD PTR [r11+208], xmm13 + vmovdqa OWORD PTR [r11+224], xmm14 + vmovdqa OWORD PTR [r11+240], xmm15 +L_chacha20_avx512vl_start128: + mov r10b, 10 +L_chacha20_avx512vl_loop128: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm1, xmm1, xmm5 + vpaddd xmm2, xmm2, xmm6 + vpaddd xmm3, xmm3, xmm7 + vpxord xmm12, xmm12, xmm0 + vpxord xmm13, xmm13, xmm1 + vpxord xmm14, xmm14, xmm2 + vpxord xmm15, xmm15, xmm3 + vprold xmm12, xmm12, 16 + vprold xmm13, xmm13, 16 + vprold xmm14, xmm14, 16 + vprold xmm15, xmm15, 16 + vpaddd xmm8, xmm8, xmm12 + vpaddd xmm9, xmm9, xmm13 + vpaddd xmm10, xmm10, xmm14 + vpaddd xmm11, xmm11, xmm15 + vpxord xmm4, xmm4, xmm8 + vpxord xmm5, xmm5, xmm9 + vpxord xmm6, xmm6, xmm10 + vpxord xmm7, xmm7, xmm11 + vprold xmm4, xmm4, 12 + vprold xmm5, xmm5, 12 + vprold xmm6, xmm6, 12 + vprold xmm7, xmm7, 12 + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm1, xmm1, xmm5 + vpaddd xmm2, xmm2, xmm6 + vpaddd xmm3, xmm3, xmm7 + vpxord xmm12, xmm12, xmm0 + vpxord xmm13, xmm13, xmm1 + vpxord xmm14, xmm14, xmm2 + vpxord xmm15, xmm15, xmm3 + vprold xmm12, xmm12, 8 + vprold xmm13, xmm13, 8 + vprold xmm14, xmm14, 8 + vprold xmm15, xmm15, 8 + vpaddd xmm8, xmm8, xmm12 + vpaddd xmm9, xmm9, xmm13 + vpaddd xmm10, xmm10, xmm14 + vpaddd xmm11, xmm11, xmm15 + vpxord xmm4, xmm4, xmm8 + vpxord xmm5, xmm5, xmm9 + vpxord xmm6, xmm6, xmm10 + vpxord xmm7, xmm7, xmm11 + vprold xmm4, xmm4, 7 + vprold xmm5, xmm5, 7 + vprold xmm6, xmm6, 7 + vprold xmm7, xmm7, 7 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm1, xmm1, xmm6 + vpaddd xmm2, xmm2, xmm7 + vpaddd xmm3, xmm3, xmm4 + vpxord xmm15, xmm15, xmm0 + vpxord xmm12, xmm12, xmm1 + vpxord xmm13, xmm13, xmm2 + vpxord xmm14, xmm14, xmm3 + vprold xmm15, xmm15, 16 + vprold xmm12, xmm12, 16 + vprold xmm13, xmm13, 16 + vprold xmm14, xmm14, 16 + vpaddd xmm10, xmm10, xmm15 + vpaddd xmm11, xmm11, xmm12 + vpaddd xmm8, xmm8, xmm13 + vpaddd xmm9, xmm9, xmm14 + vpxord xmm5, xmm5, xmm10 + vpxord xmm6, xmm6, xmm11 + vpxord xmm7, xmm7, xmm8 + vpxord xmm4, xmm4, xmm9 + vprold xmm5, xmm5, 12 + vprold xmm6, xmm6, 12 + vprold xmm7, xmm7, 12 + vprold xmm4, xmm4, 12 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm1, xmm1, xmm6 + vpaddd xmm2, xmm2, xmm7 + vpaddd xmm3, xmm3, xmm4 + vpxord xmm15, xmm15, xmm0 + vpxord xmm12, xmm12, xmm1 + vpxord xmm13, xmm13, xmm2 + vpxord xmm14, xmm14, xmm3 + vprold xmm15, xmm15, 8 + vprold xmm12, xmm12, 8 + vprold xmm13, xmm13, 8 + vprold xmm14, xmm14, 8 + vpaddd xmm10, xmm10, xmm15 + vpaddd xmm11, xmm11, xmm12 + vpaddd xmm8, xmm8, xmm13 + vpaddd xmm9, xmm9, xmm14 + vpxord xmm5, xmm5, xmm10 + vpxord xmm6, xmm6, xmm11 + vpxord xmm7, xmm7, xmm8 + vpxord xmm4, xmm4, xmm9 + vprold xmm5, xmm5, 7 + vprold xmm6, xmm6, 7 + vprold xmm7, xmm7, 7 + vprold xmm4, xmm4, 7 + dec r10b + jnz L_chacha20_avx512vl_loop128 + vpaddd xmm0, xmm0, OWORD PTR [r11] + vpaddd xmm1, xmm1, OWORD PTR [r11+16] + vpaddd xmm2, xmm2, OWORD PTR [r11+32] + vpaddd xmm3, xmm3, OWORD PTR [r11+48] + vpaddd xmm4, xmm4, OWORD PTR [r11+64] + vpaddd xmm5, xmm5, OWORD PTR [r11+80] + vpaddd xmm6, xmm6, OWORD PTR [r11+96] + vpaddd xmm7, xmm7, OWORD PTR [r11+112] + vpaddd xmm8, xmm8, OWORD PTR [r11+128] + vpaddd xmm9, xmm9, OWORD PTR [r11+144] + vpaddd xmm10, xmm10, OWORD PTR [r11+160] + vpaddd xmm11, xmm11, OWORD PTR [r11+176] + vpaddd xmm12, xmm12, OWORD PTR [r11+192] + vpaddd xmm13, xmm13, OWORD PTR [r11+208] + vpaddd xmm14, xmm14, OWORD PTR [r11+224] + vpaddd xmm15, xmm15, OWORD PTR [r11+240] + vmovdqa OWORD PTR [r12], xmm8 + vmovdqa OWORD PTR [r12+16], xmm9 + vmovdqa OWORD PTR [r12+32], xmm10 + vmovdqa OWORD PTR [r12+48], xmm11 + vmovdqa OWORD PTR [r12+64], xmm12 + vmovdqa OWORD PTR [r12+80], xmm13 + vmovdqa OWORD PTR [r12+96], xmm14 + vmovdqa OWORD PTR [r12+112], xmm15 + vpunpckldq xmm8, xmm0, xmm1 + vpunpckldq xmm9, xmm2, xmm3 + vpunpckhdq xmm12, xmm0, xmm1 + vpunpckhdq xmm13, xmm2, xmm3 + vpunpckldq xmm10, xmm4, xmm5 + vpunpckldq xmm11, xmm6, xmm7 + vpunpckhdq xmm14, xmm4, xmm5 + vpunpckhdq xmm15, xmm6, xmm7 + vpunpcklqdq xmm0, xmm8, xmm9 + vpunpcklqdq xmm1, xmm10, xmm11 + vpunpckhqdq xmm2, xmm8, xmm9 + vpunpckhqdq xmm3, xmm10, xmm11 + vpunpcklqdq xmm4, xmm12, xmm13 + vpunpcklqdq xmm5, xmm14, xmm15 + vpunpckhqdq xmm6, xmm12, xmm13 + vpunpckhqdq xmm7, xmm14, xmm15 + vmovdqu xmm8, OWORD PTR [rdx] + vmovdqu xmm9, OWORD PTR [rdx+16] + vmovdqu xmm10, OWORD PTR [rdx+64] + vmovdqu xmm11, OWORD PTR [rdx+80] + vmovdqu xmm12, OWORD PTR [rdx+128] + vmovdqu xmm13, OWORD PTR [rdx+144] + vmovdqu xmm14, OWORD PTR [rdx+192] + vmovdqu xmm15, OWORD PTR [rdx+208] + vpxor xmm0, xmm0, xmm8 + vpxor xmm1, xmm1, xmm9 + vpxor xmm2, xmm2, xmm10 + vpxor xmm3, xmm3, xmm11 + vpxor xmm4, xmm4, xmm12 + vpxor xmm5, xmm5, xmm13 + vpxor xmm6, xmm6, xmm14 + vpxor xmm7, xmm7, xmm15 + vmovdqu OWORD PTR [r8], xmm0 + vmovdqu OWORD PTR [r8+16], xmm1 + vmovdqu OWORD PTR [r8+64], xmm2 + vmovdqu OWORD PTR [r8+80], xmm3 + vmovdqu OWORD PTR [r8+128], xmm4 + vmovdqu OWORD PTR [r8+144], xmm5 + vmovdqu OWORD PTR [r8+192], xmm6 + vmovdqu OWORD PTR [r8+208], xmm7 + vmovdqa xmm0, OWORD PTR [r12] + vmovdqa xmm1, OWORD PTR [r12+16] + vmovdqa xmm2, OWORD PTR [r12+32] + vmovdqa xmm3, OWORD PTR [r12+48] + vmovdqa xmm4, OWORD PTR [r12+64] + vmovdqa xmm5, OWORD PTR [r12+80] + vmovdqa xmm6, OWORD PTR [r12+96] + vmovdqa xmm7, OWORD PTR [r12+112] + vpunpckldq xmm8, xmm0, xmm1 + vpunpckldq xmm9, xmm2, xmm3 + vpunpckhdq xmm12, xmm0, xmm1 + vpunpckhdq xmm13, xmm2, xmm3 + vpunpckldq xmm10, xmm4, xmm5 + vpunpckldq xmm11, xmm6, xmm7 + vpunpckhdq xmm14, xmm4, xmm5 + vpunpckhdq xmm15, xmm6, xmm7 + vpunpcklqdq xmm0, xmm8, xmm9 + vpunpcklqdq xmm1, xmm10, xmm11 + vpunpckhqdq xmm2, xmm8, xmm9 + vpunpckhqdq xmm3, xmm10, xmm11 + vpunpcklqdq xmm4, xmm12, xmm13 + vpunpcklqdq xmm5, xmm14, xmm15 + vpunpckhqdq xmm6, xmm12, xmm13 + vpunpckhqdq xmm7, xmm14, xmm15 + vmovdqu xmm8, OWORD PTR [rdx+32] + vmovdqu xmm9, OWORD PTR [rdx+48] + vmovdqu xmm10, OWORD PTR [rdx+96] + vmovdqu xmm11, OWORD PTR [rdx+112] + vmovdqu xmm12, OWORD PTR [rdx+160] + vmovdqu xmm13, OWORD PTR [rdx+176] + vmovdqu xmm14, OWORD PTR [rdx+224] + vmovdqu xmm15, OWORD PTR [rdx+240] + vpxor xmm0, xmm0, xmm8 + vpxor xmm1, xmm1, xmm9 + vpxor xmm2, xmm2, xmm10 + vpxor xmm3, xmm3, xmm11 + vpxor xmm4, xmm4, xmm12 + vpxor xmm5, xmm5, xmm13 + vpxor xmm6, xmm6, xmm14 + vpxor xmm7, xmm7, xmm15 + vmovdqu OWORD PTR [r8+32], xmm0 + vmovdqu OWORD PTR [r8+48], xmm1 + vmovdqu OWORD PTR [r8+96], xmm2 + vmovdqu OWORD PTR [r8+112], xmm3 + vmovdqu OWORD PTR [r8+160], xmm4 + vmovdqu OWORD PTR [r8+176], xmm5 + vmovdqu OWORD PTR [r8+224], xmm6 + vmovdqu OWORD PTR [r8+240], xmm7 + vmovdqa xmm12, OWORD PTR [r11+192] + add rdx, 256 + add r8, 256 + vpaddd xmm12, xmm12, OWORD PTR [r15] + sub r9d, 256 + vmovdqa OWORD PTR [r11+192], xmm12 + cmp r9d, 256 + jl L_chacha20_avx512vl_done128 + vmovdqa xmm0, OWORD PTR [r11] + vmovdqa xmm1, OWORD PTR [r11+16] + vmovdqa xmm2, OWORD PTR [r11+32] + vmovdqa xmm3, OWORD PTR [r11+48] + vmovdqa xmm4, OWORD PTR [r11+64] + vmovdqa xmm5, OWORD PTR [r11+80] + vmovdqa xmm6, OWORD PTR [r11+96] + vmovdqa xmm7, OWORD PTR [r11+112] + vmovdqa xmm8, OWORD PTR [r11+128] + vmovdqa xmm9, OWORD PTR [r11+144] + vmovdqa xmm10, OWORD PTR [r11+160] + vmovdqa xmm11, OWORD PTR [r11+176] + vmovdqa xmm12, OWORD PTR [r11+192] + vmovdqa xmm13, OWORD PTR [r11+208] + vmovdqa xmm14, OWORD PTR [r11+224] + vmovdqa xmm15, OWORD PTR [r11+240] + jmp L_chacha20_avx512vl_start128 +L_chacha20_avx512vl_done128: + shl eax, 2 + add DWORD PTR [rcx+48], eax +L_chacha20_avx512vl_end128: + cmp r9d, 0 + je L_chacha20_avx512vl_last_done + vpbroadcastd xmm0, DWORD PTR [rcx] + vpbroadcastd xmm1, DWORD PTR [rcx+4] + vpbroadcastd xmm2, DWORD PTR [rcx+8] + vpbroadcastd xmm3, DWORD PTR [rcx+12] + vpbroadcastd xmm4, DWORD PTR [rcx+16] + vpbroadcastd xmm5, DWORD PTR [rcx+20] + vpbroadcastd xmm6, DWORD PTR [rcx+24] + vpbroadcastd xmm7, DWORD PTR [rcx+28] + vpbroadcastd xmm8, DWORD PTR [rcx+32] + vpbroadcastd xmm9, DWORD PTR [rcx+36] + vpbroadcastd xmm10, DWORD PTR [rcx+40] + vpbroadcastd xmm11, DWORD PTR [rcx+44] + vpbroadcastd xmm12, DWORD PTR [rcx+48] + vpbroadcastd xmm13, DWORD PTR [rcx+52] + vpbroadcastd xmm14, DWORD PTR [rcx+56] + vpbroadcastd xmm15, DWORD PTR [rcx+60] + vpaddd xmm12, xmm12, OWORD PTR [r14] + vmovdqa OWORD PTR [r11], xmm0 + vmovdqa OWORD PTR [r11+16], xmm1 + vmovdqa OWORD PTR [r11+32], xmm2 + vmovdqa OWORD PTR [r11+48], xmm3 + vmovdqa OWORD PTR [r11+64], xmm4 + vmovdqa OWORD PTR [r11+80], xmm5 + vmovdqa OWORD PTR [r11+96], xmm6 + vmovdqa OWORD PTR [r11+112], xmm7 + vmovdqa OWORD PTR [r11+128], xmm8 + vmovdqa OWORD PTR [r11+144], xmm9 + vmovdqa OWORD PTR [r11+160], xmm10 + vmovdqa OWORD PTR [r11+176], xmm11 + vmovdqa OWORD PTR [r11+192], xmm12 + vmovdqa OWORD PTR [r11+208], xmm13 + vmovdqa OWORD PTR [r11+224], xmm14 + vmovdqa OWORD PTR [r11+240], xmm15 + mov r10b, 10 +L_chacha20_avx512vl_last_round: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm1, xmm1, xmm5 + vpaddd xmm2, xmm2, xmm6 + vpaddd xmm3, xmm3, xmm7 + vpxord xmm12, xmm12, xmm0 + vpxord xmm13, xmm13, xmm1 + vpxord xmm14, xmm14, xmm2 + vpxord xmm15, xmm15, xmm3 + vprold xmm12, xmm12, 16 + vprold xmm13, xmm13, 16 + vprold xmm14, xmm14, 16 + vprold xmm15, xmm15, 16 + vpaddd xmm8, xmm8, xmm12 + vpaddd xmm9, xmm9, xmm13 + vpaddd xmm10, xmm10, xmm14 + vpaddd xmm11, xmm11, xmm15 + vpxord xmm4, xmm4, xmm8 + vpxord xmm5, xmm5, xmm9 + vpxord xmm6, xmm6, xmm10 + vpxord xmm7, xmm7, xmm11 + vprold xmm4, xmm4, 12 + vprold xmm5, xmm5, 12 + vprold xmm6, xmm6, 12 + vprold xmm7, xmm7, 12 + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm1, xmm1, xmm5 + vpaddd xmm2, xmm2, xmm6 + vpaddd xmm3, xmm3, xmm7 + vpxord xmm12, xmm12, xmm0 + vpxord xmm13, xmm13, xmm1 + vpxord xmm14, xmm14, xmm2 + vpxord xmm15, xmm15, xmm3 + vprold xmm12, xmm12, 8 + vprold xmm13, xmm13, 8 + vprold xmm14, xmm14, 8 + vprold xmm15, xmm15, 8 + vpaddd xmm8, xmm8, xmm12 + vpaddd xmm9, xmm9, xmm13 + vpaddd xmm10, xmm10, xmm14 + vpaddd xmm11, xmm11, xmm15 + vpxord xmm4, xmm4, xmm8 + vpxord xmm5, xmm5, xmm9 + vpxord xmm6, xmm6, xmm10 + vpxord xmm7, xmm7, xmm11 + vprold xmm4, xmm4, 7 + vprold xmm5, xmm5, 7 + vprold xmm6, xmm6, 7 + vprold xmm7, xmm7, 7 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm1, xmm1, xmm6 + vpaddd xmm2, xmm2, xmm7 + vpaddd xmm3, xmm3, xmm4 + vpxord xmm15, xmm15, xmm0 + vpxord xmm12, xmm12, xmm1 + vpxord xmm13, xmm13, xmm2 + vpxord xmm14, xmm14, xmm3 + vprold xmm15, xmm15, 16 + vprold xmm12, xmm12, 16 + vprold xmm13, xmm13, 16 + vprold xmm14, xmm14, 16 + vpaddd xmm10, xmm10, xmm15 + vpaddd xmm11, xmm11, xmm12 + vpaddd xmm8, xmm8, xmm13 + vpaddd xmm9, xmm9, xmm14 + vpxord xmm5, xmm5, xmm10 + vpxord xmm6, xmm6, xmm11 + vpxord xmm7, xmm7, xmm8 + vpxord xmm4, xmm4, xmm9 + vprold xmm5, xmm5, 12 + vprold xmm6, xmm6, 12 + vprold xmm7, xmm7, 12 + vprold xmm4, xmm4, 12 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm1, xmm1, xmm6 + vpaddd xmm2, xmm2, xmm7 + vpaddd xmm3, xmm3, xmm4 + vpxord xmm15, xmm15, xmm0 + vpxord xmm12, xmm12, xmm1 + vpxord xmm13, xmm13, xmm2 + vpxord xmm14, xmm14, xmm3 + vprold xmm15, xmm15, 8 + vprold xmm12, xmm12, 8 + vprold xmm13, xmm13, 8 + vprold xmm14, xmm14, 8 + vpaddd xmm10, xmm10, xmm15 + vpaddd xmm11, xmm11, xmm12 + vpaddd xmm8, xmm8, xmm13 + vpaddd xmm9, xmm9, xmm14 + vpxord xmm5, xmm5, xmm10 + vpxord xmm6, xmm6, xmm11 + vpxord xmm7, xmm7, xmm8 + vpxord xmm4, xmm4, xmm9 + vprold xmm5, xmm5, 7 + vprold xmm6, xmm6, 7 + vprold xmm7, xmm7, 7 + vprold xmm4, xmm4, 7 + dec r10b + jnz L_chacha20_avx512vl_last_round + vpaddd xmm0, xmm0, OWORD PTR [r11] + vpaddd xmm1, xmm1, OWORD PTR [r11+16] + vpaddd xmm2, xmm2, OWORD PTR [r11+32] + vpaddd xmm3, xmm3, OWORD PTR [r11+48] + vpaddd xmm4, xmm4, OWORD PTR [r11+64] + vpaddd xmm5, xmm5, OWORD PTR [r11+80] + vpaddd xmm6, xmm6, OWORD PTR [r11+96] + vpaddd xmm7, xmm7, OWORD PTR [r11+112] + vpaddd xmm8, xmm8, OWORD PTR [r11+128] + vpaddd xmm9, xmm9, OWORD PTR [r11+144] + vpaddd xmm10, xmm10, OWORD PTR [r11+160] + vpaddd xmm11, xmm11, OWORD PTR [r11+176] + vpaddd xmm12, xmm12, OWORD PTR [r11+192] + vpaddd xmm13, xmm13, OWORD PTR [r11+208] + vpaddd xmm14, xmm14, OWORD PTR [r11+224] + vpaddd xmm15, xmm15, OWORD PTR [r11+240] + vmovdqa OWORD PTR [r12], xmm8 + vmovdqa OWORD PTR [r12+16], xmm9 + vmovdqa OWORD PTR [r12+32], xmm10 + vmovdqa OWORD PTR [r12+48], xmm11 + vmovdqa OWORD PTR [r12+64], xmm12 + vmovdqa OWORD PTR [r12+80], xmm13 + vmovdqa OWORD PTR [r12+96], xmm14 + vmovdqa OWORD PTR [r12+112], xmm15 + vpunpckldq xmm8, xmm0, xmm1 + vpunpckldq xmm9, xmm2, xmm3 + vpunpckhdq xmm12, xmm0, xmm1 + vpunpckhdq xmm13, xmm2, xmm3 + vpunpckldq xmm10, xmm4, xmm5 + vpunpckldq xmm11, xmm6, xmm7 + vpunpckhdq xmm14, xmm4, xmm5 + vpunpckhdq xmm15, xmm6, xmm7 + vpunpcklqdq xmm0, xmm8, xmm9 + vpunpcklqdq xmm1, xmm10, xmm11 + vpunpckhqdq xmm2, xmm8, xmm9 + vpunpckhqdq xmm3, xmm10, xmm11 + vpunpcklqdq xmm4, xmm12, xmm13 + vpunpcklqdq xmm5, xmm14, xmm15 + vpunpckhqdq xmm6, xmm12, xmm13 + vpunpckhqdq xmm7, xmm14, xmm15 + vmovdqu OWORD PTR [r11], xmm0 + vmovdqu OWORD PTR [r11+16], xmm1 + vmovdqu OWORD PTR [r11+64], xmm2 + vmovdqu OWORD PTR [r11+80], xmm3 + vmovdqu OWORD PTR [r11+128], xmm4 + vmovdqu OWORD PTR [r11+144], xmm5 + vmovdqu OWORD PTR [r11+192], xmm6 + vmovdqu OWORD PTR [r11+208], xmm7 + vmovdqa xmm0, OWORD PTR [r12] + vmovdqa xmm1, OWORD PTR [r12+16] + vmovdqa xmm2, OWORD PTR [r12+32] + vmovdqa xmm3, OWORD PTR [r12+48] + vmovdqa xmm4, OWORD PTR [r12+64] + vmovdqa xmm5, OWORD PTR [r12+80] + vmovdqa xmm6, OWORD PTR [r12+96] + vmovdqa xmm7, OWORD PTR [r12+112] + vpunpckldq xmm8, xmm0, xmm1 + vpunpckldq xmm9, xmm2, xmm3 + vpunpckhdq xmm12, xmm0, xmm1 + vpunpckhdq xmm13, xmm2, xmm3 + vpunpckldq xmm10, xmm4, xmm5 + vpunpckldq xmm11, xmm6, xmm7 + vpunpckhdq xmm14, xmm4, xmm5 + vpunpckhdq xmm15, xmm6, xmm7 + vpunpcklqdq xmm0, xmm8, xmm9 + vpunpcklqdq xmm1, xmm10, xmm11 + vpunpckhqdq xmm2, xmm8, xmm9 + vpunpckhqdq xmm3, xmm10, xmm11 + vpunpcklqdq xmm4, xmm12, xmm13 + vpunpcklqdq xmm5, xmm14, xmm15 + vpunpckhqdq xmm6, xmm12, xmm13 + vpunpckhqdq xmm7, xmm14, xmm15 + vmovdqu OWORD PTR [r11+32], xmm0 + vmovdqu OWORD PTR [r11+48], xmm1 + vmovdqu OWORD PTR [r11+96], xmm2 + vmovdqu OWORD PTR [r11+112], xmm3 + vmovdqu OWORD PTR [r11+160], xmm4 + vmovdqu OWORD PTR [r11+176], xmm5 + vmovdqu OWORD PTR [r11+224], xmm6 + vmovdqu OWORD PTR [r11+240], xmm7 + cmp r9d, 64 + jl L_chacha20_avx512vl_last_fdone +L_chacha20_avx512vl_last_fstart: + vmovdqu xmm0, OWORD PTR [rdx] + vpxor xmm0, xmm0, [r11] + vmovdqu OWORD PTR [r8], xmm0 + vmovdqu xmm0, OWORD PTR [rdx+16] + vpxor xmm0, xmm0, [r11+16] + vmovdqu OWORD PTR [r8+16], xmm0 + vmovdqu xmm0, OWORD PTR [rdx+32] + vpxor xmm0, xmm0, [r11+32] + vmovdqu OWORD PTR [r8+32], xmm0 + vmovdqu xmm0, OWORD PTR [rdx+48] + vpxor xmm0, xmm0, [r11+48] + vmovdqu OWORD PTR [r8+48], xmm0 + add DWORD PTR [rcx+48], 1 + sub r9d, 64 + add rdx, 64 + add r8, 64 + add r11, 64 + cmp r9d, 64 + jge L_chacha20_avx512vl_last_fstart +L_chacha20_avx512vl_last_fdone: + cmp r9d, 0 + je L_chacha20_avx512vl_last_done + lea r12, QWORD PTR [rcx+80] + vmovdqu xmm0, OWORD PTR [r11] + vmovdqu OWORD PTR [r12], xmm0 + vmovdqu xmm0, OWORD PTR [r11+16] + vmovdqu OWORD PTR [r12+16], xmm0 + vmovdqu xmm0, OWORD PTR [r11+32] + vmovdqu OWORD PTR [r12+32], xmm0 + vmovdqu xmm0, OWORD PTR [r11+48] + vmovdqu OWORD PTR [r12+48], xmm0 + add DWORD PTR [rcx+48], 1 + mov r10d, r9d + xor r13, r13 + and r10d, 7 + jz L_chacha20_avx512vl_last_start64 +L_chacha20_avx512vl_last_start8: + movzx eax, BYTE PTR [r12+r13] + xor al, BYTE PTR [rdx+r13] + mov BYTE PTR [r8+r13], al + inc r13d + cmp r13d, r10d + jne L_chacha20_avx512vl_last_start8 + je L_chacha20_avx512vl_last_end64 +L_chacha20_avx512vl_last_start64: + mov rax, QWORD PTR [r12+r13] + xor rax, QWORD PTR [rdx+r13] + mov QWORD PTR [r8+r13], rax + add r13d, 8 +L_chacha20_avx512vl_last_end64: + cmp r13d, r9d + jne L_chacha20_avx512vl_last_start64 + mov r10d, 64 + sub r10d, r13d + mov DWORD PTR [rcx+76], r10d +L_chacha20_avx512vl_last_done: + vmovdqu xmm6, OWORD PTR [rsp+400] + vmovdqu xmm7, OWORD PTR [rsp+416] + vmovdqu xmm8, OWORD PTR [rsp+432] + vmovdqu xmm9, OWORD PTR [rsp+448] + vmovdqu xmm10, OWORD PTR [rsp+464] + vmovdqu xmm11, OWORD PTR [rsp+480] + vmovdqu xmm12, OWORD PTR [rsp+496] + vmovdqu xmm13, OWORD PTR [rsp+512] + vmovdqu xmm14, OWORD PTR [rsp+528] + vmovdqu xmm15, OWORD PTR [rsp+544] + add rsp, 560 + pop r15 + pop r14 + pop r13 + pop r12 + ret +chacha_encrypt_avx512vl ENDP +_TEXT ENDS +ENDIF +IFDEF HAVE_INTEL_AVX512 +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx512_add QWORD 0000000100000000h, 0000000300000002h + QWORD 0000000500000004h, 0000000700000006h + QWORD 0000000900000008h, 0000000b0000000ah + QWORD 0000000d0000000ch, 0000000f0000000eh +ptr_L_chacha20_avx512_add QWORD L_chacha20_avx512_add +_DATA ENDS +_TEXT SEGMENT READONLY PARA +chacha_encrypt_avx512 PROC + sub rsp, 168 + vmovdqu OWORD PTR [rsp+8], xmm6 + vmovdqu OWORD PTR [rsp+24], xmm7 + vmovdqu OWORD PTR [rsp+40], xmm8 + vmovdqu OWORD PTR [rsp+56], xmm9 + vmovdqu OWORD PTR [rsp+72], xmm10 + vmovdqu OWORD PTR [rsp+88], xmm11 + vmovdqu OWORD PTR [rsp+104], xmm12 + vmovdqu OWORD PTR [rsp+120], xmm13 + vmovdqu OWORD PTR [rsp+136], xmm14 + vmovdqu OWORD PTR [rsp+152], xmm15 + mov r10, QWORD PTR [ptr_L_chacha20_avx512_add] + cmp r9d, 1024 + jl L_chacha20_avx512_end512 +L_chacha20_avx512_start512: + vpbroadcastd zmm0, DWORD PTR [rcx] + vpbroadcastd zmm1, DWORD PTR [rcx+4] + vpbroadcastd zmm2, DWORD PTR [rcx+8] + vpbroadcastd zmm3, DWORD PTR [rcx+12] + vpbroadcastd zmm4, DWORD PTR [rcx+16] + vpbroadcastd zmm5, DWORD PTR [rcx+20] + vpbroadcastd zmm6, DWORD PTR [rcx+24] + vpbroadcastd zmm7, DWORD PTR [rcx+28] + vpbroadcastd zmm8, DWORD PTR [rcx+32] + vpbroadcastd zmm9, DWORD PTR [rcx+36] + vpbroadcastd zmm10, DWORD PTR [rcx+40] + vpbroadcastd zmm11, DWORD PTR [rcx+44] + vpbroadcastd zmm13, DWORD PTR [rcx+52] + vpbroadcastd zmm14, DWORD PTR [rcx+56] + vpbroadcastd zmm15, DWORD PTR [rcx+60] + vpbroadcastd zmm12, DWORD PTR [rcx+48] + vpaddd zmm12, zmm12, [r10] + mov al, 10 +L_chacha20_avx512_loop512: + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + dec al + jnz L_chacha20_avx512_loop512 + vpaddd zmm0, zmm0, DWORD BCST [rcx] + vpaddd zmm1, zmm1, DWORD BCST [rcx+4] + vpaddd zmm2, zmm2, DWORD BCST [rcx+8] + vpaddd zmm3, zmm3, DWORD BCST [rcx+12] + vpaddd zmm4, zmm4, DWORD BCST [rcx+16] + vpaddd zmm5, zmm5, DWORD BCST [rcx+20] + vpaddd zmm6, zmm6, DWORD BCST [rcx+24] + vpaddd zmm7, zmm7, DWORD BCST [rcx+28] + vpaddd zmm8, zmm8, DWORD BCST [rcx+32] + vpaddd zmm9, zmm9, DWORD BCST [rcx+36] + vpaddd zmm10, zmm10, DWORD BCST [rcx+40] + vpaddd zmm11, zmm11, DWORD BCST [rcx+44] + vpaddd zmm13, zmm13, DWORD BCST [rcx+52] + vpaddd zmm14, zmm14, DWORD BCST [rcx+56] + vpaddd zmm15, zmm15, DWORD BCST [rcx+60] + vpbroadcastd zmm16, DWORD PTR [rcx+48] + vpaddd zmm16, zmm16, [r10] + vpaddd zmm12, zmm12, zmm16 + vpunpckldq zmm16, zmm0, zmm1 + vpunpckhdq zmm17, zmm0, zmm1 + vpunpckldq zmm18, zmm2, zmm3 + vpunpckhdq zmm19, zmm2, zmm3 + vpunpckldq zmm20, zmm4, zmm5 + vpunpckhdq zmm21, zmm4, zmm5 + vpunpckldq zmm22, zmm6, zmm7 + vpunpckhdq zmm23, zmm6, zmm7 + vpunpckldq zmm24, zmm8, zmm9 + vpunpckhdq zmm25, zmm8, zmm9 + vpunpckldq zmm26, zmm10, zmm11 + vpunpckhdq zmm27, zmm10, zmm11 + vpunpckldq zmm28, zmm12, zmm13 + vpunpckhdq zmm29, zmm12, zmm13 + vpunpckldq zmm30, zmm14, zmm15 + vpunpckhdq zmm31, zmm14, zmm15 + vpunpcklqdq zmm0, zmm16, zmm18 + vpunpckhqdq zmm1, zmm16, zmm18 + vpunpcklqdq zmm2, zmm17, zmm19 + vpunpckhqdq zmm3, zmm17, zmm19 + vpunpcklqdq zmm4, zmm20, zmm22 + vpunpckhqdq zmm5, zmm20, zmm22 + vpunpcklqdq zmm6, zmm21, zmm23 + vpunpckhqdq zmm7, zmm21, zmm23 + vpunpcklqdq zmm8, zmm24, zmm26 + vpunpckhqdq zmm9, zmm24, zmm26 + vpunpcklqdq zmm10, zmm25, zmm27 + vpunpckhqdq zmm11, zmm25, zmm27 + vpunpcklqdq zmm12, zmm28, zmm30 + vpunpckhqdq zmm13, zmm28, zmm30 + vpunpcklqdq zmm14, zmm29, zmm31 + vpunpckhqdq zmm15, zmm29, zmm31 + vshufi32x4 zmm16, zmm0, zmm4, 68 + vshufi32x4 zmm17, zmm0, zmm4, 238 + vshufi32x4 zmm18, zmm8, zmm12, 68 + vshufi32x4 zmm19, zmm8, zmm12, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx] + vmovdqu64 [r8], zmm20 + vpxord zmm21, zmm21, [rdx+256] + vmovdqu64 [r8+256], zmm21 + vpxord zmm22, zmm22, [rdx+512] + vmovdqu64 [r8+512], zmm22 + vpxord zmm23, zmm23, [rdx+768] + vmovdqu64 [r8+768], zmm23 + vshufi32x4 zmm16, zmm1, zmm5, 68 + vshufi32x4 zmm17, zmm1, zmm5, 238 + vshufi32x4 zmm18, zmm9, zmm13, 68 + vshufi32x4 zmm19, zmm9, zmm13, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+64] + vmovdqu64 [r8+64], zmm20 + vpxord zmm21, zmm21, [rdx+320] + vmovdqu64 [r8+320], zmm21 + vpxord zmm22, zmm22, [rdx+576] + vmovdqu64 [r8+576], zmm22 + vpxord zmm23, zmm23, [rdx+832] + vmovdqu64 [r8+832], zmm23 + vshufi32x4 zmm16, zmm2, zmm6, 68 + vshufi32x4 zmm17, zmm2, zmm6, 238 + vshufi32x4 zmm18, zmm10, zmm14, 68 + vshufi32x4 zmm19, zmm10, zmm14, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+128] + vmovdqu64 [r8+128], zmm20 + vpxord zmm21, zmm21, [rdx+384] + vmovdqu64 [r8+384], zmm21 + vpxord zmm22, zmm22, [rdx+640] + vmovdqu64 [r8+640], zmm22 + vpxord zmm23, zmm23, [rdx+896] + vmovdqu64 [r8+896], zmm23 + vshufi32x4 zmm16, zmm3, zmm7, 68 + vshufi32x4 zmm17, zmm3, zmm7, 238 + vshufi32x4 zmm18, zmm11, zmm15, 68 + vshufi32x4 zmm19, zmm11, zmm15, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+192] + vmovdqu64 [r8+192], zmm20 + vpxord zmm21, zmm21, [rdx+448] + vmovdqu64 [r8+448], zmm21 + vpxord zmm22, zmm22, [rdx+704] + vmovdqu64 [r8+704], zmm22 + vpxord zmm23, zmm23, [rdx+960] + vmovdqu64 [r8+960], zmm23 + add rdx, 1024 + add r8, 1024 + add DWORD PTR [rcx+48], 16 + sub r9d, 1024 + cmp r9d, 1024 + jge L_chacha20_avx512_start512 +L_chacha20_avx512_end512: + call chacha_encrypt_avx2 + vzeroupper + vmovdqu xmm6, OWORD PTR [rsp+8] + vmovdqu xmm7, OWORD PTR [rsp+24] + vmovdqu xmm8, OWORD PTR [rsp+40] + vmovdqu xmm9, OWORD PTR [rsp+56] + vmovdqu xmm10, OWORD PTR [rsp+72] + vmovdqu xmm11, OWORD PTR [rsp+88] + vmovdqu xmm12, OWORD PTR [rsp+104] + vmovdqu xmm13, OWORD PTR [rsp+120] + vmovdqu xmm14, OWORD PTR [rsp+136] + vmovdqu xmm15, OWORD PTR [rsp+152] + add rsp, 168 + ret +chacha_encrypt_avx512 ENDP +_TEXT ENDS +ENDIF +IFDEF HAVE_INTEL_AVX512 +_DATA SEGMENT +ALIGN 16 +L_chacha20_poly1305_add QWORD 0000000100000000h, 0000000300000002h +ptr_L_chacha20_poly1305_add QWORD L_chacha20_poly1305_add +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_poly1305_four QWORD 0000000400000004h, 0000000400000004h +ptr_L_chacha20_poly1305_four QWORD L_chacha20_poly1305_four +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_poly1305_mask QWORD 0000000003ffffffh, 0000000003ffffffh + QWORD 0000000003ffffffh, 0000000003ffffffh +ptr_L_chacha20_poly1305_mask QWORD L_chacha20_poly1305_mask +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_poly1305_hibit QWORD 0000000001000000h, 0000000001000000h + QWORD 0000000001000000h, 0000000001000000h +ptr_L_chacha20_poly1305_hibit QWORD L_chacha20_poly1305_hibit +_DATA ENDS +_TEXT SEGMENT READONLY PARA +chacha20_poly1305_avx512 PROC + push rdi + push rsi + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + mov rcx, r9 + mov rax, QWORD PTR [rsp+104] + sub rsp, 880 + vmovdqu OWORD PTR [rsp+720], xmm6 + vmovdqu OWORD PTR [rsp+736], xmm7 + vmovdqu OWORD PTR [rsp+752], xmm8 + vmovdqu OWORD PTR [rsp+768], xmm9 + vmovdqu OWORD PTR [rsp+784], xmm10 + vmovdqu OWORD PTR [rsp+800], xmm11 + vmovdqu OWORD PTR [rsp+816], xmm12 + vmovdqu OWORD PTR [rsp+832], xmm13 + vmovdqu OWORD PTR [rsp+848], xmm14 + vmovdqu OWORD PTR [rsp+864], xmm15 + mov r10, QWORD PTR [ptr_L_chacha20_poly1305_add] + mov r11, QWORD PTR [ptr_L_chacha20_poly1305_four] + mov r12, QWORD PTR [ptr_L_chacha20_poly1305_mask] + mov r13, QWORD PTR [ptr_L_chacha20_poly1305_hibit] + mov r14, rsp + add r14, 15 + and r14, -16 + lea r15, QWORD PTR [rsp+272] + add r15, 15 + and r15, -16 + lea rbx, QWORD PTR [rsp+416] + lea rbp, QWORD PTR [rsp+576] + vpxor xmm15, xmm15, xmm15 + lea r9, QWORD PTR [rsi+64] + vmovdqu ymm0, YMMWORD PTR [r9] + vmovdqu ymm1, YMMWORD PTR [r9+32] + vmovdqu ymm2, YMMWORD PTR [r9+64] + vmovdqu ymm3, YMMWORD PTR [r9+96] + vmovdqu ymm4, YMMWORD PTR [r9+128] + vmovdqu ymm13, YMMWORD PTR [rsi+320] + vpermq ymm5, ymm13, 0 + vpsrlq ymm14, ymm13, 32 + vpermq ymm7, ymm13, 85 + vpermq ymm9, ymm13, 170 + vpermq ymm6, ymm14, 0 + vpermq ymm8, ymm14, 85 + vpslld ymm10, ymm6, 2 + vpslld ymm11, ymm7, 2 + vpslld ymm12, ymm8, 2 + vpslld ymm13, ymm9, 2 + vpaddq ymm10, ymm6, ymm10 + vpaddq ymm11, ymm7, ymm11 + vpaddq ymm12, ymm8, ymm12 + vpaddq ymm13, ymm9, ymm13 + vmovdqu YMMWORD PTR [rbp], ymm10 + vmovdqu YMMWORD PTR [rbp+32], ymm11 + vmovdqu YMMWORD PTR [rbp+64], ymm12 + vmovdqu YMMWORD PTR [rbp+96], ymm13 + vmovdqu YMMWORD PTR [rbx], ymm5 + vmovdqu YMMWORD PTR [rbx+32], ymm6 + vmovdqu YMMWORD PTR [rbx+64], ymm7 + vmovdqu YMMWORD PTR [rbx+96], ymm8 + vmovdqu YMMWORD PTR [rbx+128], ymm9 + vmovdqu ymm14, YMMWORD PTR [r12] + vpbroadcastd xmm16, DWORD PTR [rdi] + vpbroadcastd xmm17, DWORD PTR [rdi+4] + vpbroadcastd xmm18, DWORD PTR [rdi+8] + vpbroadcastd xmm19, DWORD PTR [rdi+12] + vpbroadcastd xmm20, DWORD PTR [rdi+16] + vpbroadcastd xmm21, DWORD PTR [rdi+20] + vpbroadcastd xmm22, DWORD PTR [rdi+24] + vpbroadcastd xmm23, DWORD PTR [rdi+28] + vpbroadcastd xmm24, DWORD PTR [rdi+32] + vpbroadcastd xmm25, DWORD PTR [rdi+36] + vpbroadcastd xmm26, DWORD PTR [rdi+40] + vpbroadcastd xmm27, DWORD PTR [rdi+44] + vpbroadcastd xmm28, DWORD PTR [rdi+48] + vpbroadcastd xmm29, DWORD PTR [rdi+52] + vpbroadcastd xmm30, DWORD PTR [rdi+56] + vpbroadcastd xmm31, DWORD PTR [rdi+60] + vpaddd xmm28, xmm28, OWORD PTR [r10] + vmovdqa64 [r14], xmm16 + vmovdqa64 [r14+16], xmm17 + vmovdqa64 [r14+32], xmm18 + vmovdqa64 [r14+48], xmm19 + vmovdqa64 [r14+64], xmm20 + vmovdqa64 [r14+80], xmm21 + vmovdqa64 [r14+96], xmm22 + vmovdqa64 [r14+112], xmm23 + vmovdqa64 [r14+128], xmm24 + vmovdqa64 [r14+144], xmm25 + vmovdqa64 [r14+160], xmm26 + vmovdqa64 [r14+176], xmm27 + vmovdqa64 [r14+192], xmm28 + vmovdqa64 [r14+208], xmm29 + vmovdqa64 [r14+224], xmm30 + vmovdqa64 [r14+240], xmm31 + mov r8b, 10 +L_chacha20_poly1305_rounds: + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + dec r8b + jnz L_chacha20_poly1305_rounds + vpaddd xmm16, xmm16, OWORD PTR [r14] + vpaddd xmm17, xmm17, OWORD PTR [r14+16] + vpaddd xmm18, xmm18, OWORD PTR [r14+32] + vpaddd xmm19, xmm19, OWORD PTR [r14+48] + vpaddd xmm20, xmm20, OWORD PTR [r14+64] + vpaddd xmm21, xmm21, OWORD PTR [r14+80] + vpaddd xmm22, xmm22, OWORD PTR [r14+96] + vpaddd xmm23, xmm23, OWORD PTR [r14+112] + vpaddd xmm24, xmm24, OWORD PTR [r14+128] + vpaddd xmm25, xmm25, OWORD PTR [r14+144] + vpaddd xmm26, xmm26, OWORD PTR [r14+160] + vpaddd xmm27, xmm27, OWORD PTR [r14+176] + vpaddd xmm28, xmm28, OWORD PTR [r14+192] + vpaddd xmm29, xmm29, OWORD PTR [r14+208] + vpaddd xmm30, xmm30, OWORD PTR [r14+224] + vpaddd xmm31, xmm31, OWORD PTR [r14+240] + vmovdqa64 [r15], xmm24 + vmovdqa64 [r15+16], xmm25 + vmovdqa64 [r15+32], xmm26 + vmovdqa64 [r15+48], xmm27 + vmovdqa64 [r15+64], xmm28 + vmovdqa64 [r15+80], xmm29 + vmovdqa64 [r15+96], xmm30 + vmovdqa64 [r15+112], xmm31 + vpunpckldq xmm24, xmm16, xmm17 + vpunpckldq xmm25, xmm18, xmm19 + vpunpckhdq xmm28, xmm16, xmm17 + vpunpckhdq xmm29, xmm18, xmm19 + vpunpckldq xmm26, xmm20, xmm21 + vpunpckldq xmm27, xmm22, xmm23 + vpunpckhdq xmm30, xmm20, xmm21 + vpunpckhdq xmm31, xmm22, xmm23 + vpunpcklqdq xmm16, xmm24, xmm25 + vpunpcklqdq xmm17, xmm26, xmm27 + vpunpckhqdq xmm18, xmm24, xmm25 + vpunpckhqdq xmm19, xmm26, xmm27 + vpunpcklqdq xmm20, xmm28, xmm29 + vpunpcklqdq xmm21, xmm30, xmm31 + vpunpckhqdq xmm22, xmm28, xmm29 + vpunpckhqdq xmm23, xmm30, xmm31 + vmovdqu64 xmm24, [rdx] + vmovdqu64 xmm25, [rdx+16] + vmovdqu64 xmm26, [rdx+64] + vmovdqu64 xmm27, [rdx+80] + vmovdqu64 xmm28, [rdx+128] + vmovdqu64 xmm29, [rdx+144] + vmovdqu64 xmm30, [rdx+192] + vmovdqu64 xmm31, [rdx+208] + vpxord xmm16, xmm16, xmm24 + vpxord xmm17, xmm17, xmm25 + vpxord xmm18, xmm18, xmm26 + vpxord xmm19, xmm19, xmm27 + vpxord xmm20, xmm20, xmm28 + vpxord xmm21, xmm21, xmm29 + vpxord xmm22, xmm22, xmm30 + vpxord xmm23, xmm23, xmm31 + vmovdqu64 [rcx], xmm16 + vmovdqu64 [rcx+16], xmm17 + vmovdqu64 [rcx+64], xmm18 + vmovdqu64 [rcx+80], xmm19 + vmovdqu64 [rcx+128], xmm20 + vmovdqu64 [rcx+144], xmm21 + vmovdqu64 [rcx+192], xmm22 + vmovdqu64 [rcx+208], xmm23 + vmovdqa64 xmm16, [r15] + vmovdqa64 xmm17, [r15+16] + vmovdqa64 xmm18, [r15+32] + vmovdqa64 xmm19, [r15+48] + vmovdqa64 xmm20, [r15+64] + vmovdqa64 xmm21, [r15+80] + vmovdqa64 xmm22, [r15+96] + vmovdqa64 xmm23, [r15+112] + vpunpckldq xmm24, xmm16, xmm17 + vpunpckldq xmm25, xmm18, xmm19 + vpunpckhdq xmm28, xmm16, xmm17 + vpunpckhdq xmm29, xmm18, xmm19 + vpunpckldq xmm26, xmm20, xmm21 + vpunpckldq xmm27, xmm22, xmm23 + vpunpckhdq xmm30, xmm20, xmm21 + vpunpckhdq xmm31, xmm22, xmm23 + vpunpcklqdq xmm16, xmm24, xmm25 + vpunpcklqdq xmm17, xmm26, xmm27 + vpunpckhqdq xmm18, xmm24, xmm25 + vpunpckhqdq xmm19, xmm26, xmm27 + vpunpcklqdq xmm20, xmm28, xmm29 + vpunpcklqdq xmm21, xmm30, xmm31 + vpunpckhqdq xmm22, xmm28, xmm29 + vpunpckhqdq xmm23, xmm30, xmm31 + vmovdqu64 xmm24, [rdx+32] + vmovdqu64 xmm25, [rdx+48] + vmovdqu64 xmm26, [rdx+96] + vmovdqu64 xmm27, [rdx+112] + vmovdqu64 xmm28, [rdx+160] + vmovdqu64 xmm29, [rdx+176] + vmovdqu64 xmm30, [rdx+224] + vmovdqu64 xmm31, [rdx+240] + vpxord xmm16, xmm16, xmm24 + vpxord xmm17, xmm17, xmm25 + vpxord xmm18, xmm18, xmm26 + vpxord xmm19, xmm19, xmm27 + vpxord xmm20, xmm20, xmm28 + vpxord xmm21, xmm21, xmm29 + vpxord xmm22, xmm22, xmm30 + vpxord xmm23, xmm23, xmm31 + vmovdqu64 [rcx+32], xmm16 + vmovdqu64 [rcx+48], xmm17 + vmovdqu64 [rcx+96], xmm18 + vmovdqu64 [rcx+112], xmm19 + vmovdqu64 [rcx+160], xmm20 + vmovdqu64 [rcx+176], xmm21 + vmovdqu64 [rcx+224], xmm22 + vmovdqu64 [rcx+240], xmm23 + vmovdqa64 xmm28, [r14+192] + vpaddd xmm28, xmm28, OWORD PTR [r11] + vmovdqa64 [r14+192], xmm28 + vmovdqa64 xmm16, [r14] + vmovdqa64 xmm17, [r14+16] + vmovdqa64 xmm18, [r14+32] + vmovdqa64 xmm19, [r14+48] + vmovdqa64 xmm20, [r14+64] + vmovdqa64 xmm21, [r14+80] + vmovdqa64 xmm22, [r14+96] + vmovdqa64 xmm23, [r14+112] + vmovdqa64 xmm24, [r14+128] + vmovdqa64 xmm25, [r14+144] + vmovdqa64 xmm26, [r14+160] + vmovdqa64 xmm27, [r14+176] + vmovdqa64 xmm28, [r14+192] + vmovdqa64 xmm29, [r14+208] + vmovdqa64 xmm30, [r14+224] + vmovdqa64 xmm31, [r14+240] + add rdx, 256 + add rcx, 256 + sub eax, 256 + jz L_chacha20_poly1305_epilogue +L_chacha20_poly1305_start: + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vmovdqu ymm5, YMMWORD PTR [rcx+-256] + vmovdqu ymm6, YMMWORD PTR [rcx+-224] + vperm2i128 ymm7, ymm5, ymm6, 32 + vperm2i128 ymm5, ymm5, ymm6, 49 + vpunpckldq ymm6, ymm7, ymm5 + vpunpckhdq ymm8, ymm7, ymm5 + vpunpckldq ymm5, ymm6, ymm15 + vpunpckhdq ymm6, ymm6, ymm15 + vpunpckldq ymm7, ymm8, ymm15 + vpunpckhdq ymm8, ymm8, ymm15 + vmovdqu ymm9, YMMWORD PTR [r13] + vpsllq ymm6, ymm6, 6 + vpsllq ymm7, ymm7, 12 + vpsllq ymm8, ymm8, 18 + vpmuludq ymm10, ymm4, [rbp] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm10, ymm3, [rbp+32] + vpmuludq ymm11, ymm4, [rbp+32] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm11, ymm3, [rbp+64] + vpmuludq ymm12, ymm4, [rbp+64] + vpaddq ymm7, ymm12, ymm7 + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbp+64] + vpmuludq ymm13, ymm4, [rbp+96] + vpaddq ymm8, ymm13, ymm8 + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbp+96] + vpmuludq ymm10, ymm2, [rbp+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbp+96] + vpmuludq ymm12, ymm3, [rbx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm4, [rbx] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rbx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rbx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rbx] + vpmuludq ymm12, ymm2, [rbx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rbx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rbx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rbx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rbx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rbx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vmovdqu ymm5, YMMWORD PTR [rcx+-192] + vmovdqu ymm6, YMMWORD PTR [rcx+-160] + vperm2i128 ymm7, ymm5, ymm6, 32 + vperm2i128 ymm5, ymm5, ymm6, 49 + vpunpckldq ymm6, ymm7, ymm5 + vpunpckhdq ymm8, ymm7, ymm5 + vpunpckldq ymm5, ymm6, ymm15 + vpunpckhdq ymm6, ymm6, ymm15 + vpunpckldq ymm7, ymm8, ymm15 + vpunpckhdq ymm8, ymm8, ymm15 + vmovdqu ymm9, YMMWORD PTR [r13] + vpsllq ymm6, ymm6, 6 + vpsllq ymm7, ymm7, 12 + vpsllq ymm8, ymm8, 18 + vpmuludq ymm10, ymm4, [rbp] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm10, ymm3, [rbp+32] + vpmuludq ymm11, ymm4, [rbp+32] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm11, ymm3, [rbp+64] + vpmuludq ymm12, ymm4, [rbp+64] + vpaddq ymm7, ymm12, ymm7 + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbp+64] + vpmuludq ymm13, ymm4, [rbp+96] + vpaddq ymm8, ymm13, ymm8 + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbp+96] + vpmuludq ymm10, ymm2, [rbp+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbp+96] + vpmuludq ymm12, ymm3, [rbx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm4, [rbx] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rbx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rbx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rbx] + vpmuludq ymm12, ymm2, [rbx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rbx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rbx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rbx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rbx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rbx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vmovdqu ymm5, YMMWORD PTR [rcx+-128] + vmovdqu ymm6, YMMWORD PTR [rcx+-96] + vperm2i128 ymm7, ymm5, ymm6, 32 + vperm2i128 ymm5, ymm5, ymm6, 49 + vpunpckldq ymm6, ymm7, ymm5 + vpunpckhdq ymm8, ymm7, ymm5 + vpunpckldq ymm5, ymm6, ymm15 + vpunpckhdq ymm6, ymm6, ymm15 + vpunpckldq ymm7, ymm8, ymm15 + vpunpckhdq ymm8, ymm8, ymm15 + vmovdqu ymm9, YMMWORD PTR [r13] + vpsllq ymm6, ymm6, 6 + vpsllq ymm7, ymm7, 12 + vpsllq ymm8, ymm8, 18 + vpmuludq ymm10, ymm4, [rbp] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm10, ymm3, [rbp+32] + vpmuludq ymm11, ymm4, [rbp+32] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm11, ymm3, [rbp+64] + vpmuludq ymm12, ymm4, [rbp+64] + vpaddq ymm7, ymm12, ymm7 + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbp+64] + vpmuludq ymm13, ymm4, [rbp+96] + vpaddq ymm8, ymm13, ymm8 + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbp+96] + vpmuludq ymm10, ymm2, [rbp+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbp+96] + vpmuludq ymm12, ymm3, [rbx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm4, [rbx] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rbx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rbx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rbx] + vpmuludq ymm12, ymm2, [rbx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rbx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rbx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rbx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rbx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rbx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vmovdqu ymm5, YMMWORD PTR [rcx+-64] + vmovdqu ymm6, YMMWORD PTR [rcx+-32] + vperm2i128 ymm7, ymm5, ymm6, 32 + vperm2i128 ymm5, ymm5, ymm6, 49 + vpunpckldq ymm6, ymm7, ymm5 + vpunpckhdq ymm8, ymm7, ymm5 + vpunpckldq ymm5, ymm6, ymm15 + vpunpckhdq ymm6, ymm6, ymm15 + vpunpckldq ymm7, ymm8, ymm15 + vpunpckhdq ymm8, ymm8, ymm15 + vmovdqu ymm9, YMMWORD PTR [r13] + vpsllq ymm6, ymm6, 6 + vpsllq ymm7, ymm7, 12 + vpsllq ymm8, ymm8, 18 + vpmuludq ymm10, ymm4, [rbp] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm10, ymm3, [rbp+32] + vpmuludq ymm11, ymm4, [rbp+32] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm11, ymm3, [rbp+64] + vpmuludq ymm12, ymm4, [rbp+64] + vpaddq ymm7, ymm12, ymm7 + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbp+64] + vpmuludq ymm13, ymm4, [rbp+96] + vpaddq ymm8, ymm13, ymm8 + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbp+96] + vpmuludq ymm10, ymm2, [rbp+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbp+96] + vpmuludq ymm12, ymm3, [rbx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm4, [rbx] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rbx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rbx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rbx] + vpmuludq ymm12, ymm2, [rbx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rbx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rbx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rbx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rbx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rbx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vprold xmm31, xmm31, 16 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 12 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vpaddd xmm16, xmm16, xmm20 + vpaddd xmm17, xmm17, xmm21 + vpaddd xmm18, xmm18, xmm22 + vpaddd xmm19, xmm19, xmm23 + vpxord xmm28, xmm28, xmm16 + vpxord xmm29, xmm29, xmm17 + vpxord xmm30, xmm30, xmm18 + vpxord xmm31, xmm31, xmm19 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vprold xmm31, xmm31, 8 + vpaddd xmm24, xmm24, xmm28 + vpaddd xmm25, xmm25, xmm29 + vpaddd xmm26, xmm26, xmm30 + vpaddd xmm27, xmm27, xmm31 + vpxord xmm20, xmm20, xmm24 + vpxord xmm21, xmm21, xmm25 + vpxord xmm22, xmm22, xmm26 + vpxord xmm23, xmm23, xmm27 + vprold xmm20, xmm20, 7 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 16 + vprold xmm28, xmm28, 16 + vprold xmm29, xmm29, 16 + vprold xmm30, xmm30, 16 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 12 + vprold xmm22, xmm22, 12 + vprold xmm23, xmm23, 12 + vprold xmm20, xmm20, 12 + vpaddd xmm16, xmm16, xmm21 + vpaddd xmm17, xmm17, xmm22 + vpaddd xmm18, xmm18, xmm23 + vpaddd xmm19, xmm19, xmm20 + vpxord xmm31, xmm31, xmm16 + vpxord xmm28, xmm28, xmm17 + vpxord xmm29, xmm29, xmm18 + vpxord xmm30, xmm30, xmm19 + vprold xmm31, xmm31, 8 + vprold xmm28, xmm28, 8 + vprold xmm29, xmm29, 8 + vprold xmm30, xmm30, 8 + vpaddd xmm26, xmm26, xmm31 + vpaddd xmm27, xmm27, xmm28 + vpaddd xmm24, xmm24, xmm29 + vpaddd xmm25, xmm25, xmm30 + vpxord xmm21, xmm21, xmm26 + vpxord xmm22, xmm22, xmm27 + vpxord xmm23, xmm23, xmm24 + vpxord xmm20, xmm20, xmm25 + vprold xmm21, xmm21, 7 + vprold xmm22, xmm22, 7 + vprold xmm23, xmm23, 7 + vprold xmm20, xmm20, 7 + vpaddd xmm16, xmm16, OWORD PTR [r14] + vpaddd xmm17, xmm17, OWORD PTR [r14+16] + vpaddd xmm18, xmm18, OWORD PTR [r14+32] + vpaddd xmm19, xmm19, OWORD PTR [r14+48] + vpaddd xmm20, xmm20, OWORD PTR [r14+64] + vpaddd xmm21, xmm21, OWORD PTR [r14+80] + vpaddd xmm22, xmm22, OWORD PTR [r14+96] + vpaddd xmm23, xmm23, OWORD PTR [r14+112] + vpaddd xmm24, xmm24, OWORD PTR [r14+128] + vpaddd xmm25, xmm25, OWORD PTR [r14+144] + vpaddd xmm26, xmm26, OWORD PTR [r14+160] + vpaddd xmm27, xmm27, OWORD PTR [r14+176] + vpaddd xmm28, xmm28, OWORD PTR [r14+192] + vpaddd xmm29, xmm29, OWORD PTR [r14+208] + vpaddd xmm30, xmm30, OWORD PTR [r14+224] + vpaddd xmm31, xmm31, OWORD PTR [r14+240] + vmovdqa64 [r15], xmm24 + vmovdqa64 [r15+16], xmm25 + vmovdqa64 [r15+32], xmm26 + vmovdqa64 [r15+48], xmm27 + vmovdqa64 [r15+64], xmm28 + vmovdqa64 [r15+80], xmm29 + vmovdqa64 [r15+96], xmm30 + vmovdqa64 [r15+112], xmm31 + vpunpckldq xmm24, xmm16, xmm17 + vpunpckldq xmm25, xmm18, xmm19 + vpunpckhdq xmm28, xmm16, xmm17 + vpunpckhdq xmm29, xmm18, xmm19 + vpunpckldq xmm26, xmm20, xmm21 + vpunpckldq xmm27, xmm22, xmm23 + vpunpckhdq xmm30, xmm20, xmm21 + vpunpckhdq xmm31, xmm22, xmm23 + vpunpcklqdq xmm16, xmm24, xmm25 + vpunpcklqdq xmm17, xmm26, xmm27 + vpunpckhqdq xmm18, xmm24, xmm25 + vpunpckhqdq xmm19, xmm26, xmm27 + vpunpcklqdq xmm20, xmm28, xmm29 + vpunpcklqdq xmm21, xmm30, xmm31 + vpunpckhqdq xmm22, xmm28, xmm29 + vpunpckhqdq xmm23, xmm30, xmm31 + vmovdqu64 xmm24, [rdx] + vmovdqu64 xmm25, [rdx+16] + vmovdqu64 xmm26, [rdx+64] + vmovdqu64 xmm27, [rdx+80] + vmovdqu64 xmm28, [rdx+128] + vmovdqu64 xmm29, [rdx+144] + vmovdqu64 xmm30, [rdx+192] + vmovdqu64 xmm31, [rdx+208] + vpxord xmm16, xmm16, xmm24 + vpxord xmm17, xmm17, xmm25 + vpxord xmm18, xmm18, xmm26 + vpxord xmm19, xmm19, xmm27 + vpxord xmm20, xmm20, xmm28 + vpxord xmm21, xmm21, xmm29 + vpxord xmm22, xmm22, xmm30 + vpxord xmm23, xmm23, xmm31 + vmovdqu64 [rcx], xmm16 + vmovdqu64 [rcx+16], xmm17 + vmovdqu64 [rcx+64], xmm18 + vmovdqu64 [rcx+80], xmm19 + vmovdqu64 [rcx+128], xmm20 + vmovdqu64 [rcx+144], xmm21 + vmovdqu64 [rcx+192], xmm22 + vmovdqu64 [rcx+208], xmm23 + vmovdqa64 xmm16, [r15] + vmovdqa64 xmm17, [r15+16] + vmovdqa64 xmm18, [r15+32] + vmovdqa64 xmm19, [r15+48] + vmovdqa64 xmm20, [r15+64] + vmovdqa64 xmm21, [r15+80] + vmovdqa64 xmm22, [r15+96] + vmovdqa64 xmm23, [r15+112] + vpunpckldq xmm24, xmm16, xmm17 + vpunpckldq xmm25, xmm18, xmm19 + vpunpckhdq xmm28, xmm16, xmm17 + vpunpckhdq xmm29, xmm18, xmm19 + vpunpckldq xmm26, xmm20, xmm21 + vpunpckldq xmm27, xmm22, xmm23 + vpunpckhdq xmm30, xmm20, xmm21 + vpunpckhdq xmm31, xmm22, xmm23 + vpunpcklqdq xmm16, xmm24, xmm25 + vpunpcklqdq xmm17, xmm26, xmm27 + vpunpckhqdq xmm18, xmm24, xmm25 + vpunpckhqdq xmm19, xmm26, xmm27 + vpunpcklqdq xmm20, xmm28, xmm29 + vpunpcklqdq xmm21, xmm30, xmm31 + vpunpckhqdq xmm22, xmm28, xmm29 + vpunpckhqdq xmm23, xmm30, xmm31 + vmovdqu64 xmm24, [rdx+32] + vmovdqu64 xmm25, [rdx+48] + vmovdqu64 xmm26, [rdx+96] + vmovdqu64 xmm27, [rdx+112] + vmovdqu64 xmm28, [rdx+160] + vmovdqu64 xmm29, [rdx+176] + vmovdqu64 xmm30, [rdx+224] + vmovdqu64 xmm31, [rdx+240] + vpxord xmm16, xmm16, xmm24 + vpxord xmm17, xmm17, xmm25 + vpxord xmm18, xmm18, xmm26 + vpxord xmm19, xmm19, xmm27 + vpxord xmm20, xmm20, xmm28 + vpxord xmm21, xmm21, xmm29 + vpxord xmm22, xmm22, xmm30 + vpxord xmm23, xmm23, xmm31 + vmovdqu64 [rcx+32], xmm16 + vmovdqu64 [rcx+48], xmm17 + vmovdqu64 [rcx+96], xmm18 + vmovdqu64 [rcx+112], xmm19 + vmovdqu64 [rcx+160], xmm20 + vmovdqu64 [rcx+176], xmm21 + vmovdqu64 [rcx+224], xmm22 + vmovdqu64 [rcx+240], xmm23 + vmovdqa64 xmm28, [r14+192] + vpaddd xmm28, xmm28, OWORD PTR [r11] + vmovdqa64 [r14+192], xmm28 + vmovdqa64 xmm16, [r14] + vmovdqa64 xmm17, [r14+16] + vmovdqa64 xmm18, [r14+32] + vmovdqa64 xmm19, [r14+48] + vmovdqa64 xmm20, [r14+64] + vmovdqa64 xmm21, [r14+80] + vmovdqa64 xmm22, [r14+96] + vmovdqa64 xmm23, [r14+112] + vmovdqa64 xmm24, [r14+128] + vmovdqa64 xmm25, [r14+144] + vmovdqa64 xmm26, [r14+160] + vmovdqa64 xmm27, [r14+176] + vmovdqa64 xmm28, [r14+192] + vmovdqa64 xmm29, [r14+208] + vmovdqa64 xmm30, [r14+224] + vmovdqa64 xmm31, [r14+240] + add rdx, 256 + add rcx, 256 + sub eax, 256 + jnz L_chacha20_poly1305_start +L_chacha20_poly1305_epilogue: + vmovdqu ymm5, YMMWORD PTR [rcx+-256] + vmovdqu ymm6, YMMWORD PTR [rcx+-224] + vperm2i128 ymm7, ymm5, ymm6, 32 + vperm2i128 ymm5, ymm5, ymm6, 49 + vpunpckldq ymm6, ymm7, ymm5 + vpunpckhdq ymm8, ymm7, ymm5 + vpunpckldq ymm5, ymm6, ymm15 + vpunpckhdq ymm6, ymm6, ymm15 + vpunpckldq ymm7, ymm8, ymm15 + vpunpckhdq ymm8, ymm8, ymm15 + vmovdqu ymm9, YMMWORD PTR [r13] + vpsllq ymm6, ymm6, 6 + vpsllq ymm7, ymm7, 12 + vpsllq ymm8, ymm8, 18 + vpmuludq ymm10, ymm4, [rbp] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm10, ymm3, [rbp+32] + vpmuludq ymm11, ymm4, [rbp+32] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm11, ymm3, [rbp+64] + vpmuludq ymm12, ymm4, [rbp+64] + vpaddq ymm7, ymm12, ymm7 + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbp+64] + vpmuludq ymm13, ymm4, [rbp+96] + vpaddq ymm8, ymm13, ymm8 + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbp+96] + vpmuludq ymm10, ymm2, [rbp+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbp+96] + vpmuludq ymm12, ymm3, [rbx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm4, [rbx] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rbx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rbx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rbx] + vpmuludq ymm12, ymm2, [rbx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rbx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rbx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rbx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rbx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rbx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + vmovdqu ymm5, YMMWORD PTR [rcx+-192] + vmovdqu ymm6, YMMWORD PTR [rcx+-160] + vperm2i128 ymm7, ymm5, ymm6, 32 + vperm2i128 ymm5, ymm5, ymm6, 49 + vpunpckldq ymm6, ymm7, ymm5 + vpunpckhdq ymm8, ymm7, ymm5 + vpunpckldq ymm5, ymm6, ymm15 + vpunpckhdq ymm6, ymm6, ymm15 + vpunpckldq ymm7, ymm8, ymm15 + vpunpckhdq ymm8, ymm8, ymm15 + vmovdqu ymm9, YMMWORD PTR [r13] + vpsllq ymm6, ymm6, 6 + vpsllq ymm7, ymm7, 12 + vpsllq ymm8, ymm8, 18 + vpmuludq ymm10, ymm4, [rbp] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm10, ymm3, [rbp+32] + vpmuludq ymm11, ymm4, [rbp+32] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm11, ymm3, [rbp+64] + vpmuludq ymm12, ymm4, [rbp+64] + vpaddq ymm7, ymm12, ymm7 + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbp+64] + vpmuludq ymm13, ymm4, [rbp+96] + vpaddq ymm8, ymm13, ymm8 + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbp+96] + vpmuludq ymm10, ymm2, [rbp+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbp+96] + vpmuludq ymm12, ymm3, [rbx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm4, [rbx] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rbx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rbx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rbx] + vpmuludq ymm12, ymm2, [rbx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rbx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rbx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rbx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rbx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rbx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + vmovdqu ymm5, YMMWORD PTR [rcx+-128] + vmovdqu ymm6, YMMWORD PTR [rcx+-96] + vperm2i128 ymm7, ymm5, ymm6, 32 + vperm2i128 ymm5, ymm5, ymm6, 49 + vpunpckldq ymm6, ymm7, ymm5 + vpunpckhdq ymm8, ymm7, ymm5 + vpunpckldq ymm5, ymm6, ymm15 + vpunpckhdq ymm6, ymm6, ymm15 + vpunpckldq ymm7, ymm8, ymm15 + vpunpckhdq ymm8, ymm8, ymm15 + vmovdqu ymm9, YMMWORD PTR [r13] + vpsllq ymm6, ymm6, 6 + vpsllq ymm7, ymm7, 12 + vpsllq ymm8, ymm8, 18 + vpmuludq ymm10, ymm4, [rbp] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm10, ymm3, [rbp+32] + vpmuludq ymm11, ymm4, [rbp+32] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm11, ymm3, [rbp+64] + vpmuludq ymm12, ymm4, [rbp+64] + vpaddq ymm7, ymm12, ymm7 + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbp+64] + vpmuludq ymm13, ymm4, [rbp+96] + vpaddq ymm8, ymm13, ymm8 + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbp+96] + vpmuludq ymm10, ymm2, [rbp+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbp+96] + vpmuludq ymm12, ymm3, [rbx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm4, [rbx] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rbx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rbx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rbx] + vpmuludq ymm12, ymm2, [rbx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rbx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rbx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rbx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rbx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rbx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + vmovdqu ymm5, YMMWORD PTR [rcx+-64] + vmovdqu ymm6, YMMWORD PTR [rcx+-32] + vperm2i128 ymm7, ymm5, ymm6, 32 + vperm2i128 ymm5, ymm5, ymm6, 49 + vpunpckldq ymm6, ymm7, ymm5 + vpunpckhdq ymm8, ymm7, ymm5 + vpunpckldq ymm5, ymm6, ymm15 + vpunpckhdq ymm6, ymm6, ymm15 + vpunpckldq ymm7, ymm8, ymm15 + vpunpckhdq ymm8, ymm8, ymm15 + vmovdqu ymm9, YMMWORD PTR [r13] + vpsllq ymm6, ymm6, 6 + vpsllq ymm7, ymm7, 12 + vpsllq ymm8, ymm8, 18 + vpmuludq ymm10, ymm4, [rbp] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm10, ymm3, [rbp+32] + vpmuludq ymm11, ymm4, [rbp+32] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm11, ymm3, [rbp+64] + vpmuludq ymm12, ymm4, [rbp+64] + vpaddq ymm7, ymm12, ymm7 + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbp+64] + vpmuludq ymm13, ymm4, [rbp+96] + vpaddq ymm8, ymm13, ymm8 + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbp+96] + vpmuludq ymm10, ymm2, [rbp+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbp+96] + vpmuludq ymm12, ymm3, [rbx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm4, [rbx] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rbx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rbx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rbx] + vpmuludq ymm12, ymm2, [rbx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rbx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rbx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rbx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rbx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rbx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rbx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rbx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + vmovdqu YMMWORD PTR [r9], ymm0 + vmovdqu YMMWORD PTR [r9+32], ymm1 + vmovdqu YMMWORD PTR [r9+64], ymm2 + vmovdqu YMMWORD PTR [r9+96], ymm3 + vmovdqu YMMWORD PTR [r9+128], ymm4 + vmovd [rdi+48], xmm28 + vzeroupper + vmovdqu xmm6, OWORD PTR [rsp+720] + vmovdqu xmm7, OWORD PTR [rsp+736] + vmovdqu xmm8, OWORD PTR [rsp+752] + vmovdqu xmm9, OWORD PTR [rsp+768] + vmovdqu xmm10, OWORD PTR [rsp+784] + vmovdqu xmm11, OWORD PTR [rsp+800] + vmovdqu xmm12, OWORD PTR [rsp+816] + vmovdqu xmm13, OWORD PTR [rsp+832] + vmovdqu xmm14, OWORD PTR [rsp+848] + vmovdqu xmm15, OWORD PTR [rsp+864] + add rsp, 880 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + pop rsi + pop rdi + ret +chacha20_poly1305_avx512 ENDP +_TEXT ENDS +ENDIF +IFDEF HAVE_INTEL_AVX512 +_DATA SEGMENT +ALIGN 16 +L_cp512_add QWORD 0000000100000000h, 0000000300000002h + QWORD 0000000500000004h, 0000000700000006h + QWORD 0000000900000008h, 0000000b0000000ah + QWORD 0000000d0000000ch, 0000000f0000000eh +ptr_L_cp512_add QWORD L_cp512_add +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_cp512_pc QWORD 00000fffffffffffh, 00000fffffffffffh + QWORD 00000fffffffffffh, 00000fffffffffffh + QWORD 00000fffffffffffh, 00000fffffffffffh + QWORD 00000fffffffffffh, 00000fffffffffffh + QWORD 0000000000ffffffh, 0000000000ffffffh + QWORD 0000000000ffffffh, 0000000000ffffffh + QWORD 0000000000ffffffh, 0000000000ffffffh + QWORD 0000000000ffffffh, 0000000000ffffffh + QWORD 0000010000000000h, 0000010000000000h + QWORD 0000010000000000h, 0000010000000000h + QWORD 0000010000000000h, 0000010000000000h + QWORD 0000010000000000h, 0000010000000000h + QWORD 0000000000000000h, 0000000000000002h + QWORD 0000000000000004h, 0000000000000006h + QWORD 0000000000000008h, 000000000000000ah + QWORD 000000000000000ch, 000000000000000eh + QWORD 0000000000000001h, 0000000000000003h + QWORD 0000000000000005h, 0000000000000007h + QWORD 0000000000000009h, 000000000000000bh + QWORD 000000000000000dh, 000000000000000fh + QWORD 0000001000000010h, 0000001000000010h + QWORD 0000001000000010h, 0000001000000010h + QWORD 0000001000000010h, 0000001000000010h + QWORD 0000001000000010h, 0000001000000010h +ptr_L_cp512_pc QWORD L_cp512_pc +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_cp512_rx QWORD 000000000000000ch, 0000000000000008h + QWORD 0000000000000004h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 000000000000000dh, 0000000000000009h + QWORD 0000000000000005h, 0000000000000001h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 000000000000000eh, 000000000000000ah + QWORD 0000000000000006h, 0000000000000002h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h +ptr_L_cp512_rx QWORD L_cp512_rx +_DATA ENDS +_TEXT SEGMENT READONLY PARA +chacha20_poly1305_ifma PROC + push rdi + push rsi + push r12 + push r13 + push r14 + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + mov rcx, r9 + mov rax, QWORD PTR [rsp+80] + sub rsp, 1360 + vmovdqu OWORD PTR [rsp+1200], xmm6 + vmovdqu OWORD PTR [rsp+1216], xmm7 + vmovdqu OWORD PTR [rsp+1232], xmm8 + vmovdqu OWORD PTR [rsp+1248], xmm9 + vmovdqu OWORD PTR [rsp+1264], xmm10 + vmovdqu OWORD PTR [rsp+1280], xmm11 + vmovdqu OWORD PTR [rsp+1296], xmm12 + vmovdqu OWORD PTR [rsp+1312], xmm13 + vmovdqu OWORD PTR [rsp+1328], xmm14 + vmovdqu OWORD PTR [rsp+1344], xmm15 + mov r8, QWORD PTR [ptr_L_cp512_pc] + mov r10, QWORD PTR [ptr_L_cp512_rx] + mov r9, QWORD PTR [ptr_L_cp512_add] + lea r11, QWORD PTR [rsp+32] + add r11, 63 + and r11, -64 + vpxorq zmm16, zmm16, zmm16 + vpxorq zmm17, zmm17, zmm17 + vpxorq zmm18, zmm18, zmm18 + vmovdqu64 [rsi+752], zmm16 + vmovdqu64 [rsi+816], zmm17 + vmovdqu64 [rsi+880], zmm18 + vpbroadcastq zmm19, QWORD PTR [rsi+720] + vpbroadcastq zmm20, QWORD PTR [rsi+728] + vpbroadcastq zmm21, QWORD PTR [rsi+736] + vpsllq zmm30, zmm20, 2 + vpsllq zmm22, zmm20, 4 + vpaddq zmm22, zmm22, zmm30 + vpsllq zmm30, zmm21, 2 + vpsllq zmm23, zmm21, 4 + vpaddq zmm23, zmm23, zmm30 + vpbroadcastd zmm0, DWORD PTR [rdi] + vpbroadcastd zmm1, DWORD PTR [rdi+4] + vpbroadcastd zmm2, DWORD PTR [rdi+8] + vpbroadcastd zmm3, DWORD PTR [rdi+12] + vpbroadcastd zmm4, DWORD PTR [rdi+16] + vpbroadcastd zmm5, DWORD PTR [rdi+20] + vpbroadcastd zmm6, DWORD PTR [rdi+24] + vpbroadcastd zmm7, DWORD PTR [rdi+28] + vpbroadcastd zmm8, DWORD PTR [rdi+32] + vpbroadcastd zmm9, DWORD PTR [rdi+36] + vpbroadcastd zmm10, DWORD PTR [rdi+40] + vpbroadcastd zmm11, DWORD PTR [rdi+44] + vpbroadcastd zmm12, DWORD PTR [rdi+48] + vpbroadcastd zmm13, DWORD PTR [rdi+52] + vpbroadcastd zmm14, DWORD PTR [rdi+56] + vpbroadcastd zmm15, DWORD PTR [rdi+60] + vpaddd zmm12, zmm12, [r9] + vmovdqa64 [r11], zmm0 + vmovdqa64 [r11+64], zmm1 + vmovdqa64 [r11+128], zmm2 + vmovdqa64 [r11+192], zmm3 + vmovdqa64 [r11+256], zmm4 + vmovdqa64 [r11+320], zmm5 + vmovdqa64 [r11+384], zmm6 + vmovdqa64 [r11+448], zmm7 + vmovdqa64 [r11+512], zmm8 + vmovdqa64 [r11+576], zmm9 + vmovdqa64 [r11+640], zmm10 + vmovdqa64 [r11+704], zmm11 + vmovdqa64 [r11+768], zmm12 + vmovdqa64 [r11+832], zmm13 + vmovdqa64 [r11+896], zmm14 + vmovdqa64 [r11+960], zmm15 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, [r11] + vpaddd zmm1, zmm1, [r11+64] + vpaddd zmm2, zmm2, [r11+128] + vpaddd zmm3, zmm3, [r11+192] + vpaddd zmm4, zmm4, [r11+256] + vpaddd zmm5, zmm5, [r11+320] + vpaddd zmm6, zmm6, [r11+384] + vpaddd zmm7, zmm7, [r11+448] + vpaddd zmm8, zmm8, [r11+512] + vpaddd zmm9, zmm9, [r11+576] + vpaddd zmm10, zmm10, [r11+640] + vpaddd zmm11, zmm11, [r11+704] + vpaddd zmm12, zmm12, [r11+768] + vpaddd zmm13, zmm13, [r11+832] + vpaddd zmm14, zmm14, [r11+896] + vpaddd zmm15, zmm15, [r11+960] + vpunpckldq zmm16, zmm0, zmm1 + vpunpckhdq zmm17, zmm0, zmm1 + vpunpckldq zmm18, zmm2, zmm3 + vpunpckhdq zmm19, zmm2, zmm3 + vpunpckldq zmm20, zmm4, zmm5 + vpunpckhdq zmm21, zmm4, zmm5 + vpunpckldq zmm22, zmm6, zmm7 + vpunpckhdq zmm23, zmm6, zmm7 + vpunpckldq zmm24, zmm8, zmm9 + vpunpckhdq zmm25, zmm8, zmm9 + vpunpckldq zmm26, zmm10, zmm11 + vpunpckhdq zmm27, zmm10, zmm11 + vpunpckldq zmm28, zmm12, zmm13 + vpunpckhdq zmm29, zmm12, zmm13 + vpunpckldq zmm30, zmm14, zmm15 + vpunpckhdq zmm31, zmm14, zmm15 + vpunpcklqdq zmm0, zmm16, zmm18 + vpunpckhqdq zmm1, zmm16, zmm18 + vpunpcklqdq zmm2, zmm17, zmm19 + vpunpckhqdq zmm3, zmm17, zmm19 + vpunpcklqdq zmm4, zmm20, zmm22 + vpunpckhqdq zmm5, zmm20, zmm22 + vpunpcklqdq zmm6, zmm21, zmm23 + vpunpckhqdq zmm7, zmm21, zmm23 + vpunpcklqdq zmm8, zmm24, zmm26 + vpunpckhqdq zmm9, zmm24, zmm26 + vpunpcklqdq zmm10, zmm25, zmm27 + vpunpckhqdq zmm11, zmm25, zmm27 + vpunpcklqdq zmm12, zmm28, zmm30 + vpunpckhqdq zmm13, zmm28, zmm30 + vpunpcklqdq zmm14, zmm29, zmm31 + vpunpckhqdq zmm15, zmm29, zmm31 + vshufi32x4 zmm16, zmm0, zmm4, 68 + vshufi32x4 zmm17, zmm0, zmm4, 238 + vshufi32x4 zmm18, zmm8, zmm12, 68 + vshufi32x4 zmm19, zmm8, zmm12, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx] + vmovdqu64 [rcx], zmm20 + vpxord zmm21, zmm21, [rdx+256] + vmovdqu64 [rcx+256], zmm21 + vpxord zmm22, zmm22, [rdx+512] + vmovdqu64 [rcx+512], zmm22 + vpxord zmm23, zmm23, [rdx+768] + vmovdqu64 [rcx+768], zmm23 + vshufi32x4 zmm16, zmm1, zmm5, 68 + vshufi32x4 zmm17, zmm1, zmm5, 238 + vshufi32x4 zmm18, zmm9, zmm13, 68 + vshufi32x4 zmm19, zmm9, zmm13, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+64] + vmovdqu64 [rcx+64], zmm20 + vpxord zmm21, zmm21, [rdx+320] + vmovdqu64 [rcx+320], zmm21 + vpxord zmm22, zmm22, [rdx+576] + vmovdqu64 [rcx+576], zmm22 + vpxord zmm23, zmm23, [rdx+832] + vmovdqu64 [rcx+832], zmm23 + vshufi32x4 zmm16, zmm2, zmm6, 68 + vshufi32x4 zmm17, zmm2, zmm6, 238 + vshufi32x4 zmm18, zmm10, zmm14, 68 + vshufi32x4 zmm19, zmm10, zmm14, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+128] + vmovdqu64 [rcx+128], zmm20 + vpxord zmm21, zmm21, [rdx+384] + vmovdqu64 [rcx+384], zmm21 + vpxord zmm22, zmm22, [rdx+640] + vmovdqu64 [rcx+640], zmm22 + vpxord zmm23, zmm23, [rdx+896] + vmovdqu64 [rcx+896], zmm23 + vshufi32x4 zmm16, zmm3, zmm7, 68 + vshufi32x4 zmm17, zmm3, zmm7, 238 + vshufi32x4 zmm18, zmm11, zmm15, 68 + vshufi32x4 zmm19, zmm11, zmm15, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+192] + vmovdqu64 [rcx+192], zmm20 + vpxord zmm21, zmm21, [rdx+448] + vmovdqu64 [rcx+448], zmm21 + vpxord zmm22, zmm22, [rdx+704] + vmovdqu64 [rcx+704], zmm22 + vpxord zmm23, zmm23, [rdx+960] + vmovdqu64 [rcx+960], zmm23 + vmovdqa64 zmm12, [r11+768] + vpaddd zmm12, zmm12, [r8+320] + vmovdqa64 [r11+768], zmm12 + vmovdqa64 zmm0, [r11] + vmovdqa64 zmm1, [r11+64] + vmovdqa64 zmm2, [r11+128] + vmovdqa64 zmm3, [r11+192] + vmovdqa64 zmm4, [r11+256] + vmovdqa64 zmm5, [r11+320] + vmovdqa64 zmm6, [r11+384] + vmovdqa64 zmm7, [r11+448] + vmovdqa64 zmm8, [r11+512] + vmovdqa64 zmm9, [r11+576] + vmovdqa64 zmm10, [r11+640] + vmovdqa64 zmm11, [r11+704] + vmovdqa64 zmm12, [r11+768] + vmovdqa64 zmm13, [r11+832] + vmovdqa64 zmm14, [r11+896] + vmovdqa64 zmm15, [r11+960] + add rdx, 1024 + add rcx, 1024 + sub eax, 1024 + jz L_cp512_epi +L_cp512_start: + vmovdqu64 zmm16, [rsi+752] + vmovdqu64 zmm17, [rsi+816] + vmovdqu64 zmm18, [rsi+880] + vpbroadcastq zmm19, QWORD PTR [rsi+720] + vpbroadcastq zmm20, QWORD PTR [rsi+728] + vpbroadcastq zmm21, QWORD PTR [rsi+736] + vpsllq zmm30, zmm20, 2 + vpsllq zmm22, zmm20, 4 + vpaddq zmm22, zmm22, zmm30 + vpsllq zmm30, zmm21, 2 + vpsllq zmm23, zmm21, 4 + vpaddq zmm23, zmm23, zmm30 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rcx+-1024] + vmovdqu64 zmm28, [rcx+-960] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rcx+-896] + vmovdqu64 zmm28, [rcx+-832] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rcx+-768] + vmovdqu64 zmm28, [rcx+-704] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rcx+-640] + vmovdqu64 zmm28, [rcx+-576] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rcx+-512] + vmovdqu64 zmm28, [rcx+-448] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rcx+-384] + vmovdqu64 zmm28, [rcx+-320] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rcx+-256] + vmovdqu64 zmm28, [rcx+-192] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rcx+-128] + vmovdqu64 zmm28, [rcx+-64] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, [r11] + vpaddd zmm1, zmm1, [r11+64] + vpaddd zmm2, zmm2, [r11+128] + vpaddd zmm3, zmm3, [r11+192] + vpaddd zmm4, zmm4, [r11+256] + vpaddd zmm5, zmm5, [r11+320] + vpaddd zmm6, zmm6, [r11+384] + vpaddd zmm7, zmm7, [r11+448] + vpaddd zmm8, zmm8, [r11+512] + vpaddd zmm9, zmm9, [r11+576] + vpaddd zmm10, zmm10, [r11+640] + vpaddd zmm11, zmm11, [r11+704] + vpaddd zmm12, zmm12, [r11+768] + vpaddd zmm13, zmm13, [r11+832] + vpaddd zmm14, zmm14, [r11+896] + vpaddd zmm15, zmm15, [r11+960] + vmovdqu64 [rsi+752], zmm16 + vmovdqu64 [rsi+816], zmm17 + vmovdqu64 [rsi+880], zmm18 + vpunpckldq zmm16, zmm0, zmm1 + vpunpckhdq zmm17, zmm0, zmm1 + vpunpckldq zmm18, zmm2, zmm3 + vpunpckhdq zmm19, zmm2, zmm3 + vpunpckldq zmm20, zmm4, zmm5 + vpunpckhdq zmm21, zmm4, zmm5 + vpunpckldq zmm22, zmm6, zmm7 + vpunpckhdq zmm23, zmm6, zmm7 + vpunpckldq zmm24, zmm8, zmm9 + vpunpckhdq zmm25, zmm8, zmm9 + vpunpckldq zmm26, zmm10, zmm11 + vpunpckhdq zmm27, zmm10, zmm11 + vpunpckldq zmm28, zmm12, zmm13 + vpunpckhdq zmm29, zmm12, zmm13 + vpunpckldq zmm30, zmm14, zmm15 + vpunpckhdq zmm31, zmm14, zmm15 + vpunpcklqdq zmm0, zmm16, zmm18 + vpunpckhqdq zmm1, zmm16, zmm18 + vpunpcklqdq zmm2, zmm17, zmm19 + vpunpckhqdq zmm3, zmm17, zmm19 + vpunpcklqdq zmm4, zmm20, zmm22 + vpunpckhqdq zmm5, zmm20, zmm22 + vpunpcklqdq zmm6, zmm21, zmm23 + vpunpckhqdq zmm7, zmm21, zmm23 + vpunpcklqdq zmm8, zmm24, zmm26 + vpunpckhqdq zmm9, zmm24, zmm26 + vpunpcklqdq zmm10, zmm25, zmm27 + vpunpckhqdq zmm11, zmm25, zmm27 + vpunpcklqdq zmm12, zmm28, zmm30 + vpunpckhqdq zmm13, zmm28, zmm30 + vpunpcklqdq zmm14, zmm29, zmm31 + vpunpckhqdq zmm15, zmm29, zmm31 + vshufi32x4 zmm16, zmm0, zmm4, 68 + vshufi32x4 zmm17, zmm0, zmm4, 238 + vshufi32x4 zmm18, zmm8, zmm12, 68 + vshufi32x4 zmm19, zmm8, zmm12, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx] + vmovdqu64 [rcx], zmm20 + vpxord zmm21, zmm21, [rdx+256] + vmovdqu64 [rcx+256], zmm21 + vpxord zmm22, zmm22, [rdx+512] + vmovdqu64 [rcx+512], zmm22 + vpxord zmm23, zmm23, [rdx+768] + vmovdqu64 [rcx+768], zmm23 + vshufi32x4 zmm16, zmm1, zmm5, 68 + vshufi32x4 zmm17, zmm1, zmm5, 238 + vshufi32x4 zmm18, zmm9, zmm13, 68 + vshufi32x4 zmm19, zmm9, zmm13, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+64] + vmovdqu64 [rcx+64], zmm20 + vpxord zmm21, zmm21, [rdx+320] + vmovdqu64 [rcx+320], zmm21 + vpxord zmm22, zmm22, [rdx+576] + vmovdqu64 [rcx+576], zmm22 + vpxord zmm23, zmm23, [rdx+832] + vmovdqu64 [rcx+832], zmm23 + vshufi32x4 zmm16, zmm2, zmm6, 68 + vshufi32x4 zmm17, zmm2, zmm6, 238 + vshufi32x4 zmm18, zmm10, zmm14, 68 + vshufi32x4 zmm19, zmm10, zmm14, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+128] + vmovdqu64 [rcx+128], zmm20 + vpxord zmm21, zmm21, [rdx+384] + vmovdqu64 [rcx+384], zmm21 + vpxord zmm22, zmm22, [rdx+640] + vmovdqu64 [rcx+640], zmm22 + vpxord zmm23, zmm23, [rdx+896] + vmovdqu64 [rcx+896], zmm23 + vshufi32x4 zmm16, zmm3, zmm7, 68 + vshufi32x4 zmm17, zmm3, zmm7, 238 + vshufi32x4 zmm18, zmm11, zmm15, 68 + vshufi32x4 zmm19, zmm11, zmm15, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+192] + vmovdqu64 [rcx+192], zmm20 + vpxord zmm21, zmm21, [rdx+448] + vmovdqu64 [rcx+448], zmm21 + vpxord zmm22, zmm22, [rdx+704] + vmovdqu64 [rcx+704], zmm22 + vpxord zmm23, zmm23, [rdx+960] + vmovdqu64 [rcx+960], zmm23 + vmovdqa64 zmm12, [r11+768] + vpaddd zmm12, zmm12, [r8+320] + vmovdqa64 [r11+768], zmm12 + vmovdqa64 zmm0, [r11] + vmovdqa64 zmm1, [r11+64] + vmovdqa64 zmm2, [r11+128] + vmovdqa64 zmm3, [r11+192] + vmovdqa64 zmm4, [r11+256] + vmovdqa64 zmm5, [r11+320] + vmovdqa64 zmm6, [r11+384] + vmovdqa64 zmm7, [r11+448] + vmovdqa64 zmm8, [r11+512] + vmovdqa64 zmm9, [r11+576] + vmovdqa64 zmm10, [r11+640] + vmovdqa64 zmm11, [r11+704] + vmovdqa64 zmm12, [r11+768] + vmovdqa64 zmm13, [r11+832] + vmovdqa64 zmm14, [r11+896] + vmovdqa64 zmm15, [r11+960] + add rdx, 1024 + add rcx, 1024 + sub eax, 1024 + jnz L_cp512_start +L_cp512_epi: + vmovdqu64 zmm16, [rsi+752] + vmovdqu64 zmm17, [rsi+816] + vmovdqu64 zmm18, [rsi+880] + vpbroadcastq zmm19, QWORD PTR [rsi+720] + vpbroadcastq zmm20, QWORD PTR [rsi+728] + vpbroadcastq zmm21, QWORD PTR [rsi+736] + vpsllq zmm30, zmm20, 2 + vpsllq zmm22, zmm20, 4 + vpaddq zmm22, zmm22, zmm30 + vpsllq zmm30, zmm21, 2 + vpsllq zmm23, zmm21, 4 + vpaddq zmm23, zmm23, zmm30 + vmovdqu64 zmm27, [rcx+-1024] + vmovdqu64 zmm28, [rcx+-960] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vmovdqu64 zmm27, [rcx+-896] + vmovdqu64 zmm28, [rcx+-832] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vmovdqu64 zmm27, [rcx+-768] + vmovdqu64 zmm28, [rcx+-704] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vmovdqu64 zmm27, [rcx+-640] + vmovdqu64 zmm28, [rcx+-576] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vmovdqu64 zmm27, [rcx+-512] + vmovdqu64 zmm28, [rcx+-448] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vmovdqu64 zmm27, [rcx+-384] + vmovdqu64 zmm28, [rcx+-320] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vmovdqu64 zmm27, [rcx+-256] + vmovdqu64 zmm28, [rcx+-192] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vmovdqu64 zmm27, [rcx+-128] + vmovdqu64 zmm28, [rcx+-64] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vmovdqu64 zmm24, [rsi+224] + vmovdqu64 zmm25, [rsi+288] + vmovdqu64 zmm26, [rsi+624] + vmovdqu64 zmm27, [rsi+688] + vmovdqu64 zmm28, [r10] + vpermi2q zmm28, zmm26, zmm27 + vmovdqu64 zmm29, [r10] + vpermi2q zmm29, zmm24, zmm25 + vinserti64x4 zmm19, zmm28, ymm29, 1 + vmovdqu64 zmm28, [r10+64] + vpermi2q zmm28, zmm26, zmm27 + vmovdqu64 zmm29, [r10+64] + vpermi2q zmm29, zmm24, zmm25 + vinserti64x4 zmm20, zmm28, ymm29, 1 + vmovdqu64 zmm28, [r10+128] + vpermi2q zmm28, zmm26, zmm27 + vmovdqu64 zmm29, [r10+128] + vpermi2q zmm29, zmm24, zmm25 + vinserti64x4 zmm21, zmm28, ymm29, 1 + vpsllq zmm30, zmm20, 2 + vpsllq zmm22, zmm20, 4 + vpaddq zmm22, zmm22, zmm30 + vpsllq zmm30, zmm21, 2 + vpsllq zmm23, zmm21, 4 + vpaddq zmm23, zmm23, zmm30 + vpxorq zmm24, zmm24, zmm24 + vpxorq zmm25, zmm25, zmm25 + vpxorq zmm26, zmm26, zmm26 + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vshufi64x2 zmm24, zmm16, zmm16, 78 + vshufi64x2 zmm25, zmm17, zmm17, 78 + vshufi64x2 zmm26, zmm18, zmm18, 78 + vpaddq zmm16, zmm24, zmm16 + vpaddq zmm17, zmm25, zmm17 + vpaddq zmm18, zmm26, zmm18 + vpsrldq zmm24, zmm16, 8 + vpsrldq zmm25, zmm17, 8 + vpsrldq zmm26, zmm18, 8 + vpaddq zmm16, zmm24, zmm16 + vpaddq zmm17, zmm25, zmm17 + vpaddq zmm18, zmm26, zmm18 + vpermq zmm24, zmm16, 2 + vpermq zmm25, zmm17, 2 + vpermq zmm26, zmm18, 2 + vpaddq zmm16, zmm24, zmm16 + vpaddq zmm17, zmm25, zmm17 + vpaddq zmm18, zmm26, zmm18 + vmovq r12, xmm16 + vmovq r13, xmm17 + vmovq r14, xmm18 + mov r10, r13 + shr r10, 20 + mov r11, r14 + shr r11, 40 + mov r8, r12 + mov r12, r13 + shl r12, 44 + add r8, r12 + adc r10, 0 + mov r12, r14 + shl r12, 24 + add r10, r12 + adc r11, 0 + mov r9, r11 + and r11, 3 + shr r9, 2 + lea r9, QWORD PTR [r9+4*r9+0] + add r8, r9 + adc r10, 0 + adc r11, 0 + mov r12, QWORD PTR [rsi+24] + mov QWORD PTR [rsi+64], r12 + mov r12, QWORD PTR [rsi+32] + mov QWORD PTR [rsi+72], r12 + mov r12, QWORD PTR [rsi+40] + mov QWORD PTR [rsi+80], r12 + mov QWORD PTR [rsi+24], r8 + mov QWORD PTR [rsi+32], r10 + mov QWORD PTR [rsi+40], r11 + vmovd [rdi+48], xmm12 + vzeroupper + vmovdqu xmm6, OWORD PTR [rsp+1200] + vmovdqu xmm7, OWORD PTR [rsp+1216] + vmovdqu xmm8, OWORD PTR [rsp+1232] + vmovdqu xmm9, OWORD PTR [rsp+1248] + vmovdqu xmm10, OWORD PTR [rsp+1264] + vmovdqu xmm11, OWORD PTR [rsp+1280] + vmovdqu xmm12, OWORD PTR [rsp+1296] + vmovdqu xmm13, OWORD PTR [rsp+1312] + vmovdqu xmm14, OWORD PTR [rsp+1328] + vmovdqu xmm15, OWORD PTR [rsp+1344] + add rsp, 1360 + pop r14 + pop r13 + pop r12 + pop rsi + pop rdi + ret +chacha20_poly1305_ifma ENDP +_TEXT ENDS +_TEXT SEGMENT READONLY PARA +chacha20_poly1305_ifma_decrypt PROC + push rdi + push rsi + push r12 + push r13 + push r14 + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + mov rcx, r9 + mov rax, QWORD PTR [rsp+80] + sub rsp, 1360 + vmovdqu OWORD PTR [rsp+1200], xmm6 + vmovdqu OWORD PTR [rsp+1216], xmm7 + vmovdqu OWORD PTR [rsp+1232], xmm8 + vmovdqu OWORD PTR [rsp+1248], xmm9 + vmovdqu OWORD PTR [rsp+1264], xmm10 + vmovdqu OWORD PTR [rsp+1280], xmm11 + vmovdqu OWORD PTR [rsp+1296], xmm12 + vmovdqu OWORD PTR [rsp+1312], xmm13 + vmovdqu OWORD PTR [rsp+1328], xmm14 + vmovdqu OWORD PTR [rsp+1344], xmm15 + mov r8, QWORD PTR [ptr_L_cp512_pc] + mov r10, QWORD PTR [ptr_L_cp512_rx] + mov r9, QWORD PTR [ptr_L_cp512_add] + lea r11, QWORD PTR [rsp+32] + add r11, 63 + and r11, -64 + vpxorq zmm16, zmm16, zmm16 + vpxorq zmm17, zmm17, zmm17 + vpxorq zmm18, zmm18, zmm18 + vmovdqu64 [rsi+752], zmm16 + vmovdqu64 [rsi+816], zmm17 + vmovdqu64 [rsi+880], zmm18 + vpbroadcastd zmm0, DWORD PTR [rdi] + vpbroadcastd zmm1, DWORD PTR [rdi+4] + vpbroadcastd zmm2, DWORD PTR [rdi+8] + vpbroadcastd zmm3, DWORD PTR [rdi+12] + vpbroadcastd zmm4, DWORD PTR [rdi+16] + vpbroadcastd zmm5, DWORD PTR [rdi+20] + vpbroadcastd zmm6, DWORD PTR [rdi+24] + vpbroadcastd zmm7, DWORD PTR [rdi+28] + vpbroadcastd zmm8, DWORD PTR [rdi+32] + vpbroadcastd zmm9, DWORD PTR [rdi+36] + vpbroadcastd zmm10, DWORD PTR [rdi+40] + vpbroadcastd zmm11, DWORD PTR [rdi+44] + vpbroadcastd zmm12, DWORD PTR [rdi+48] + vpbroadcastd zmm13, DWORD PTR [rdi+52] + vpbroadcastd zmm14, DWORD PTR [rdi+56] + vpbroadcastd zmm15, DWORD PTR [rdi+60] + vpaddd zmm12, zmm12, [r9] + vmovdqa64 [r11], zmm0 + vmovdqa64 [r11+64], zmm1 + vmovdqa64 [r11+128], zmm2 + vmovdqa64 [r11+192], zmm3 + vmovdqa64 [r11+256], zmm4 + vmovdqa64 [r11+320], zmm5 + vmovdqa64 [r11+384], zmm6 + vmovdqa64 [r11+448], zmm7 + vmovdqa64 [r11+512], zmm8 + vmovdqa64 [r11+576], zmm9 + vmovdqa64 [r11+640], zmm10 + vmovdqa64 [r11+704], zmm11 + vmovdqa64 [r11+768], zmm12 + vmovdqa64 [r11+832], zmm13 + vmovdqa64 [r11+896], zmm14 + vmovdqa64 [r11+960], zmm15 +L_cp512_dstart: + vmovdqu64 zmm16, [rsi+752] + vmovdqu64 zmm17, [rsi+816] + vmovdqu64 zmm18, [rsi+880] + vpbroadcastq zmm19, QWORD PTR [rsi+720] + vpbroadcastq zmm20, QWORD PTR [rsi+728] + vpbroadcastq zmm21, QWORD PTR [rsi+736] + vpsllq zmm30, zmm20, 2 + vpsllq zmm22, zmm20, 4 + vpaddq zmm22, zmm22, zmm30 + vpsllq zmm30, zmm21, 2 + vpsllq zmm23, zmm21, 4 + vpaddq zmm23, zmm23, zmm30 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rdx] + vmovdqu64 zmm28, [rdx+64] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rdx+128] + vmovdqu64 zmm28, [rdx+192] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rdx+256] + vmovdqu64 zmm28, [rdx+320] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rdx+384] + vmovdqu64 zmm28, [rdx+448] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rdx+512] + vmovdqu64 zmm28, [rdx+576] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rdx+640] + vmovdqu64 zmm28, [rdx+704] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rdx+768] + vmovdqu64 zmm28, [rdx+832] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vmovdqu64 zmm27, [rdx+896] + vmovdqu64 zmm28, [rdx+960] + vmovdqu64 zmm29, [r8+192] + vpermi2q zmm29, zmm27, zmm28 + vmovdqu64 zmm30, [r8+256] + vpermi2q zmm30, zmm27, zmm28 + vpandq zmm24, zmm29, [r8] + vpsrlq zmm27, zmm29, 44 + vpandq zmm28, zmm30, [r8+64] + vpsllq zmm28, zmm28, 20 + vporq zmm25, zmm28, zmm27 + vpsrlq zmm26, zmm30, 24 + vporq zmm26, zmm26, [r8+128] + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vprold zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 12 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vprold zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprold zmm4, zmm4, 7 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 16 + vprold zmm12, zmm12, 16 + vprold zmm13, zmm13, 16 + vprold zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 12 + vprold zmm6, zmm6, 12 + vprold zmm7, zmm7, 12 + vprold zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprold zmm15, zmm15, 8 + vprold zmm12, zmm12, 8 + vprold zmm13, zmm13, 8 + vprold zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprold zmm5, zmm5, 7 + vprold zmm6, zmm6, 7 + vprold zmm7, zmm7, 7 + vprold zmm4, zmm4, 7 + vpaddd zmm0, zmm0, [r11] + vpaddd zmm1, zmm1, [r11+64] + vpaddd zmm2, zmm2, [r11+128] + vpaddd zmm3, zmm3, [r11+192] + vpaddd zmm4, zmm4, [r11+256] + vpaddd zmm5, zmm5, [r11+320] + vpaddd zmm6, zmm6, [r11+384] + vpaddd zmm7, zmm7, [r11+448] + vpaddd zmm8, zmm8, [r11+512] + vpaddd zmm9, zmm9, [r11+576] + vpaddd zmm10, zmm10, [r11+640] + vpaddd zmm11, zmm11, [r11+704] + vpaddd zmm12, zmm12, [r11+768] + vpaddd zmm13, zmm13, [r11+832] + vpaddd zmm14, zmm14, [r11+896] + vpaddd zmm15, zmm15, [r11+960] + vmovdqu64 [rsi+752], zmm16 + vmovdqu64 [rsi+816], zmm17 + vmovdqu64 [rsi+880], zmm18 + vpunpckldq zmm16, zmm0, zmm1 + vpunpckhdq zmm17, zmm0, zmm1 + vpunpckldq zmm18, zmm2, zmm3 + vpunpckhdq zmm19, zmm2, zmm3 + vpunpckldq zmm20, zmm4, zmm5 + vpunpckhdq zmm21, zmm4, zmm5 + vpunpckldq zmm22, zmm6, zmm7 + vpunpckhdq zmm23, zmm6, zmm7 + vpunpckldq zmm24, zmm8, zmm9 + vpunpckhdq zmm25, zmm8, zmm9 + vpunpckldq zmm26, zmm10, zmm11 + vpunpckhdq zmm27, zmm10, zmm11 + vpunpckldq zmm28, zmm12, zmm13 + vpunpckhdq zmm29, zmm12, zmm13 + vpunpckldq zmm30, zmm14, zmm15 + vpunpckhdq zmm31, zmm14, zmm15 + vpunpcklqdq zmm0, zmm16, zmm18 + vpunpckhqdq zmm1, zmm16, zmm18 + vpunpcklqdq zmm2, zmm17, zmm19 + vpunpckhqdq zmm3, zmm17, zmm19 + vpunpcklqdq zmm4, zmm20, zmm22 + vpunpckhqdq zmm5, zmm20, zmm22 + vpunpcklqdq zmm6, zmm21, zmm23 + vpunpckhqdq zmm7, zmm21, zmm23 + vpunpcklqdq zmm8, zmm24, zmm26 + vpunpckhqdq zmm9, zmm24, zmm26 + vpunpcklqdq zmm10, zmm25, zmm27 + vpunpckhqdq zmm11, zmm25, zmm27 + vpunpcklqdq zmm12, zmm28, zmm30 + vpunpckhqdq zmm13, zmm28, zmm30 + vpunpcklqdq zmm14, zmm29, zmm31 + vpunpckhqdq zmm15, zmm29, zmm31 + vshufi32x4 zmm16, zmm0, zmm4, 68 + vshufi32x4 zmm17, zmm0, zmm4, 238 + vshufi32x4 zmm18, zmm8, zmm12, 68 + vshufi32x4 zmm19, zmm8, zmm12, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx] + vmovdqu64 [rcx], zmm20 + vpxord zmm21, zmm21, [rdx+256] + vmovdqu64 [rcx+256], zmm21 + vpxord zmm22, zmm22, [rdx+512] + vmovdqu64 [rcx+512], zmm22 + vpxord zmm23, zmm23, [rdx+768] + vmovdqu64 [rcx+768], zmm23 + vshufi32x4 zmm16, zmm1, zmm5, 68 + vshufi32x4 zmm17, zmm1, zmm5, 238 + vshufi32x4 zmm18, zmm9, zmm13, 68 + vshufi32x4 zmm19, zmm9, zmm13, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+64] + vmovdqu64 [rcx+64], zmm20 + vpxord zmm21, zmm21, [rdx+320] + vmovdqu64 [rcx+320], zmm21 + vpxord zmm22, zmm22, [rdx+576] + vmovdqu64 [rcx+576], zmm22 + vpxord zmm23, zmm23, [rdx+832] + vmovdqu64 [rcx+832], zmm23 + vshufi32x4 zmm16, zmm2, zmm6, 68 + vshufi32x4 zmm17, zmm2, zmm6, 238 + vshufi32x4 zmm18, zmm10, zmm14, 68 + vshufi32x4 zmm19, zmm10, zmm14, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+128] + vmovdqu64 [rcx+128], zmm20 + vpxord zmm21, zmm21, [rdx+384] + vmovdqu64 [rcx+384], zmm21 + vpxord zmm22, zmm22, [rdx+640] + vmovdqu64 [rcx+640], zmm22 + vpxord zmm23, zmm23, [rdx+896] + vmovdqu64 [rcx+896], zmm23 + vshufi32x4 zmm16, zmm3, zmm7, 68 + vshufi32x4 zmm17, zmm3, zmm7, 238 + vshufi32x4 zmm18, zmm11, zmm15, 68 + vshufi32x4 zmm19, zmm11, zmm15, 238 + vshufi32x4 zmm20, zmm16, zmm18, 136 + vshufi32x4 zmm21, zmm16, zmm18, 221 + vshufi32x4 zmm22, zmm17, zmm19, 136 + vshufi32x4 zmm23, zmm17, zmm19, 221 + vpxord zmm20, zmm20, [rdx+192] + vmovdqu64 [rcx+192], zmm20 + vpxord zmm21, zmm21, [rdx+448] + vmovdqu64 [rcx+448], zmm21 + vpxord zmm22, zmm22, [rdx+704] + vmovdqu64 [rcx+704], zmm22 + vpxord zmm23, zmm23, [rdx+960] + vmovdqu64 [rcx+960], zmm23 + vmovdqa64 zmm12, [r11+768] + vpaddd zmm12, zmm12, [r8+320] + vmovdqa64 [r11+768], zmm12 + vmovdqa64 zmm0, [r11] + vmovdqa64 zmm1, [r11+64] + vmovdqa64 zmm2, [r11+128] + vmovdqa64 zmm3, [r11+192] + vmovdqa64 zmm4, [r11+256] + vmovdqa64 zmm5, [r11+320] + vmovdqa64 zmm6, [r11+384] + vmovdqa64 zmm7, [r11+448] + vmovdqa64 zmm8, [r11+512] + vmovdqa64 zmm9, [r11+576] + vmovdqa64 zmm10, [r11+640] + vmovdqa64 zmm11, [r11+704] + vmovdqa64 zmm12, [r11+768] + vmovdqa64 zmm13, [r11+832] + vmovdqa64 zmm14, [r11+896] + vmovdqa64 zmm15, [r11+960] + add rdx, 1024 + add rcx, 1024 + sub eax, 1024 + jnz L_cp512_dstart + vmovdqu64 zmm16, [rsi+752] + vmovdqu64 zmm17, [rsi+816] + vmovdqu64 zmm18, [rsi+880] + vmovdqu64 zmm24, [rsi+224] + vmovdqu64 zmm25, [rsi+288] + vmovdqu64 zmm26, [rsi+624] + vmovdqu64 zmm27, [rsi+688] + vmovdqu64 zmm28, [r10] + vpermi2q zmm28, zmm26, zmm27 + vmovdqu64 zmm29, [r10] + vpermi2q zmm29, zmm24, zmm25 + vinserti64x4 zmm19, zmm28, ymm29, 1 + vmovdqu64 zmm28, [r10+64] + vpermi2q zmm28, zmm26, zmm27 + vmovdqu64 zmm29, [r10+64] + vpermi2q zmm29, zmm24, zmm25 + vinserti64x4 zmm20, zmm28, ymm29, 1 + vmovdqu64 zmm28, [r10+128] + vpermi2q zmm28, zmm26, zmm27 + vmovdqu64 zmm29, [r10+128] + vpermi2q zmm29, zmm24, zmm25 + vinserti64x4 zmm21, zmm28, ymm29, 1 + vpsllq zmm30, zmm20, 2 + vpsllq zmm22, zmm20, 4 + vpaddq zmm22, zmm22, zmm30 + vpsllq zmm30, zmm21, 2 + vpsllq zmm23, zmm21, 4 + vpaddq zmm23, zmm23, zmm30 + vpxorq zmm24, zmm24, zmm24 + vpxorq zmm25, zmm25, zmm25 + vpxorq zmm26, zmm26, zmm26 + vpxorq zmm27, zmm27, zmm27 + vpxorq zmm28, zmm28, zmm28 + vpxorq zmm29, zmm29, zmm29 + vpmadd52luq zmm24, zmm16, zmm19 + vpmadd52luq zmm24, zmm17, zmm23 + vpmadd52luq zmm24, zmm18, zmm22 + vpmadd52huq zmm27, zmm16, zmm19 + vpmadd52huq zmm27, zmm17, zmm23 + vpmadd52huq zmm27, zmm18, zmm22 + vpmadd52luq zmm25, zmm16, zmm20 + vpmadd52luq zmm25, zmm17, zmm19 + vpmadd52luq zmm25, zmm18, zmm23 + vpmadd52huq zmm28, zmm16, zmm20 + vpmadd52huq zmm28, zmm17, zmm19 + vpmadd52huq zmm28, zmm18, zmm23 + vpmadd52luq zmm26, zmm16, zmm21 + vpmadd52luq zmm26, zmm17, zmm20 + vpmadd52luq zmm26, zmm18, zmm19 + vpmadd52huq zmm29, zmm16, zmm21 + vpmadd52huq zmm29, zmm17, zmm20 + vpmadd52huq zmm29, zmm18, zmm19 + vpsllq zmm30, zmm27, 8 + vpaddq zmm25, zmm30, zmm25 + vpsllq zmm30, zmm28, 8 + vpaddq zmm26, zmm30, zmm26 + vpsllq zmm31, zmm29, 8 + vpsllq zmm30, zmm31, 2 + vpsllq zmm31, zmm31, 4 + vpaddq zmm31, zmm31, zmm30 + vpaddq zmm24, zmm31, zmm24 + vpsrlq zmm30, zmm24, 44 + vpandq zmm16, zmm24, [r8] + vpaddq zmm25, zmm30, zmm25 + vpsrlq zmm30, zmm25, 44 + vpandq zmm17, zmm25, [r8] + vpaddq zmm26, zmm30, zmm26 + vpsrlq zmm30, zmm26, 44 + vpandq zmm18, zmm26, [r8] + vpsllq zmm31, zmm30, 2 + vpsllq zmm30, zmm30, 4 + vpaddq zmm30, zmm30, zmm31 + vpaddq zmm16, zmm30, zmm16 + vshufi64x2 zmm24, zmm16, zmm16, 78 + vshufi64x2 zmm25, zmm17, zmm17, 78 + vshufi64x2 zmm26, zmm18, zmm18, 78 + vpaddq zmm16, zmm24, zmm16 + vpaddq zmm17, zmm25, zmm17 + vpaddq zmm18, zmm26, zmm18 + vpsrldq zmm24, zmm16, 8 + vpsrldq zmm25, zmm17, 8 + vpsrldq zmm26, zmm18, 8 + vpaddq zmm16, zmm24, zmm16 + vpaddq zmm17, zmm25, zmm17 + vpaddq zmm18, zmm26, zmm18 + vpermq zmm24, zmm16, 2 + vpermq zmm25, zmm17, 2 + vpermq zmm26, zmm18, 2 + vpaddq zmm16, zmm24, zmm16 + vpaddq zmm17, zmm25, zmm17 + vpaddq zmm18, zmm26, zmm18 + vmovq r12, xmm16 + vmovq r13, xmm17 + vmovq r14, xmm18 + mov r10, r13 + shr r10, 20 + mov r11, r14 + shr r11, 40 + mov r8, r12 + mov r12, r13 + shl r12, 44 + add r8, r12 + adc r10, 0 + mov r12, r14 + shl r12, 24 + add r10, r12 + adc r11, 0 + mov r9, r11 + and r11, 3 + shr r9, 2 + lea r9, QWORD PTR [r9+4*r9+0] + add r8, r9 + adc r10, 0 + adc r11, 0 + mov r12, QWORD PTR [rsi+24] + mov QWORD PTR [rsi+64], r12 + mov r12, QWORD PTR [rsi+32] + mov QWORD PTR [rsi+72], r12 + mov r12, QWORD PTR [rsi+40] + mov QWORD PTR [rsi+80], r12 + mov QWORD PTR [rsi+24], r8 + mov QWORD PTR [rsi+32], r10 + mov QWORD PTR [rsi+40], r11 + vmovd [rdi+48], xmm12 + vzeroupper + vmovdqu xmm6, OWORD PTR [rsp+1200] + vmovdqu xmm7, OWORD PTR [rsp+1216] + vmovdqu xmm8, OWORD PTR [rsp+1232] + vmovdqu xmm9, OWORD PTR [rsp+1248] + vmovdqu xmm10, OWORD PTR [rsp+1264] + vmovdqu xmm11, OWORD PTR [rsp+1280] + vmovdqu xmm12, OWORD PTR [rsp+1296] + vmovdqu xmm13, OWORD PTR [rsp+1312] + vmovdqu xmm14, OWORD PTR [rsp+1328] + vmovdqu xmm15, OWORD PTR [rsp+1344] + add rsp, 1360 + pop r14 + pop r13 + pop r12 + pop rsi + pop rdi + ret +chacha20_poly1305_ifma_decrypt ENDP +_TEXT ENDS +ENDIF +IFDEF HAVE_INTEL_AVX2 +_DATA SEGMENT +ALIGN 16 +L_chacha20_poly1305_small_enc_rotl8 QWORD 0605040702010003h, 0e0d0c0f0a09080bh + QWORD 0605040702010003h, 0e0d0c0f0a09080bh +ptr_L_chacha20_poly1305_small_enc_rotl8 QWORD L_chacha20_poly1305_small_enc_rotl8 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_poly1305_small_enc_rotl16 QWORD 0504070601000302h, 0d0c0f0e09080b0ah + QWORD 0504070601000302h, 0d0c0f0e09080b0ah +ptr_L_chacha20_poly1305_small_enc_rotl16 QWORD L_chacha20_poly1305_small_enc_rotl16 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_poly1305_small_enc_ymm_inc QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000001h, 0000000000000000h +ptr_L_chacha20_poly1305_small_enc_ymm_inc QWORD L_chacha20_poly1305_small_enc_ymm_inc +_DATA ENDS +_TEXT SEGMENT READONLY PARA +chacha20_poly1305_small_enc PROC + push r12 + push r13 + push r14 + push r15 + push rdi + push rsi + push rbx + push rbp + mov r10, QWORD PTR [rsp+104] + mov r11, QWORD PTR [rsp+112] + sub rsp, 352 + vmovdqu OWORD PTR [rsp+192], xmm6 + vmovdqu OWORD PTR [rsp+208], xmm7 + vmovdqu OWORD PTR [rsp+224], xmm8 + vmovdqu OWORD PTR [rsp+240], xmm9 + vmovdqu OWORD PTR [rsp+256], xmm10 + vmovdqu OWORD PTR [rsp+272], xmm11 + vmovdqu OWORD PTR [rsp+288], xmm12 + vmovdqu OWORD PTR [rsp+304], xmm13 + vmovdqu OWORD PTR [rsp+320], xmm14 + vmovdqu OWORD PTR [rsp+336], xmm15 + mov eax, DWORD PTR [rsp+280] + mov QWORD PTR [rsp+128], rax + mov rax, QWORD PTR [rsp+288] + mov QWORD PTR [rsp+152], rax + mov QWORD PTR [rsp+136], r9 + mov rax, r10 + mov QWORD PTR [rsp+144], rax + mov r13, QWORD PTR [ptr_L_chacha20_poly1305_small_enc_rotl8] + mov r14, QWORD PTR [ptr_L_chacha20_poly1305_small_enc_rotl16] + mov r15, QWORD PTR [ptr_L_chacha20_poly1305_small_enc_ymm_inc] + vbroadcasti128 ymm0, OWORD PTR [rcx] + vbroadcasti128 ymm1, OWORD PTR [rcx+16] + vbroadcasti128 ymm2, OWORD PTR [rcx+32] + vbroadcasti128 ymm3, OWORD PTR [rcx+48] + vpaddd ymm3, ymm3, YMMWORD PTR [r15] + vmovdqa ymm10, ymm0 + vmovdqa ymm11, ymm1 + vmovdqa ymm12, ymm2 + vmovdqa ymm13, ymm3 + mov r9b, 10 +L_c20p1305_small_enc_crypt2_start: + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, YMMWORD PTR [r14] + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 20 + vpslld ymm1, ymm1, 12 + vpxor ymm1, ymm1, ymm8 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, YMMWORD PTR [r13] + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 25 + vpslld ymm1, ymm1, 7 + vpxor ymm1, ymm1, ymm8 + vpshufd ymm1, ymm1, 57 + vpshufd ymm2, ymm2, 78 + vpshufd ymm3, ymm3, 147 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, YMMWORD PTR [r14] + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 20 + vpslld ymm1, ymm1, 12 + vpxor ymm1, ymm1, ymm8 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, YMMWORD PTR [r13] + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 25 + vpslld ymm1, ymm1, 7 + vpxor ymm1, ymm1, ymm8 + vpshufd ymm1, ymm1, 147 + vpshufd ymm2, ymm2, 78 + vpshufd ymm3, ymm3, 57 + dec r9b + jnz L_c20p1305_small_enc_crypt2_start + vpaddd ymm0, ymm0, ymm10 + vpaddd ymm1, ymm1, ymm11 + vpaddd ymm2, ymm2, ymm12 + vpaddd ymm3, ymm3, ymm13 + vextracti128 xmm4, ymm0, 1 + vextracti128 xmm5, ymm1, 1 + vextracti128 xmm6, ymm2, 1 + vextracti128 xmm7, ymm3, 1 + vmovdqu OWORD PTR [rsp], xmm0 + vmovdqu OWORD PTR [rsp+16], xmm1 + vmovdqu OWORD PTR [rsp+32], xmm4 + vmovdqu OWORD PTR [rsp+48], xmm5 + vmovdqu OWORD PTR [rsp+64], xmm6 + vmovdqu OWORD PTR [rsp+80], xmm7 + mov r9, QWORD PTR [rsp+136] + mov rbp, QWORD PTR [rsp+144] + lea rbx, QWORD PTR [rsp+32] +L_chacha20_poly1305_small_enc_x16: + cmp rbp, 16 + jl L_chacha20_poly1305_small_enc_xtail + vmovdqu xmm8, OWORD PTR [r8] + vpxor xmm8, xmm8, [rbx] + vmovdqu OWORD PTR [r9], xmm8 + add r8, 16 + add r9, 16 + add rbx, 16 + sub rbp, 16 + jmp L_chacha20_poly1305_small_enc_x16 +L_chacha20_poly1305_small_enc_xtail: + vzeroupper + test rbp, rbp + jz L_chacha20_poly1305_small_enc_xdone + xor rcx, rcx +L_chacha20_poly1305_small_enc_xbyte: + cmp rcx, rbp + jge L_chacha20_poly1305_small_enc_xdone + movzx eax, BYTE PTR [r8+rcx] + xor al, BYTE PTR [rbx+rcx] + mov BYTE PTR [r9+rcx], al + inc rcx + jmp L_chacha20_poly1305_small_enc_xbyte +L_chacha20_poly1305_small_enc_xdone: + mov r12, rdx + mov rax, 1152921487695413247 + mov r8, 1152921487695413244 + mov r13, QWORD PTR [rsp] + and r13, rax + mov r14, QWORD PTR [rsp+8] + and r14, r8 + mov rax, QWORD PTR [rsp+16] + mov QWORD PTR [r12+48], rax + mov rax, QWORD PTR [rsp+24] + mov QWORD PTR [r12+56], rax + xor rax, rax + mov QWORD PTR [r12+352], rax + mov QWORD PTR [r12+408], rax + mov QWORD PTR [r12+360], r13 + mov QWORD PTR [r12+416], r14 + mov r9, r13 + mov rdx, r14 + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+368], r9 + mov QWORD PTR [r12+424], rdx + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+376], r9 + mov QWORD PTR [r12+432], rdx + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+384], r9 + mov QWORD PTR [r12+440], rdx + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+392], r9 + mov QWORD PTR [r12+448], rdx + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+400], r9 + mov QWORD PTR [r12+456], rdx + xor r15, r15 + xor rdi, rdi + xor rsi, rsi + mov rbx, r11 + mov rbp, QWORD PTR [rsp+128] +L_c20p1305_small_aad_full: + cmp rbp, 16 + jl L_c20p1305_small_aad_part + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 + add rbx, 16 + sub rbp, 16 + jmp L_c20p1305_small_aad_full +L_c20p1305_small_aad_part: + test rbp, rbp + jz L_c20p1305_small_aad_done + xor rax, rax + mov QWORD PTR [rsp+96], rax + mov QWORD PTR [rsp+104], rax + lea r11, QWORD PTR [rsp+96] + cmp rbp, 8 + jl L_c20p1305_small_aad_c4 + mov rax, QWORD PTR [rbx] + mov QWORD PTR [r11], rax + add rbx, 8 + add r11, 8 + sub rbp, 8 +L_c20p1305_small_aad_c4: + cmp rbp, 4 + jl L_c20p1305_small_aad_cby + mov eax, DWORD PTR [rbx] + mov DWORD PTR [r11], eax + add rbx, 4 + add r11, 4 + sub rbp, 4 +L_c20p1305_small_aad_cby: + test rbp, rbp + jz L_c20p1305_small_aad_cpyd +L_c20p1305_small_aad_cbyl: + movzx eax, BYTE PTR [rbx] + mov BYTE PTR [r11], al + add rbx, 1 + add r11, 1 + sub rbp, 1 + jnz L_c20p1305_small_aad_cbyl +L_c20p1305_small_aad_cpyd: + lea rbx, QWORD PTR [rsp+96] + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 +L_c20p1305_small_aad_done: + mov rbx, QWORD PTR [rsp+136] + mov rbp, QWORD PTR [rsp+144] +L_c20p1305_small_ct_full: + cmp rbp, 16 + jl L_c20p1305_small_ct_part + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 + add rbx, 16 + sub rbp, 16 + jmp L_c20p1305_small_ct_full +L_c20p1305_small_ct_part: + test rbp, rbp + jz L_c20p1305_small_ct_done + xor rax, rax + mov QWORD PTR [rsp+96], rax + mov QWORD PTR [rsp+104], rax + lea r11, QWORD PTR [rsp+96] + cmp rbp, 8 + jl L_c20p1305_small_ct_c4 + mov rax, QWORD PTR [rbx] + mov QWORD PTR [r11], rax + add rbx, 8 + add r11, 8 + sub rbp, 8 +L_c20p1305_small_ct_c4: + cmp rbp, 4 + jl L_c20p1305_small_ct_cby + mov eax, DWORD PTR [rbx] + mov DWORD PTR [r11], eax + add rbx, 4 + add r11, 4 + sub rbp, 4 +L_c20p1305_small_ct_cby: + test rbp, rbp + jz L_c20p1305_small_ct_cpyd +L_c20p1305_small_ct_cbyl: + movzx eax, BYTE PTR [rbx] + mov BYTE PTR [r11], al + add rbx, 1 + add r11, 1 + sub rbp, 1 + jnz L_c20p1305_small_ct_cbyl +L_c20p1305_small_ct_cpyd: + lea rbx, QWORD PTR [rsp+96] + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 +L_c20p1305_small_ct_done: + mov rax, QWORD PTR [rsp+128] + mov QWORD PTR [rsp+112], rax + mov rax, QWORD PTR [rsp+144] + mov QWORD PTR [rsp+120], rax + lea rbx, QWORD PTR [rsp+112] + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 + mov rbx, QWORD PTR [rsp+152] + mov r9, rsi + and rsi, 3 + shr r9, 2 + lea r9, QWORD PTR [r9+4*r9+0] + add r15, r9 + adc rdi, 0 + adc rsi, 0 + mov r9, r15 + mov rdx, rdi + mov rcx, rsi + add r9, 5 + adc rdx, 0 + adc rcx, 0 + cmp rcx, 4 + cmove r15, r9 + cmove rdi, rdx + add r15, QWORD PTR [r12+48] + adc rdi, QWORD PTR [r12+56] + mov QWORD PTR [rbx], r15 + mov QWORD PTR [rbx+8], rdi + vpxor xmm0, xmm0, xmm0 + vmovdqu OWORD PTR [rsp], xmm0 + vmovdqu OWORD PTR [rsp+16], xmm0 + vmovdqu OWORD PTR [rsp+32], xmm0 + vmovdqu OWORD PTR [rsp+48], xmm0 + vmovdqu OWORD PTR [rsp+64], xmm0 + vmovdqu OWORD PTR [rsp+80], xmm0 + vmovdqu xmm6, OWORD PTR [rsp+192] + vmovdqu xmm7, OWORD PTR [rsp+208] + vmovdqu xmm8, OWORD PTR [rsp+224] + vmovdqu xmm9, OWORD PTR [rsp+240] + vmovdqu xmm10, OWORD PTR [rsp+256] + vmovdqu xmm11, OWORD PTR [rsp+272] + vmovdqu xmm12, OWORD PTR [rsp+288] + vmovdqu xmm13, OWORD PTR [rsp+304] + vmovdqu xmm14, OWORD PTR [rsp+320] + vmovdqu xmm15, OWORD PTR [rsp+336] + add rsp, 352 + pop rbp + pop rbx + pop rsi + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + ret +chacha20_poly1305_small_enc ENDP +_TEXT ENDS +_TEXT SEGMENT READONLY PARA +chacha20_poly1305_small_dec PROC + push r12 + push r13 + push r14 + push r15 + push rdi + push rsi + push rbx + push rbp + mov r10, QWORD PTR [rsp+104] + mov r11, QWORD PTR [rsp+112] + sub rsp, 328 + vmovdqu OWORD PTR [rsp+168], xmm6 + vmovdqu OWORD PTR [rsp+184], xmm7 + vmovdqu OWORD PTR [rsp+200], xmm8 + vmovdqu OWORD PTR [rsp+216], xmm9 + vmovdqu OWORD PTR [rsp+232], xmm10 + vmovdqu OWORD PTR [rsp+248], xmm11 + vmovdqu OWORD PTR [rsp+264], xmm12 + vmovdqu OWORD PTR [rsp+280], xmm13 + vmovdqu OWORD PTR [rsp+296], xmm14 + vmovdqu OWORD PTR [rsp+312], xmm15 + mov eax, DWORD PTR [rsp+256] + mov QWORD PTR [rsp+128], rax + mov rax, QWORD PTR [rsp+264] + mov QWORD PTR [rsp+144], rax + mov rax, r10 + mov QWORD PTR [rsp+136], rax + mov rax, r8 + mov QWORD PTR [rsp+152], rax + mov rax, r9 + mov QWORD PTR [rsp+160], rax + mov r13, QWORD PTR [ptr_L_chacha20_poly1305_small_enc_rotl8] + mov r14, QWORD PTR [ptr_L_chacha20_poly1305_small_enc_rotl16] + mov r15, QWORD PTR [ptr_L_chacha20_poly1305_small_enc_ymm_inc] + vbroadcasti128 ymm0, OWORD PTR [rcx] + vbroadcasti128 ymm1, OWORD PTR [rcx+16] + vbroadcasti128 ymm2, OWORD PTR [rcx+32] + vbroadcasti128 ymm3, OWORD PTR [rcx+48] + vpaddd ymm3, ymm3, YMMWORD PTR [r15] + vmovdqa ymm10, ymm0 + vmovdqa ymm11, ymm1 + vmovdqa ymm12, ymm2 + vmovdqa ymm13, ymm3 + mov r9b, 10 +L_c20p1305_small_dec_crypt2_start: + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, YMMWORD PTR [r14] + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 20 + vpslld ymm1, ymm1, 12 + vpxor ymm1, ymm1, ymm8 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, YMMWORD PTR [r13] + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 25 + vpslld ymm1, ymm1, 7 + vpxor ymm1, ymm1, ymm8 + vpshufd ymm1, ymm1, 57 + vpshufd ymm2, ymm2, 78 + vpshufd ymm3, ymm3, 147 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, YMMWORD PTR [r14] + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 20 + vpslld ymm1, ymm1, 12 + vpxor ymm1, ymm1, ymm8 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, YMMWORD PTR [r13] + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 25 + vpslld ymm1, ymm1, 7 + vpxor ymm1, ymm1, ymm8 + vpshufd ymm1, ymm1, 147 + vpshufd ymm2, ymm2, 78 + vpshufd ymm3, ymm3, 57 + dec r9b + jnz L_c20p1305_small_dec_crypt2_start + vpaddd ymm0, ymm0, ymm10 + vpaddd ymm1, ymm1, ymm11 + vpaddd ymm2, ymm2, ymm12 + vpaddd ymm3, ymm3, ymm13 + vextracti128 xmm4, ymm0, 1 + vextracti128 xmm5, ymm1, 1 + vextracti128 xmm6, ymm2, 1 + vextracti128 xmm7, ymm3, 1 + mov r12, rdx + vmovdqu OWORD PTR [rsp], xmm0 + vmovdqu OWORD PTR [rsp+16], xmm1 + vmovdqu OWORD PTR [rsp+32], xmm4 + vmovdqu OWORD PTR [rsp+48], xmm5 + vmovdqu OWORD PTR [rsp+64], xmm6 + vmovdqu OWORD PTR [rsp+80], xmm7 + mov rax, 1152921487695413247 + mov r8, 1152921487695413244 + mov r13, QWORD PTR [rsp] + and r13, rax + mov r14, QWORD PTR [rsp+8] + and r14, r8 + mov rax, QWORD PTR [rsp+16] + mov QWORD PTR [r12+48], rax + mov rax, QWORD PTR [rsp+24] + mov QWORD PTR [r12+56], rax + xor rax, rax + mov QWORD PTR [r12+352], rax + mov QWORD PTR [r12+408], rax + mov QWORD PTR [r12+360], r13 + mov QWORD PTR [r12+416], r14 + mov r9, r13 + mov rdx, r14 + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+368], r9 + mov QWORD PTR [r12+424], rdx + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+376], r9 + mov QWORD PTR [r12+432], rdx + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+384], r9 + mov QWORD PTR [r12+440], rdx + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+392], r9 + mov QWORD PTR [r12+448], rdx + add r9, r13 + add rdx, r14 + mov QWORD PTR [r12+400], r9 + mov QWORD PTR [r12+456], rdx + xor r15, r15 + xor rdi, rdi + xor rsi, rsi + mov rbx, r11 + mov rbp, QWORD PTR [rsp+128] +L_c20p1305_small_dec_aad_full: + cmp rbp, 16 + jl L_c20p1305_small_dec_aad_part + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 + add rbx, 16 + sub rbp, 16 + jmp L_c20p1305_small_dec_aad_full +L_c20p1305_small_dec_aad_part: + test rbp, rbp + jz L_c20p1305_small_dec_aad_done + xor rax, rax + mov QWORD PTR [rsp+96], rax + mov QWORD PTR [rsp+104], rax + lea r11, QWORD PTR [rsp+96] + cmp rbp, 8 + jl L_c20p1305_small_dec_aad_c4 + mov rax, QWORD PTR [rbx] + mov QWORD PTR [r11], rax + add rbx, 8 + add r11, 8 + sub rbp, 8 +L_c20p1305_small_dec_aad_c4: + cmp rbp, 4 + jl L_c20p1305_small_dec_aad_cby + mov eax, DWORD PTR [rbx] + mov DWORD PTR [r11], eax + add rbx, 4 + add r11, 4 + sub rbp, 4 +L_c20p1305_small_dec_aad_cby: + test rbp, rbp + jz L_c20p1305_small_dec_aad_cpyd +L_c20p1305_small_dec_aad_cbyl: + movzx eax, BYTE PTR [rbx] + mov BYTE PTR [r11], al + add rbx, 1 + add r11, 1 + sub rbp, 1 + jnz L_c20p1305_small_dec_aad_cbyl +L_c20p1305_small_dec_aad_cpyd: + lea rbx, QWORD PTR [rsp+96] + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 +L_c20p1305_small_dec_aad_done: + mov rbx, QWORD PTR [rsp+152] + mov rbp, QWORD PTR [rsp+136] +L_c20p1305_small_dec_ct_full: + cmp rbp, 16 + jl L_c20p1305_small_dec_ct_part + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 + add rbx, 16 + sub rbp, 16 + jmp L_c20p1305_small_dec_ct_full +L_c20p1305_small_dec_ct_part: + test rbp, rbp + jz L_c20p1305_small_dec_ct_done + xor rax, rax + mov QWORD PTR [rsp+96], rax + mov QWORD PTR [rsp+104], rax + lea r11, QWORD PTR [rsp+96] + cmp rbp, 8 + jl L_c20p1305_small_dec_ct_c4 + mov rax, QWORD PTR [rbx] + mov QWORD PTR [r11], rax + add rbx, 8 + add r11, 8 + sub rbp, 8 +L_c20p1305_small_dec_ct_c4: + cmp rbp, 4 + jl L_c20p1305_small_dec_ct_cby + mov eax, DWORD PTR [rbx] + mov DWORD PTR [r11], eax + add rbx, 4 + add r11, 4 + sub rbp, 4 +L_c20p1305_small_dec_ct_cby: + test rbp, rbp + jz L_c20p1305_small_dec_ct_cpyd +L_c20p1305_small_dec_ct_cbyl: + movzx eax, BYTE PTR [rbx] + mov BYTE PTR [r11], al + add rbx, 1 + add r11, 1 + sub rbp, 1 + jnz L_c20p1305_small_dec_ct_cbyl +L_c20p1305_small_dec_ct_cpyd: + lea rbx, QWORD PTR [rsp+96] + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 +L_c20p1305_small_dec_ct_done: + mov rax, QWORD PTR [rsp+128] + mov QWORD PTR [rsp+112], rax + mov rax, QWORD PTR [rsp+136] + mov QWORD PTR [rsp+120], rax + lea rbx, QWORD PTR [rsp+112] + mov r9, QWORD PTR [rbx] + mov rdx, QWORD PTR [rbx+8] + add r15, r9 + adc rdi, rdx + mov rax, r14 + adc rsi, 1 + mul r15 + mov rdx, rax + mov rcx, r8 + mov rax, r13 + mul rdi + add rdx, rax + mov rax, r13 + adc rcx, r8 + mul r15 + mov r9, rax + mov r11, r8 + mov rax, r14 + mul rdi + add rcx, QWORD PTR [r12+8*rsi+352] + mov r10, r8 + add rdx, r11 + adc rcx, rax + adc r10, QWORD PTR [r12+8*rsi+408] + mov rsi, rcx + and rcx, -4 + and rsi, 3 + add r9, rcx + mov r15, rcx + adc rdx, r10 + adc rsi, 0 + shrd r15, r10, 2 + shr r10, 2 + add r15, r9 + adc rdx, r10 + mov rdi, rdx + adc rsi, 0 + mov r8, QWORD PTR [rsp+152] + mov r9, QWORD PTR [rsp+160] + mov rbp, QWORD PTR [rsp+136] + lea rbx, QWORD PTR [rsp+32] +L_chacha20_poly1305_small_dec_x16: + cmp rbp, 16 + jl L_chacha20_poly1305_small_dec_xtail + vmovdqu xmm8, OWORD PTR [r8] + vpxor xmm8, xmm8, [rbx] + vmovdqu OWORD PTR [r9], xmm8 + add r8, 16 + add r9, 16 + add rbx, 16 + sub rbp, 16 + jmp L_chacha20_poly1305_small_dec_x16 +L_chacha20_poly1305_small_dec_xtail: + test rbp, rbp + jz L_chacha20_poly1305_small_dec_xdone + xor rcx, rcx +L_chacha20_poly1305_small_dec_xbyte: + cmp rcx, rbp + jge L_chacha20_poly1305_small_dec_xdone + movzx eax, BYTE PTR [r8+rcx] + xor al, BYTE PTR [rbx+rcx] + mov BYTE PTR [r9+rcx], al + inc rcx + jmp L_chacha20_poly1305_small_dec_xbyte +L_chacha20_poly1305_small_dec_xdone: + vpxor xmm0, xmm0, xmm0 + vmovdqu OWORD PTR [rsp], xmm0 + vmovdqu OWORD PTR [rsp+16], xmm0 + vmovdqu OWORD PTR [rsp+32], xmm0 + vmovdqu OWORD PTR [rsp+48], xmm0 + vmovdqu OWORD PTR [rsp+64], xmm0 + vmovdqu OWORD PTR [rsp+80], xmm0 + vzeroupper + mov rbx, QWORD PTR [rsp+144] + mov r9, rsi + and rsi, 3 + shr r9, 2 + lea r9, QWORD PTR [r9+4*r9+0] + add r15, r9 + adc rdi, 0 + adc rsi, 0 + mov r9, r15 + mov rdx, rdi + mov rcx, rsi + add r9, 5 + adc rdx, 0 + adc rcx, 0 + cmp rcx, 4 + cmove r15, r9 + cmove rdi, rdx + add r15, QWORD PTR [r12+48] + adc rdi, QWORD PTR [r12+56] + xor r15, QWORD PTR [rbx] + xor rdi, QWORD PTR [rbx+8] + or r15, rdi + mov rax, r15 + neg rax + or rax, r15 + shr rax, 63 + vmovdqu xmm6, OWORD PTR [rsp+168] + vmovdqu xmm7, OWORD PTR [rsp+184] + vmovdqu xmm8, OWORD PTR [rsp+200] + vmovdqu xmm9, OWORD PTR [rsp+216] + vmovdqu xmm10, OWORD PTR [rsp+232] + vmovdqu xmm11, OWORD PTR [rsp+248] + vmovdqu xmm12, OWORD PTR [rsp+264] + vmovdqu xmm13, OWORD PTR [rsp+280] + vmovdqu xmm14, OWORD PTR [rsp+296] + vmovdqu xmm15, OWORD PTR [rsp+312] + add rsp, 328 + pop rbp + pop rbx + pop rsi + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + ret +chacha20_poly1305_small_dec ENDP +_TEXT ENDS +ENDIF END diff --git a/wolfcrypt/src/cpuid.c b/wolfcrypt/src/cpuid.c index 854a34ff535..3ff3e2bc6d6 100644 --- a/wolfcrypt/src/cpuid.c +++ b/wolfcrypt/src/cpuid.c @@ -53,6 +53,7 @@ new_cpuid_flags |= CPUID_ADX; new_cpuid_flags |= CPUID_MOVBE; new_cpuid_flags |= CPUID_BMI1; + new_cpuid_flags |= CPUID_SSSE3; #ifdef WOLFSSL_SGX_CPUID_AVX512_VAES /* CPUID is unavailable inside an SGX enclave, so the integrator * defines this macro to assert the target CPU implements VAES and @@ -60,6 +61,10 @@ * rest), not just AES-GCM-SIV - only set it when that is true. */ new_cpuid_flags |= CPUID_VAES; new_cpuid_flags |= CPUID_AVX512; + new_cpuid_flags |= CPUID_AVX512VL; + new_cpuid_flags |= CPUID_AVX512_IFMA; + /* SGX is an Intel-only technology. */ + new_cpuid_flags |= CPUID_INTEL; #endif (void)wolfSSL_Atomic_Uint_CompareExchange @@ -152,6 +157,11 @@ if (cpuid_flag(7, 0, EBX, 16)) { new_cpuid_flags |= CPUID_AVX512; } if (cpuid_is_intel()) { new_cpuid_flags |= CPUID_INTEL ; } if (cpuid_is_amd()) { new_cpuid_flags |= CPUID_AMD ; } + if (cpuid_flag(1, 0, ECX, 9)) { new_cpuid_flags |= CPUID_SSSE3 ; } + if (cpuid_flag(7, 0, EBX, 31)) { new_cpuid_flags |= CPUID_AVX512VL;} + if (cpuid_flag(7, 0, EBX, 21)) { + new_cpuid_flags |= CPUID_AVX512_IFMA; + } (void)wolfSSL_Atomic_Uint_CompareExchange (&cpuid_flags, &old_cpuid_flags, new_cpuid_flags); } diff --git a/wolfcrypt/src/poly1305.c b/wolfcrypt/src/poly1305.c index 503ceff5850..59b7f6bf60c 100644 --- a/wolfcrypt/src/poly1305.c +++ b/wolfcrypt/src/poly1305.c @@ -88,10 +88,80 @@ and Daniel J. Bernstein #ifndef NO_AVX2_SUPPORT #define HAVE_INTEL_AVX2 #endif + /* 8-way path; the struct carries r^5..r^8 only when this is on. */ + #if defined(WOLFSSL_POLY1305_AVX512) && !defined(NO_AVX512_SUPPORT) + #define HAVE_INTEL_AVX512 + #endif #endif #ifdef USE_INTEL_POLY1305_SPEEDUP static cpuid_flags_t intel_flags = WC_CPUID_INITIALIZER; + +/* The fused ChaCha20-Poly1305 kernel drives the 4-way path; when it is active + * this flag pins Update/Final to the 4-way path so the state layout matches. */ +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED + #define POLY1305_FORCE_AVX2(ctx) ((ctx)->forceAvx2 != 0) +#else + #define POLY1305_FORCE_AVX2(ctx) 0 +#endif + +/* The fused IFMA stitch drives the scalar path; when it is active this flag + * pins Update/Final to the scalar (poly1305_blocks_avx / _final_avx) path so + * the state layout matches. */ +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + #define POLY1305_FORCE_SCALAR(ctx) ((ctx)->forceScalar != 0) +#else + #define POLY1305_FORCE_SCALAR(ctx) 0 +#endif + +#ifdef HAVE_INTEL_AVX512 +/* Whether to use the 8-way (512-bit) Poly1305 over the 4-way AVX2 path. + * + * The zmm path does eight 16-byte blocks per iteration and is the fastest + * option where 512-bit code runs at full clock: AMD Zen 4/5 (no AVX-512 + * license) and Intel Ice Lake and later. On Intel Skylake-SP / Cascade + * Lake-class parts, sustained 512-bit instructions trip the AVX-512 frequency + * license and downclock the core; the penalty is milder here than for the + * FP-heavy ChaCha, but the 256-bit AVX2 path can still be the safer default on + * those parts. As with the ChaCha gate, VAES presence is used as a + * generational proxy: the throttling parts predate VAES, whereas every + * microarchitecture that runs 512-bit without penalty implements it. A missing + * VAES only costs a little throughput (fall back to AVX2), never correctness. + * + * Override the heuristic with: + * WOLFSSL_POLY1305_AVX512_ALWAYS - use zmm whenever AVX-512 is present + * WOLFSSL_POLY1305_AVX512_NEVER - never use zmm (always AVX2 or below) + */ +static WC_INLINE int poly1305_use_avx512(cpuid_flags_t flags) +{ +#if defined(WOLFSSL_POLY1305_AVX512_NEVER) + (void)flags; + return 0; +#elif defined(WOLFSSL_POLY1305_AVX512_ALWAYS) + return IS_INTEL_AVX512(flags) != 0; +#else + return (IS_INTEL_AVX512(flags) != 0) && (IS_INTEL_VAES(flags) != 0); +#endif +} + +/* The radix-2^44 IFMA path is preferred on Intel cores with AVX-512 IFMA + * (Ice Lake and later), where it beats the 26-bit vpmuludq 8-way. On AMD + * Zen 4/5 - which also implement IFMA - the vpmuludq 8-way is measurably faster + * (stronger vector-integer throughput), so IFMA is gated to an Intel vendor. + * Define WOLFSSL_POLY1305_IFMA_ALWAYS to use it on any IFMA CPU, or + * WOLFSSL_POLY1305_NO_IFMA to disable it. */ +static WC_INLINE int poly1305_use_ifma(cpuid_flags_t flags) +{ +#if defined(WOLFSSL_POLY1305_NO_IFMA) + (void)flags; + return 0; +#elif defined(WOLFSSL_POLY1305_IFMA_ALWAYS) + return IS_INTEL_AVX512_IFMA(flags) != 0; +#else + return (IS_INTEL_AVX512_IFMA(flags) != 0) && (IS_CPU_INTEL(flags) != 0); +#endif +} +#endif /* HAVE_INTEL_AVX512 */ #endif #if defined(USE_INTEL_POLY1305_SPEEDUP) || defined(POLY130564) @@ -204,6 +274,24 @@ WOLFSSL_LOCAL void poly1305_setkey_avx2(Poly1305* ctx, const byte* key); WOLFSSL_LOCAL void poly1305_final_avx2(Poly1305* ctx, byte* mac); #endif +#ifdef HAVE_INTEL_AVX512 +/* Process multiple 128-byte (8 block) groups of data eight lanes wide. */ +WOLFSSL_LOCAL void poly1305_blocks_avx512(Poly1305* ctx, + const unsigned char* m, size_t bytes); +/* Calculate R^1 .. R^8 and store them in the context. */ +WOLFSSL_LOCAL void poly1305_calc_powers_avx512(Poly1305* ctx); +/* Calculate the final result - authentication data. Collapses the eight + * lanes and finishes any leftover with the AVX final function. */ +WOLFSSL_LOCAL void poly1305_final_avx512(Poly1305* ctx, byte* mac); + +/* AVX-512 IFMA (radix 2^44) 8-way variants - used when the CPU has IFMA. */ +WOLFSSL_LOCAL void poly1305_blocks_avx512ifma(Poly1305* ctx, + const unsigned char* m, size_t bytes); +WOLFSSL_LOCAL void poly1305_calc_powers_avx512ifma(Poly1305* ctx); +WOLFSSL_LOCAL void poly1305_setkey_avx512ifma(Poly1305* ctx, const byte* key); +WOLFSSL_LOCAL void poly1305_final_avx512ifma(Poly1305* ctx, byte* mac); +#endif + #ifdef __cplusplus } /* extern "C" */ #endif @@ -854,6 +942,11 @@ int wc_Poly1305SetKey(Poly1305* ctx, const byte* key, word32 keySz) #ifdef USE_INTEL_POLY1305_SPEEDUP cpuid_get_flags_ex(&intel_flags); SAVE_VECTOR_REGISTERS(return _svr_ret;); + #ifdef HAVE_INTEL_AVX512 + if (poly1305_use_ifma(intel_flags)) + poly1305_setkey_avx512ifma(ctx, key); + else + #endif #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) poly1305_setkey_avx2(ctx, key); @@ -862,6 +955,12 @@ int wc_Poly1305SetKey(Poly1305* ctx, const byte* key, word32 keySz) poly1305_setkey_avx(ctx, key); RESTORE_VECTOR_REGISTERS(); ctx->started = 0; +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED + ctx->forceAvx2 = 0; +#endif +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + ctx->forceScalar = 0; +#endif #elif defined(WOLFSSL_ARMASM) #ifdef __aarch64__ poly1305_setkey_aarch64(ctx, key); @@ -885,8 +984,18 @@ int wc_Poly1305Final(Poly1305* ctx, byte* mac) #ifdef USE_INTEL_POLY1305_SPEEDUP SAVE_VECTOR_REGISTERS(return _svr_ret;); + #ifdef HAVE_INTEL_AVX512 + if (!POLY1305_FORCE_AVX2(ctx) && !POLY1305_FORCE_SCALAR(ctx) && + poly1305_use_ifma(intel_flags)) + poly1305_final_avx512ifma(ctx, mac); + else + if (!POLY1305_FORCE_AVX2(ctx) && !POLY1305_FORCE_SCALAR(ctx) && + poly1305_use_avx512(intel_flags)) + poly1305_final_avx512(ctx, mac); + else + #endif #ifdef HAVE_INTEL_AVX2 - if (IS_INTEL_AVX2(intel_flags)) + if (!POLY1305_FORCE_SCALAR(ctx) && IS_INTEL_AVX2(intel_flags)) poly1305_final_avx2(ctx, mac); else #endif @@ -1008,8 +1117,110 @@ int wc_Poly1305Update(Poly1305* ctx, const byte* m, word32 bytes) } #else #ifdef USE_INTEL_POLY1305_SPEEDUP + #ifdef HAVE_INTEL_AVX512 + if (!POLY1305_FORCE_AVX2(ctx) && !POLY1305_FORCE_SCALAR(ctx) && + poly1305_use_ifma(intel_flags)) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); + + /* handle leftover */ + if (ctx->leftover) { + size_t want = sizeof(ctx->buffer) - ctx->leftover; + if (want > bytes) + want = bytes; + + for (i = 0; i < want; i++) + ctx->buffer[ctx->leftover + i] = m[i]; + bytes -= (word32)want; + m += want; + ctx->leftover += want; + if (ctx->leftover < sizeof(ctx->buffer)) { + RESTORE_VECTOR_REGISTERS(); + return 0; + } + + if (!ctx->started) { + poly1305_calc_powers_avx512ifma(ctx); + ctx->started = 1; + } + poly1305_blocks_avx512ifma(ctx, ctx->buffer, sizeof(ctx->buffer)); + ctx->leftover = 0; + } + + /* process full blocks */ + if (bytes >= sizeof(ctx->buffer)) { + size_t want = bytes & ~(sizeof(ctx->buffer) - 1); + + if (!ctx->started) { + poly1305_calc_powers_avx512ifma(ctx); + ctx->started = 1; + } + poly1305_blocks_avx512ifma(ctx, m, want); + m += want; + bytes -= (word32)want; + } + + /* store leftover */ + if (bytes) { + for (i = 0; i < bytes; i++) + ctx->buffer[ctx->leftover + i] = m[i]; + ctx->leftover += bytes; + } + RESTORE_VECTOR_REGISTERS(); + } + else + if (!POLY1305_FORCE_AVX2(ctx) && !POLY1305_FORCE_SCALAR(ctx) && + poly1305_use_avx512(intel_flags)) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); + + /* handle leftover */ + if (ctx->leftover) { + size_t want = sizeof(ctx->buffer) - ctx->leftover; + if (want > bytes) + want = bytes; + + for (i = 0; i < want; i++) + ctx->buffer[ctx->leftover + i] = m[i]; + bytes -= (word32)want; + m += want; + ctx->leftover += want; + if (ctx->leftover < sizeof(ctx->buffer)) { + RESTORE_VECTOR_REGISTERS(); + return 0; + } + + if (!ctx->started) { + poly1305_calc_powers_avx512(ctx); + ctx->started = 1; + } + poly1305_blocks_avx512(ctx, ctx->buffer, sizeof(ctx->buffer)); + ctx->leftover = 0; + } + + /* process full blocks */ + if (bytes >= sizeof(ctx->buffer)) { + size_t want = bytes & ~(sizeof(ctx->buffer) - 1); + + if (!ctx->started) { + poly1305_calc_powers_avx512(ctx); + ctx->started = 1; + } + poly1305_blocks_avx512(ctx, m, want); + m += want; + bytes -= (word32)want; + } + + /* store leftover */ + if (bytes) { + for (i = 0; i < bytes; i++) + ctx->buffer[ctx->leftover + i] = m[i]; + ctx->leftover += bytes; + } + RESTORE_VECTOR_REGISTERS(); + } + else + #endif #ifdef HAVE_INTEL_AVX2 - if (IS_INTEL_AVX2(intel_flags)) { + if (!POLY1305_FORCE_SCALAR(ctx) && IS_INTEL_AVX2(intel_flags)) { SAVE_VECTOR_REGISTERS(return _svr_ret;); /* handle leftover */ diff --git a/wolfcrypt/src/poly1305_asm.S b/wolfcrypt/src/poly1305_asm.S index 80701aa2a2e..64a137c6d77 100644 --- a/wolfcrypt/src/poly1305_asm.S +++ b/wolfcrypt/src/poly1305_asm.S @@ -1142,6 +1142,2447 @@ L_poly1305_avx2_final_cmp_copy: .size poly1305_final_avx2,.-poly1305_final_avx2 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ +#ifdef HAVE_INTEL_AVX512 +#ifndef __APPLE__ +.text +.globl poly1305_calc_powers_avx512 +.type poly1305_calc_powers_avx512,@function +.align 16 +poly1305_calc_powers_avx512: +#else +.section __TEXT,__text +.globl _poly1305_calc_powers_avx512 +.p2align 4 +_poly1305_calc_powers_avx512: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + subq $0x60, %rsp + movq (%rdi), %rcx + movq 8(%rdi), %r8 + xorq %r9, %r9 + # Convert to 26 bits in 32 + movq %rcx, %rax + movq %rcx, %rdx + movq %rcx, %rsi + movq %r8, %rbx + movq %r8, %rbp + shrq $26, %rdx + shrdq $52, %r8, %rsi + shrq $14, %rbx + shrdq $40, %r9, %rbp + andq $0x3ffffff, %rax + andq $0x3ffffff, %rdx + andq $0x3ffffff, %rsi + andq $0x3ffffff, %rbx + andq $0x3ffffff, %rbp + movl %eax, 224(%rdi) + movl %edx, 228(%rdi) + movl %esi, 232(%rdi) + movl %ebx, 236(%rdi) + movl %ebp, 240(%rdi) + movl $0x00, 244(%rdi) + movq %rcx, (%rsp) + movq %r8, 8(%rsp) + movq %r9, 16(%rsp) + # Square 128-bit + movq %r8, %rax + mulq %rcx + xorq %r13, %r13 + movq %rax, %r11 + movq %rdx, %r12 + addq %rax, %r11 + adcq %rdx, %r12 + adcq $0x00, %r13 + movq %rcx, %rax + mulq %rax + movq %rax, %r10 + movq %rdx, %r15 + movq %r8, %rax + mulq %rax + addq %r15, %r11 + adcq %rax, %r12 + adcq %rdx, %r13 + # Reduce 256-bit to 130-bit + movq %r12, %rax + movq %r13, %rdx + andq $-4, %rax + andq $3, %r12 + addq %rax, %r10 + adcq %rdx, %r11 + adcq $0x00, %r12 + shrdq $2, %rdx, %rax + shrq $2, %rdx + addq %rax, %r10 + adcq %rdx, %r11 + adcq $0x00, %r12 + movq %r12, %rax + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + andq $3, %r12 + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + # Convert to 26 bits in 32 + movq %r10, %rax + movq %r10, %rdx + movq %r10, %rsi + movq %r11, %rbx + movq %r11, %rbp + shrq $26, %rdx + shrdq $52, %r11, %rsi + shrq $14, %rbx + shrdq $40, %r12, %rbp + andq $0x3ffffff, %rax + andq $0x3ffffff, %rdx + andq $0x3ffffff, %rsi + andq $0x3ffffff, %rbx + andq $0x3ffffff, %rbp + movl %eax, 256(%rdi) + movl %edx, 260(%rdi) + movl %esi, 264(%rdi) + movl %ebx, 268(%rdi) + movl %ebp, 272(%rdi) + movl $0x00, 276(%rdi) + movq %r10, 24(%rsp) + movq %r11, 32(%rsp) + movq %r12, 40(%rsp) + # Multiply 128-bit by 130-bit + # r1[0] * r2[0] + movq %rcx, %rax + mulq %r10 + movq %rax, %r13 + movq %rdx, %r14 + # r1[0] * r2[1] + movq %rcx, %rax + mulq %r11 + movq $0x00, %r15 + addq %rax, %r14 + adcq %rdx, %r15 + # r1[1] * r2[0] + movq %r8, %rax + mulq %r10 + movq $0x00, %rsi + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rsi + # r1[0] * r2[2] + movq %rcx, %rax + mulq %r12 + addq %rax, %r15 + adcq %rdx, %rsi + # r1[1] * r2[1] + movq %r8, %rax + mulq %r11 + movq $0x00, %rbx + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[1] * r2[2] + movq %r8, %rax + mulq %r12 + addq %rax, %rsi + adcq %rdx, %rbx + # Reduce 260-bit to 130-bit + movq %r15, %rax + movq %rsi, %rdx + andq $-4, %rax + andq $3, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + shrdq $2, %rdx, %rax + shrdq $2, %rbx, %rdx + shrq $2, %rbx + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + movq %r15, %rax + andq $3, %r15 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + # Convert to 26 bits in 32 + movq %r13, %rax + movq %r13, %rdx + movq %r13, %rsi + movq %r14, %rbx + movq %r14, %rbp + shrq $26, %rdx + shrdq $52, %r14, %rsi + shrq $14, %rbx + shrdq $40, %r15, %rbp + andq $0x3ffffff, %rax + andq $0x3ffffff, %rdx + andq $0x3ffffff, %rsi + andq $0x3ffffff, %rbx + andq $0x3ffffff, %rbp + movl %eax, 288(%rdi) + movl %edx, 292(%rdi) + movl %esi, 296(%rdi) + movl %ebx, 300(%rdi) + movl %ebp, 304(%rdi) + movl $0x00, 308(%rdi) + movq %r13, 48(%rsp) + movq %r14, 56(%rsp) + movq %r15, 64(%rsp) + # Square 130-bit + movq %r11, %rax + mulq %r10 + xorq %r13, %r13 + movq %rax, %r8 + movq %rdx, %r9 + addq %rax, %r8 + adcq %rdx, %r9 + adcq $0x00, %r13 + movq %r10, %rax + mulq %rax + movq %rax, %rcx + movq %rdx, %r15 + movq %r11, %rax + mulq %rax + addq %r15, %r8 + adcq %rax, %r9 + adcq %rdx, %r13 + movq %r12, %rax + mulq %rax + movq %rax, %r14 + movq %r12, %rax + mulq %r10 + addq %rax, %r9 + adcq %rdx, %r13 + adcq $0x00, %r14 + addq %rax, %r9 + adcq %rdx, %r13 + adcq $0x00, %r14 + movq %r12, %rax + mulq %r11 + addq %rax, %r13 + adcq %rdx, %r14 + addq %rax, %r13 + adcq %rdx, %r14 + # Reduce 260-bit to 130-bit + movq %r9, %rax + movq %r13, %rdx + movq %r14, %r15 + andq $-4, %rax + andq $3, %r9 + addq %rax, %rcx + adcq %rdx, %r8 + adcq %r15, %r9 + shrdq $2, %rdx, %rax + shrdq $2, %r15, %rdx + shrq $2, %r15 + addq %rax, %rcx + adcq %rdx, %r8 + adcq %r15, %r9 + movq %r9, %rax + andq $3, %r9 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %rcx + adcq $0x00, %r8 + adcq $0x00, %r9 + # Convert to 26 bits in 32 + movq %rcx, %rax + movq %rcx, %rdx + movq %rcx, %rsi + movq %r8, %rbx + movq %r8, %rbp + shrq $26, %rdx + shrdq $52, %r8, %rsi + shrq $14, %rbx + shrdq $40, %r9, %rbp + andq $0x3ffffff, %rax + andq $0x3ffffff, %rdx + andq $0x3ffffff, %rsi + andq $0x3ffffff, %rbx + andq $0x3ffffff, %rbp + movl %eax, 320(%rdi) + movl %edx, 324(%rdi) + movl %esi, 328(%rdi) + movl %ebx, 332(%rdi) + movl %ebp, 336(%rdi) + movl $0x00, 340(%rdi) + movq %rcx, 72(%rsp) + movq %r8, 80(%rsp) + movq %r9, 88(%rsp) + movq (%rsp), %r10 + movq 8(%rsp), %r11 + movq 16(%rsp), %r12 + # Multiply 128-bit by 130-bit + # r1[0] * r2[0] + movq %r10, %rax + mulq %rcx + movq %rax, %r13 + movq %rdx, %r14 + # r1[0] * r2[1] + movq %r10, %rax + mulq %r8 + movq $0x00, %r15 + addq %rax, %r14 + adcq %rdx, %r15 + # r1[1] * r2[0] + movq %r11, %rax + mulq %rcx + movq $0x00, %rsi + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rsi + # r1[0] * r2[2] + movq %r10, %rax + mulq %r9 + addq %rax, %r15 + adcq %rdx, %rsi + # r1[1] * r2[1] + movq %r11, %rax + mulq %r8 + movq $0x00, %rbx + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[1] * r2[2] + movq %r11, %rax + mulq %r9 + addq %rax, %rsi + adcq %rdx, %rbx + # Reduce 260-bit to 130-bit + movq %r15, %rax + movq %rsi, %rdx + andq $-4, %rax + andq $3, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + shrdq $2, %rdx, %rax + shrdq $2, %rbx, %rdx + shrq $2, %rbx + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + movq %r15, %rax + andq $3, %r15 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + # Convert to 26 bits in 32 + movq %r13, %rax + movq %r13, %rdx + movq %r13, %rsi + movq %r14, %rbx + movq %r14, %rbp + shrq $26, %rdx + shrdq $52, %r14, %rsi + shrq $14, %rbx + shrdq $40, %r15, %rbp + andq $0x3ffffff, %rax + andq $0x3ffffff, %rdx + andq $0x3ffffff, %rsi + andq $0x3ffffff, %rbx + andq $0x3ffffff, %rbp + movl %eax, 624(%rdi) + movl %edx, 628(%rdi) + movl %esi, 632(%rdi) + movl %ebx, 636(%rdi) + movl %ebp, 640(%rdi) + movl $0x00, 644(%rdi) + # Square 130-bit + movq %r8, %rax + mulq %rcx + xorq %r13, %r13 + movq %rax, %r11 + movq %rdx, %r12 + addq %rax, %r11 + adcq %rdx, %r12 + adcq $0x00, %r13 + movq %rcx, %rax + mulq %rax + movq %rax, %r10 + movq %rdx, %r15 + movq %r8, %rax + mulq %rax + addq %r15, %r11 + adcq %rax, %r12 + adcq %rdx, %r13 + movq %r9, %rax + mulq %rax + movq %rax, %r14 + movq %r9, %rax + mulq %rcx + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + movq %r9, %rax + mulq %r8 + addq %rax, %r13 + adcq %rdx, %r14 + addq %rax, %r13 + adcq %rdx, %r14 + # Reduce 260-bit to 130-bit + movq %r12, %rax + movq %r13, %rdx + movq %r14, %r15 + andq $-4, %rax + andq $3, %r12 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + shrdq $2, %rdx, %rax + shrdq $2, %r15, %rdx + shrq $2, %r15 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + movq %r12, %rax + andq $3, %r12 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + # Convert to 26 bits in 32 + movq %r10, %rax + movq %r10, %rdx + movq %r10, %rsi + movq %r11, %rbx + movq %r11, %rbp + shrq $26, %rdx + shrdq $52, %r11, %rsi + shrq $14, %rbx + shrdq $40, %r12, %rbp + andq $0x3ffffff, %rax + andq $0x3ffffff, %rdx + andq $0x3ffffff, %rsi + andq $0x3ffffff, %rbx + andq $0x3ffffff, %rbp + movl %eax, 720(%rdi) + movl %edx, 724(%rdi) + movl %esi, 728(%rdi) + movl %ebx, 732(%rdi) + movl %ebp, 736(%rdi) + movl $0x00, 740(%rdi) + movq 48(%rsp), %rcx + movq 56(%rsp), %r8 + movq 64(%rsp), %r9 + # Square 130-bit + movq %r8, %rax + mulq %rcx + xorq %r13, %r13 + movq %rax, %r11 + movq %rdx, %r12 + addq %rax, %r11 + adcq %rdx, %r12 + adcq $0x00, %r13 + movq %rcx, %rax + mulq %rax + movq %rax, %r10 + movq %rdx, %r15 + movq %r8, %rax + mulq %rax + addq %r15, %r11 + adcq %rax, %r12 + adcq %rdx, %r13 + movq %r9, %rax + mulq %rax + movq %rax, %r14 + movq %r9, %rax + mulq %rcx + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + movq %r9, %rax + mulq %r8 + addq %rax, %r13 + adcq %rdx, %r14 + addq %rax, %r13 + adcq %rdx, %r14 + # Reduce 260-bit to 130-bit + movq %r12, %rax + movq %r13, %rdx + movq %r14, %r15 + andq $-4, %rax + andq $3, %r12 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + shrdq $2, %rdx, %rax + shrdq $2, %r15, %rdx + shrq $2, %r15 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + movq %r12, %rax + andq $3, %r12 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + # Convert to 26 bits in 32 + movq %r10, %rax + movq %r10, %rdx + movq %r10, %rsi + movq %r11, %rbx + movq %r11, %rbp + shrq $26, %rdx + shrdq $52, %r11, %rsi + shrq $14, %rbx + shrdq $40, %r12, %rbp + andq $0x3ffffff, %rax + andq $0x3ffffff, %rdx + andq $0x3ffffff, %rsi + andq $0x3ffffff, %rbx + andq $0x3ffffff, %rbp + movl %eax, 656(%rdi) + movl %edx, 660(%rdi) + movl %esi, 664(%rdi) + movl %ebx, 668(%rdi) + movl %ebp, 672(%rdi) + movl $0x00, 676(%rdi) + movq (%rsp), %rcx + movq 8(%rsp), %r8 + movq 16(%rsp), %r9 + # Multiply 128-bit by 130-bit + # r1[0] * r2[0] + movq %rcx, %rax + mulq %r10 + movq %rax, %r13 + movq %rdx, %r14 + # r1[0] * r2[1] + movq %rcx, %rax + mulq %r11 + movq $0x00, %r15 + addq %rax, %r14 + adcq %rdx, %r15 + # r1[1] * r2[0] + movq %r8, %rax + mulq %r10 + movq $0x00, %rsi + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rsi + # r1[0] * r2[2] + movq %rcx, %rax + mulq %r12 + addq %rax, %r15 + adcq %rdx, %rsi + # r1[1] * r2[1] + movq %r8, %rax + mulq %r11 + movq $0x00, %rbx + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[1] * r2[2] + movq %r8, %rax + mulq %r12 + addq %rax, %rsi + adcq %rdx, %rbx + # Reduce 260-bit to 130-bit + movq %r15, %rax + movq %rsi, %rdx + andq $-4, %rax + andq $3, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + shrdq $2, %rdx, %rax + shrdq $2, %rbx, %rdx + shrq $2, %rbx + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + movq %r15, %rax + andq $3, %r15 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + # Convert to 26 bits in 32 + movq %r13, %rax + movq %r13, %rdx + movq %r13, %rsi + movq %r14, %rbx + movq %r14, %rbp + shrq $26, %rdx + shrdq $52, %r14, %rsi + shrq $14, %rbx + shrdq $40, %r15, %rbp + andq $0x3ffffff, %rax + andq $0x3ffffff, %rdx + andq $0x3ffffff, %rsi + andq $0x3ffffff, %rbx + andq $0x3ffffff, %rbp + movl %eax, 688(%rdi) + movl %edx, 692(%rdi) + movl %esi, 696(%rdi) + movl %ebx, 700(%rdi) + movl %ebp, 704(%rdi) + movl $0x00, 708(%rdi) + addq $0x60, %rsp + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size poly1305_calc_powers_avx512,.-poly1305_calc_powers_avx512 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512_blocks_mask: +.quad 0x0000000003ffffff,0x0000000003ffffff +.quad 0x0000000003ffffff,0x0000000003ffffff +.quad 0x0000000003ffffff,0x0000000003ffffff +.quad 0x0000000003ffffff,0x0000000003ffffff +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512_blocks_hibit: +.quad 0x0000000001000000,0x0000000001000000 +.quad 0x0000000001000000,0x0000000001000000 +.quad 0x0000000001000000,0x0000000001000000 +.quad 0x0000000001000000,0x0000000001000000 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512_blocks_permidx: +.quad 0x0000000400000000,0x0000000c00000008 +.quad 0x0000001400000010,0x0000001c00000018 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000500000001,0x0000000d00000009 +.quad 0x0000001500000011,0x0000001d00000019 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000600000002,0x0000000e0000000a +.quad 0x0000001600000012,0x0000001e0000001a +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000700000003,0x0000000f0000000b +.quad 0x0000001700000013,0x0000001f0000001b +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512_blocks_rxidx: +.quad 0x0000001000000018,0x0000000000000008 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000001100000019,0x0000000100000009 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x000000120000001a,0x000000020000000a +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x000000130000001b,0x000000030000000b +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x000000140000001c,0x000000040000000c +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +#ifndef __APPLE__ +.text +.globl poly1305_blocks_avx512 +.type poly1305_blocks_avx512,@function +.align 16 +poly1305_blocks_avx512: +#else +.section __TEXT,__text +.globl _poly1305_blocks_avx512 +.p2align 4 +_poly1305_blocks_avx512: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + leaq L_poly1305_avx512_blocks_mask(%rip), %rcx + leaq L_poly1305_avx512_blocks_hibit(%rip), %r13 + leaq L_poly1305_avx512_blocks_permidx(%rip), %r14 + leaq L_poly1305_avx512_blocks_rxidx(%rip), %r15 + vpxorq %zmm24, %zmm24, %zmm24 + leaq 64(%rdi), %rax + cmpw $0x00, 616(%rdi) + jne L_poly1305_avx512_blocks_begin_h + # Load the message data + vmovdqu64 (%rsi), %zmm25 + vmovdqu64 64(%rsi), %zmm26 + vmovdqu64 (%r14), %zmm27 + vpermi2d %zmm26, %zmm25, %zmm27 + vpmovzxdq %ymm27, %zmm0 + vmovdqu64 64(%r14), %zmm27 + vpermi2d %zmm26, %zmm25, %zmm27 + vpmovzxdq %ymm27, %zmm1 + vmovdqu64 128(%r14), %zmm27 + vpermi2d %zmm26, %zmm25, %zmm27 + vpmovzxdq %ymm27, %zmm2 + vmovdqu64 192(%r14), %zmm27 + vpermi2d %zmm26, %zmm25, %zmm27 + vpmovzxdq %ymm27, %zmm3 + vmovdqu64 (%r13), %zmm4 + vpsllq $6, %zmm1, %zmm1 + vpsllq $12, %zmm2, %zmm2 + vpsllq $18, %zmm3, %zmm3 + vmovdqu64 (%rcx), %zmm23 + # Reduce, in place, the message data + vpsrlq $26, %zmm0, %zmm19 + vpsrlq $26, %zmm3, %zmm20 + vpandq %zmm23, %zmm0, %zmm0 + vpandq %zmm23, %zmm3, %zmm3 + vpaddq %zmm1, %zmm19, %zmm1 + vpaddq %zmm4, %zmm20, %zmm4 + vpsrlq $26, %zmm1, %zmm19 + vpsrlq $26, %zmm4, %zmm20 + vpandq %zmm23, %zmm1, %zmm1 + vpandq %zmm23, %zmm4, %zmm4 + vpaddq %zmm2, %zmm19, %zmm2 + vpslld $2, %zmm20, %zmm21 + vpaddd %zmm21, %zmm20, %zmm21 + vpsrlq $26, %zmm2, %zmm19 + vpaddq %zmm0, %zmm21, %zmm0 + vpsrlq $26, %zmm0, %zmm20 + vpandq %zmm23, %zmm2, %zmm2 + vpandq %zmm23, %zmm0, %zmm0 + vpaddq %zmm3, %zmm19, %zmm3 + vpaddq %zmm1, %zmm20, %zmm1 + vpsrlq $26, %zmm3, %zmm19 + vpandq %zmm23, %zmm3, %zmm3 + vpaddq %zmm4, %zmm19, %zmm4 + addq $0x80, %rsi + subq $0x80, %rdx + jz L_poly1305_avx512_blocks_store + jmp L_poly1305_avx512_blocks_load_r8 +L_poly1305_avx512_blocks_begin_h: + # Load the H values. + vpmovzxdq (%rax), %zmm0 + vpmovzxdq 32(%rax), %zmm1 + vpmovzxdq 64(%rax), %zmm2 + vpmovzxdq 96(%rax), %zmm3 + vpmovzxdq 128(%rax), %zmm4 + # Check if there is a power of r to load - otherwise use r^8. + cmpb $0x00, 616(%rdi) + je L_poly1305_avx512_blocks_load_r8 + # Load the 8 powers of r - r^8 .. r^1. + vmovdqu64 224(%rdi), %zmm14 + vmovdqu64 288(%rdi), %zmm15 + vmovdqu64 624(%rdi), %zmm16 + vmovdqu64 688(%rdi), %zmm17 + vmovdqu64 (%r15), %zmm18 + vpermi2d %zmm17, %zmm16, %zmm18 + vpmovzxdq %xmm18, %ymm20 + vmovdqu64 (%r15), %zmm19 + vpermi2d %zmm15, %zmm14, %zmm19 + vpmovzxdq %xmm19, %ymm21 + vinserti64x4 $0x01, %ymm21, %zmm20, %zmm5 + vmovdqu64 64(%r15), %zmm18 + vpermi2d %zmm17, %zmm16, %zmm18 + vpmovzxdq %xmm18, %ymm20 + vmovdqu64 64(%r15), %zmm19 + vpermi2d %zmm15, %zmm14, %zmm19 + vpmovzxdq %xmm19, %ymm21 + vinserti64x4 $0x01, %ymm21, %zmm20, %zmm6 + vmovdqu64 128(%r15), %zmm18 + vpermi2d %zmm17, %zmm16, %zmm18 + vpmovzxdq %xmm18, %ymm20 + vmovdqu64 128(%r15), %zmm19 + vpermi2d %zmm15, %zmm14, %zmm19 + vpmovzxdq %xmm19, %ymm21 + vinserti64x4 $0x01, %ymm21, %zmm20, %zmm7 + vmovdqu64 192(%r15), %zmm18 + vpermi2d %zmm17, %zmm16, %zmm18 + vpmovzxdq %xmm18, %ymm20 + vmovdqu64 192(%r15), %zmm19 + vpermi2d %zmm15, %zmm14, %zmm19 + vpmovzxdq %xmm19, %ymm21 + vinserti64x4 $0x01, %ymm21, %zmm20, %zmm8 + vmovdqu64 256(%r15), %zmm18 + vpermi2d %zmm17, %zmm16, %zmm18 + vpmovzxdq %xmm18, %ymm20 + vmovdqu64 256(%r15), %zmm19 + vpermi2d %zmm15, %zmm14, %zmm19 + vpmovzxdq %xmm19, %ymm21 + vinserti64x4 $0x01, %ymm21, %zmm20, %zmm9 + jmp L_poly1305_avx512_blocks_mul_5 +L_poly1305_avx512_blocks_load_r8: + # Load r^8 into all eight lanes. + vpbroadcastd 720(%rdi), %zmm5 + vpbroadcastd 724(%rdi), %zmm6 + vpbroadcastd 728(%rdi), %zmm7 + vpbroadcastd 732(%rdi), %zmm8 + vpbroadcastd 736(%rdi), %zmm9 +L_poly1305_avx512_blocks_mul_5: + # Multiply top 4 26-bit values of all eight powers by 5 + vpslld $2, %zmm6, %zmm10 + vpslld $2, %zmm7, %zmm11 + vpslld $2, %zmm8, %zmm12 + vpslld $2, %zmm9, %zmm13 + vpaddq %zmm10, %zmm6, %zmm10 + vpaddq %zmm11, %zmm7, %zmm11 + vpaddq %zmm12, %zmm8, %zmm12 + vpaddq %zmm13, %zmm9, %zmm13 + vmovdqu64 (%rcx), %zmm23 + # If not finished then loop over data + cmpb $0x01, 616(%rdi) + jne L_poly1305_avx512_blocks_start + # Do last multiply, reduce, add the eight H together and move to + # 32-bit registers + vpmuludq %zmm10, %zmm4, %zmm14 + vpmuludq %zmm11, %zmm3, %zmm19 + vpmuludq %zmm11, %zmm4, %zmm15 + vpmuludq %zmm12, %zmm3, %zmm20 + vpmuludq %zmm12, %zmm4, %zmm16 + vpaddq %zmm14, %zmm19, %zmm14 + vpmuludq %zmm12, %zmm2, %zmm21 + vpmuludq %zmm13, %zmm4, %zmm17 + vpaddq %zmm15, %zmm20, %zmm15 + vpmuludq %zmm13, %zmm1, %zmm22 + vpmuludq %zmm13, %zmm2, %zmm19 + vpaddq %zmm14, %zmm21, %zmm14 + vpmuludq %zmm13, %zmm3, %zmm20 + vpmuludq %zmm5, %zmm3, %zmm21 + vpaddq %zmm14, %zmm22, %zmm14 + vpmuludq %zmm5, %zmm4, %zmm18 + vpaddq %zmm15, %zmm19, %zmm15 + vpmuludq %zmm5, %zmm0, %zmm22 + vpaddq %zmm16, %zmm20, %zmm16 + vpmuludq %zmm5, %zmm1, %zmm19 + vpaddq %zmm17, %zmm21, %zmm17 + vpmuludq %zmm5, %zmm2, %zmm20 + vpmuludq %zmm6, %zmm2, %zmm21 + vpaddq %zmm14, %zmm22, %zmm14 + vpmuludq %zmm6, %zmm3, %zmm22 + vpaddq %zmm15, %zmm19, %zmm15 + vpmuludq %zmm6, %zmm0, %zmm19 + vpaddq %zmm16, %zmm20, %zmm16 + vpmuludq %zmm6, %zmm1, %zmm20 + vpaddq %zmm17, %zmm21, %zmm17 + vpmuludq %zmm7, %zmm1, %zmm21 + vpaddq %zmm18, %zmm22, %zmm18 + vpmuludq %zmm7, %zmm2, %zmm22 + vpaddq %zmm15, %zmm19, %zmm15 + vpmuludq %zmm7, %zmm0, %zmm19 + vpaddq %zmm16, %zmm20, %zmm16 + vpmuludq %zmm8, %zmm0, %zmm20 + vpaddq %zmm17, %zmm21, %zmm17 + vpmuludq %zmm8, %zmm1, %zmm21 + vpaddq %zmm18, %zmm22, %zmm18 + vpaddq %zmm16, %zmm19, %zmm16 + vpmuludq %zmm9, %zmm0, %zmm22 + vpaddq %zmm17, %zmm20, %zmm17 + vpaddq %zmm18, %zmm21, %zmm18 + vpaddq %zmm18, %zmm22, %zmm18 + vpsrlq $26, %zmm14, %zmm19 + vpsrlq $26, %zmm17, %zmm20 + vpandq %zmm23, %zmm14, %zmm14 + vpandq %zmm23, %zmm17, %zmm17 + vpaddq %zmm15, %zmm19, %zmm15 + vpaddq %zmm18, %zmm20, %zmm18 + vpsrlq $26, %zmm15, %zmm19 + vpsrlq $26, %zmm18, %zmm20 + vpandq %zmm23, %zmm15, %zmm1 + vpandq %zmm23, %zmm18, %zmm4 + vpaddq %zmm16, %zmm19, %zmm16 + vpslld $2, %zmm20, %zmm21 + vpaddd %zmm21, %zmm20, %zmm21 + vpsrlq $26, %zmm16, %zmm19 + vpaddq %zmm14, %zmm21, %zmm14 + vpsrlq $26, %zmm14, %zmm20 + vpandq %zmm23, %zmm16, %zmm2 + vpandq %zmm23, %zmm14, %zmm0 + vpaddq %zmm17, %zmm19, %zmm17 + vpaddq %zmm1, %zmm20, %zmm1 + vpsrlq $26, %zmm17, %zmm19 + vpandq %zmm23, %zmm17, %zmm3 + vpaddq %zmm4, %zmm19, %zmm4 + vshufi64x2 $0x4e, %zmm0, %zmm0, %zmm14 + vshufi64x2 $0x4e, %zmm1, %zmm1, %zmm15 + vshufi64x2 $0x4e, %zmm2, %zmm2, %zmm16 + vshufi64x2 $0x4e, %zmm3, %zmm3, %zmm17 + vshufi64x2 $0x4e, %zmm4, %zmm4, %zmm18 + vpaddq %zmm0, %zmm14, %zmm0 + vpaddq %zmm1, %zmm15, %zmm1 + vpaddq %zmm2, %zmm16, %zmm2 + vpaddq %zmm3, %zmm17, %zmm3 + vpaddq %zmm4, %zmm18, %zmm4 + vpsrldq $8, %zmm0, %zmm14 + vpsrldq $8, %zmm1, %zmm15 + vpsrldq $8, %zmm2, %zmm16 + vpsrldq $8, %zmm3, %zmm17 + vpsrldq $8, %zmm4, %zmm18 + vpaddq %zmm0, %zmm14, %zmm0 + vpaddq %zmm1, %zmm15, %zmm1 + vpaddq %zmm2, %zmm16, %zmm2 + vpaddq %zmm3, %zmm17, %zmm3 + vpaddq %zmm4, %zmm18, %zmm4 + vpermq $2, %zmm0, %zmm14 + vpermq $2, %zmm1, %zmm15 + vpermq $2, %zmm2, %zmm16 + vpermq $2, %zmm3, %zmm17 + vpermq $2, %zmm4, %zmm18 + vpaddq %zmm0, %zmm14, %zmm0 + vpaddq %zmm1, %zmm15, %zmm1 + vpaddq %zmm2, %zmm16, %zmm2 + vpaddq %zmm3, %zmm17, %zmm3 + vpaddq %zmm4, %zmm18, %zmm4 + vmovd %xmm0, %r8d + vmovd %xmm1, %r9d + vmovd %xmm2, %r10d + vmovd %xmm3, %r11d + vmovd %xmm4, %r12d + jmp L_poly1305_avx512_blocks_end_calc +L_poly1305_avx512_blocks_start: + vmovdqu64 (%rsi), %zmm25 + vmovdqu64 64(%rsi), %zmm26 + vmovdqu64 (%r14), %zmm27 + vpermi2d %zmm26, %zmm25, %zmm27 + vpmovzxdq %ymm27, %zmm14 + vmovdqu64 64(%r14), %zmm27 + vpermi2d %zmm26, %zmm25, %zmm27 + vpmovzxdq %ymm27, %zmm15 + vmovdqu64 128(%r14), %zmm27 + vpermi2d %zmm26, %zmm25, %zmm27 + vpmovzxdq %ymm27, %zmm16 + vmovdqu64 192(%r14), %zmm27 + vpermi2d %zmm26, %zmm25, %zmm27 + vpmovzxdq %ymm27, %zmm17 + vmovdqu64 (%r13), %zmm18 + vpsllq $6, %zmm15, %zmm15 + vpsllq $12, %zmm16, %zmm16 + vpsllq $18, %zmm17, %zmm17 + vpmuludq %zmm10, %zmm4, %zmm19 + vpaddq %zmm14, %zmm19, %zmm14 + vpmuludq %zmm11, %zmm3, %zmm19 + vpmuludq %zmm11, %zmm4, %zmm20 + vpaddq %zmm15, %zmm20, %zmm15 + vpmuludq %zmm12, %zmm3, %zmm20 + vpmuludq %zmm12, %zmm4, %zmm21 + vpaddq %zmm16, %zmm21, %zmm16 + vpaddq %zmm14, %zmm19, %zmm14 + vpmuludq %zmm12, %zmm2, %zmm21 + vpmuludq %zmm13, %zmm4, %zmm22 + vpaddq %zmm17, %zmm22, %zmm17 + vpaddq %zmm15, %zmm20, %zmm15 + vpmuludq %zmm13, %zmm1, %zmm22 + vpmuludq %zmm13, %zmm2, %zmm19 + vpaddq %zmm14, %zmm21, %zmm14 + vpmuludq %zmm13, %zmm3, %zmm20 + vpmuludq %zmm5, %zmm3, %zmm21 + vpaddq %zmm14, %zmm22, %zmm14 + vpmuludq %zmm5, %zmm4, %zmm22 + vpaddq %zmm18, %zmm22, %zmm18 + vpaddq %zmm15, %zmm19, %zmm15 + vpmuludq %zmm5, %zmm0, %zmm22 + vpaddq %zmm16, %zmm20, %zmm16 + vpmuludq %zmm5, %zmm1, %zmm19 + vpaddq %zmm17, %zmm21, %zmm17 + vpmuludq %zmm5, %zmm2, %zmm20 + vpmuludq %zmm6, %zmm2, %zmm21 + vpaddq %zmm14, %zmm22, %zmm14 + vpmuludq %zmm6, %zmm3, %zmm22 + vpaddq %zmm15, %zmm19, %zmm15 + vpmuludq %zmm6, %zmm0, %zmm19 + vpaddq %zmm16, %zmm20, %zmm16 + vpmuludq %zmm6, %zmm1, %zmm20 + vpaddq %zmm17, %zmm21, %zmm17 + vpmuludq %zmm7, %zmm1, %zmm21 + vpaddq %zmm18, %zmm22, %zmm18 + vpmuludq %zmm7, %zmm2, %zmm22 + vpaddq %zmm15, %zmm19, %zmm15 + vpmuludq %zmm7, %zmm0, %zmm19 + vpaddq %zmm16, %zmm20, %zmm16 + vpmuludq %zmm8, %zmm0, %zmm20 + vpaddq %zmm17, %zmm21, %zmm17 + vpmuludq %zmm8, %zmm1, %zmm21 + vpaddq %zmm18, %zmm22, %zmm18 + vpaddq %zmm16, %zmm19, %zmm16 + vpmuludq %zmm9, %zmm0, %zmm22 + vpaddq %zmm17, %zmm20, %zmm17 + vpaddq %zmm18, %zmm21, %zmm18 + vpaddq %zmm18, %zmm22, %zmm18 + vpsrlq $26, %zmm14, %zmm19 + vpsrlq $26, %zmm17, %zmm20 + vpandq %zmm23, %zmm14, %zmm14 + vpandq %zmm23, %zmm17, %zmm17 + vpaddq %zmm15, %zmm19, %zmm15 + vpaddq %zmm18, %zmm20, %zmm18 + vpsrlq $26, %zmm15, %zmm19 + vpsrlq $26, %zmm18, %zmm20 + vpandq %zmm23, %zmm15, %zmm1 + vpandq %zmm23, %zmm18, %zmm4 + vpaddq %zmm16, %zmm19, %zmm16 + vpslld $2, %zmm20, %zmm21 + vpaddd %zmm21, %zmm20, %zmm21 + vpsrlq $26, %zmm16, %zmm19 + vpaddq %zmm14, %zmm21, %zmm14 + vpsrlq $26, %zmm14, %zmm20 + vpandq %zmm23, %zmm16, %zmm2 + vpandq %zmm23, %zmm14, %zmm0 + vpaddq %zmm17, %zmm19, %zmm17 + vpaddq %zmm1, %zmm20, %zmm1 + vpsrlq $26, %zmm17, %zmm19 + vpandq %zmm23, %zmm17, %zmm3 + vpaddq %zmm4, %zmm19, %zmm4 + addq $0x80, %rsi + subq $0x80, %rdx + jnz L_poly1305_avx512_blocks_start +L_poly1305_avx512_blocks_store: + # Store eight H values - state + vpmovqd %zmm0, (%rax) + vpmovqd %zmm1, 32(%rax) + vpmovqd %zmm2, 64(%rax) + vpmovqd %zmm3, 96(%rax) + vpmovqd %zmm4, 128(%rax) +L_poly1305_avx512_blocks_end_calc: + cmpb $0x00, 616(%rdi) + je L_poly1305_avx512_blocks_complete + movq %r8, %rax + movq %r10, %rdx + movq %r12, %rcx + shrq $12, %rdx + shrq $24, %rcx + shlq $26, %r9 + shlq $52, %r10 + shlq $14, %r11 + shlq $40, %r12 + addq %r9, %rax + adcq %r10, %rax + adcq %r11, %rdx + adcq %r12, %rdx + adcq $0x00, %rcx + movq %rcx, %r8 + andq $3, %rcx + shrq $2, %r8 + leaq 0(%r8,%r8,4), %r8 + addq %r8, %rax + adcq $0x00, %rdx + adcq $0x00, %rcx + movq %rax, 24(%rdi) + movq %rdx, 32(%rdi) + movq %rcx, 40(%rdi) +L_poly1305_avx512_blocks_complete: + movb $0x01, 617(%rdi) + vzeroupper + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size poly1305_blocks_avx512,.-poly1305_blocks_avx512 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl poly1305_final_avx512 +.type poly1305_final_avx512,@function +.align 16 +poly1305_final_avx512: +#else +.section __TEXT,__text +.globl _poly1305_final_avx512 +.p2align 4 +_poly1305_final_avx512: +#endif /* __APPLE__ */ + movb $0x01, 616(%rdi) + movb 617(%rdi), %cl + cmpb $0x00, %cl + je L_poly1305_avx512_final_done_blocks_X8 + pushq %rsi + movq $0x80, %rdx + xorq %rsi, %rsi +#ifndef __APPLE__ + callq poly1305_blocks_avx512@plt +#else + callq _poly1305_blocks_avx512 +#endif /* __APPLE__ */ + popq %rsi +L_poly1305_avx512_final_done_blocks_X8: + movq 608(%rdi), %rax + movq %rax, %rcx + andq $-16, %rcx + cmpb $0x00, %cl + je L_poly1305_avx512_final_done_blocks + pushq %rcx + pushq %rax + pushq %rsi + movq %rcx, %rdx + leaq 480(%rdi), %rsi +#ifndef __APPLE__ + callq poly1305_blocks_avx@plt +#else + callq _poly1305_blocks_avx +#endif /* __APPLE__ */ + popq %rsi + popq %rax + popq %rcx +L_poly1305_avx512_final_done_blocks: + subq %rcx, 608(%rdi) + xorq %rdx, %rdx + jmp L_poly1305_avx512_final_cmp_copy +L_poly1305_avx512_final_start_copy: + movb 480(%rdi,%rcx,1), %r8b + movb %r8b, 480(%rdi,%rdx,1) + incb %cl + incb %dl +L_poly1305_avx512_final_cmp_copy: + cmpb %cl, %al + jne L_poly1305_avx512_final_start_copy +#ifndef __APPLE__ + callq poly1305_final_avx@plt +#else + callq _poly1305_final_avx +#endif /* __APPLE__ */ + vpxor %xmm0, %xmm0, %xmm0 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm0, 160(%rdi) + vmovdqu %ymm0, 192(%rdi) + vmovdqu %ymm0, 224(%rdi) + vmovdqu %ymm0, 256(%rdi) + vmovdqu %ymm0, 288(%rdi) + vmovdqu %ymm0, 320(%rdi) + vmovdqu %ymm0, 624(%rdi) + vmovdqu %ymm0, 656(%rdi) + vmovdqu %ymm0, 688(%rdi) + vmovdqu %ymm0, 720(%rdi) + movq $0x00, 608(%rdi) + movw $0x00, 616(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size poly1305_final_avx512,.-poly1305_final_avx512 +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX512 */ +#ifdef HAVE_INTEL_AVX512 +#ifndef __APPLE__ +.text +.globl poly1305_calc_powers_avx512ifma +.type poly1305_calc_powers_avx512ifma,@function +.align 16 +poly1305_calc_powers_avx512ifma: +#else +.section __TEXT,__text +.globl _poly1305_calc_powers_avx512ifma +.p2align 4 +_poly1305_calc_powers_avx512ifma: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + subq $0x60, %rsp + movq (%rdi), %rcx + movq 8(%rdi), %r8 + xorq %r9, %r9 + # Convert to 44 bits in 64 + movq %rcx, %rax + shlq $20, %rax + shrq $20, %rax + movq %rcx, %rdx + shrdq $44, %r8, %rdx + shlq $20, %rdx + shrq $20, %rdx + movq %r8, %rsi + shrdq $24, %r9, %rsi + movq %rax, 224(%rdi) + movq %rdx, 232(%rdi) + movq %rsi, 240(%rdi) + movq %rcx, (%rsp) + movq %r8, 8(%rsp) + movq %r9, 16(%rsp) + # Square 128-bit + movq %r8, %rax + mulq %rcx + xorq %r13, %r13 + movq %rax, %r11 + movq %rdx, %r12 + addq %rax, %r11 + adcq %rdx, %r12 + adcq $0x00, %r13 + movq %rcx, %rax + mulq %rax + movq %rax, %r10 + movq %rdx, %r15 + movq %r8, %rax + mulq %rax + addq %r15, %r11 + adcq %rax, %r12 + adcq %rdx, %r13 + # Reduce 256-bit to 130-bit + movq %r12, %rax + movq %r13, %rdx + andq $-4, %rax + andq $3, %r12 + addq %rax, %r10 + adcq %rdx, %r11 + adcq $0x00, %r12 + shrdq $2, %rdx, %rax + shrq $2, %rdx + addq %rax, %r10 + adcq %rdx, %r11 + adcq $0x00, %r12 + movq %r12, %rax + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + andq $3, %r12 + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + # Convert to 44 bits in 64 + movq %r10, %rax + shlq $20, %rax + shrq $20, %rax + movq %r10, %rdx + shrdq $44, %r11, %rdx + shlq $20, %rdx + shrq $20, %rdx + movq %r11, %rsi + shrdq $24, %r12, %rsi + movq %rax, 256(%rdi) + movq %rdx, 264(%rdi) + movq %rsi, 272(%rdi) + movq %r10, 24(%rsp) + movq %r11, 32(%rsp) + movq %r12, 40(%rsp) + # Multiply 128-bit by 130-bit + # r1[0] * r2[0] + movq %rcx, %rax + mulq %r10 + movq %rax, %r13 + movq %rdx, %r14 + # r1[0] * r2[1] + movq %rcx, %rax + mulq %r11 + movq $0x00, %r15 + addq %rax, %r14 + adcq %rdx, %r15 + # r1[1] * r2[0] + movq %r8, %rax + mulq %r10 + movq $0x00, %rsi + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rsi + # r1[0] * r2[2] + movq %rcx, %rax + mulq %r12 + addq %rax, %r15 + adcq %rdx, %rsi + # r1[1] * r2[1] + movq %r8, %rax + mulq %r11 + movq $0x00, %rbx + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[1] * r2[2] + movq %r8, %rax + mulq %r12 + addq %rax, %rsi + adcq %rdx, %rbx + # Reduce 260-bit to 130-bit + movq %r15, %rax + movq %rsi, %rdx + andq $-4, %rax + andq $3, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + shrdq $2, %rdx, %rax + shrdq $2, %rbx, %rdx + shrq $2, %rbx + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + movq %r15, %rax + andq $3, %r15 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + # Convert to 44 bits in 64 + movq %r13, %rax + shlq $20, %rax + shrq $20, %rax + movq %r13, %rdx + shrdq $44, %r14, %rdx + shlq $20, %rdx + shrq $20, %rdx + movq %r14, %rsi + shrdq $24, %r15, %rsi + movq %rax, 288(%rdi) + movq %rdx, 296(%rdi) + movq %rsi, 304(%rdi) + movq %r13, 48(%rsp) + movq %r14, 56(%rsp) + movq %r15, 64(%rsp) + # Square 130-bit + movq %r11, %rax + mulq %r10 + xorq %r13, %r13 + movq %rax, %r8 + movq %rdx, %r9 + addq %rax, %r8 + adcq %rdx, %r9 + adcq $0x00, %r13 + movq %r10, %rax + mulq %rax + movq %rax, %rcx + movq %rdx, %r15 + movq %r11, %rax + mulq %rax + addq %r15, %r8 + adcq %rax, %r9 + adcq %rdx, %r13 + movq %r12, %rax + mulq %rax + movq %rax, %r14 + movq %r12, %rax + mulq %r10 + addq %rax, %r9 + adcq %rdx, %r13 + adcq $0x00, %r14 + addq %rax, %r9 + adcq %rdx, %r13 + adcq $0x00, %r14 + movq %r12, %rax + mulq %r11 + addq %rax, %r13 + adcq %rdx, %r14 + addq %rax, %r13 + adcq %rdx, %r14 + # Reduce 260-bit to 130-bit + movq %r9, %rax + movq %r13, %rdx + movq %r14, %r15 + andq $-4, %rax + andq $3, %r9 + addq %rax, %rcx + adcq %rdx, %r8 + adcq %r15, %r9 + shrdq $2, %rdx, %rax + shrdq $2, %r15, %rdx + shrq $2, %r15 + addq %rax, %rcx + adcq %rdx, %r8 + adcq %r15, %r9 + movq %r9, %rax + andq $3, %r9 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %rcx + adcq $0x00, %r8 + adcq $0x00, %r9 + # Convert to 44 bits in 64 + movq %rcx, %rax + shlq $20, %rax + shrq $20, %rax + movq %rcx, %rdx + shrdq $44, %r8, %rdx + shlq $20, %rdx + shrq $20, %rdx + movq %r8, %rsi + shrdq $24, %r9, %rsi + movq %rax, 320(%rdi) + movq %rdx, 328(%rdi) + movq %rsi, 336(%rdi) + movq %rcx, 72(%rsp) + movq %r8, 80(%rsp) + movq %r9, 88(%rsp) + movq (%rsp), %r10 + movq 8(%rsp), %r11 + movq 16(%rsp), %r12 + # Multiply 128-bit by 130-bit + # r1[0] * r2[0] + movq %r10, %rax + mulq %rcx + movq %rax, %r13 + movq %rdx, %r14 + # r1[0] * r2[1] + movq %r10, %rax + mulq %r8 + movq $0x00, %r15 + addq %rax, %r14 + adcq %rdx, %r15 + # r1[1] * r2[0] + movq %r11, %rax + mulq %rcx + movq $0x00, %rsi + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rsi + # r1[0] * r2[2] + movq %r10, %rax + mulq %r9 + addq %rax, %r15 + adcq %rdx, %rsi + # r1[1] * r2[1] + movq %r11, %rax + mulq %r8 + movq $0x00, %rbx + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[1] * r2[2] + movq %r11, %rax + mulq %r9 + addq %rax, %rsi + adcq %rdx, %rbx + # Reduce 260-bit to 130-bit + movq %r15, %rax + movq %rsi, %rdx + andq $-4, %rax + andq $3, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + shrdq $2, %rdx, %rax + shrdq $2, %rbx, %rdx + shrq $2, %rbx + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + movq %r15, %rax + andq $3, %r15 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + # Convert to 44 bits in 64 + movq %r13, %rax + shlq $20, %rax + shrq $20, %rax + movq %r13, %rdx + shrdq $44, %r14, %rdx + shlq $20, %rdx + shrq $20, %rdx + movq %r14, %rsi + shrdq $24, %r15, %rsi + movq %rax, 624(%rdi) + movq %rdx, 632(%rdi) + movq %rsi, 640(%rdi) + # Square 130-bit + movq %r8, %rax + mulq %rcx + xorq %r13, %r13 + movq %rax, %r11 + movq %rdx, %r12 + addq %rax, %r11 + adcq %rdx, %r12 + adcq $0x00, %r13 + movq %rcx, %rax + mulq %rax + movq %rax, %r10 + movq %rdx, %r15 + movq %r8, %rax + mulq %rax + addq %r15, %r11 + adcq %rax, %r12 + adcq %rdx, %r13 + movq %r9, %rax + mulq %rax + movq %rax, %r14 + movq %r9, %rax + mulq %rcx + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + movq %r9, %rax + mulq %r8 + addq %rax, %r13 + adcq %rdx, %r14 + addq %rax, %r13 + adcq %rdx, %r14 + # Reduce 260-bit to 130-bit + movq %r12, %rax + movq %r13, %rdx + movq %r14, %r15 + andq $-4, %rax + andq $3, %r12 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + shrdq $2, %rdx, %rax + shrdq $2, %r15, %rdx + shrq $2, %r15 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + movq %r12, %rax + andq $3, %r12 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + # Convert to 44 bits in 64 + movq %r10, %rax + shlq $20, %rax + shrq $20, %rax + movq %r10, %rdx + shrdq $44, %r11, %rdx + shlq $20, %rdx + shrq $20, %rdx + movq %r11, %rsi + shrdq $24, %r12, %rsi + movq %rax, 720(%rdi) + movq %rdx, 728(%rdi) + movq %rsi, 736(%rdi) + movq 48(%rsp), %rcx + movq 56(%rsp), %r8 + movq 64(%rsp), %r9 + # Square 130-bit + movq %r8, %rax + mulq %rcx + xorq %r13, %r13 + movq %rax, %r11 + movq %rdx, %r12 + addq %rax, %r11 + adcq %rdx, %r12 + adcq $0x00, %r13 + movq %rcx, %rax + mulq %rax + movq %rax, %r10 + movq %rdx, %r15 + movq %r8, %rax + mulq %rax + addq %r15, %r11 + adcq %rax, %r12 + adcq %rdx, %r13 + movq %r9, %rax + mulq %rax + movq %rax, %r14 + movq %r9, %rax + mulq %rcx + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + movq %r9, %rax + mulq %r8 + addq %rax, %r13 + adcq %rdx, %r14 + addq %rax, %r13 + adcq %rdx, %r14 + # Reduce 260-bit to 130-bit + movq %r12, %rax + movq %r13, %rdx + movq %r14, %r15 + andq $-4, %rax + andq $3, %r12 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + shrdq $2, %rdx, %rax + shrdq $2, %r15, %rdx + shrq $2, %r15 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + movq %r12, %rax + andq $3, %r12 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + # Convert to 44 bits in 64 + movq %r10, %rax + shlq $20, %rax + shrq $20, %rax + movq %r10, %rdx + shrdq $44, %r11, %rdx + shlq $20, %rdx + shrq $20, %rdx + movq %r11, %rsi + shrdq $24, %r12, %rsi + movq %rax, 656(%rdi) + movq %rdx, 664(%rdi) + movq %rsi, 672(%rdi) + movq (%rsp), %rcx + movq 8(%rsp), %r8 + movq 16(%rsp), %r9 + # Multiply 128-bit by 130-bit + # r1[0] * r2[0] + movq %rcx, %rax + mulq %r10 + movq %rax, %r13 + movq %rdx, %r14 + # r1[0] * r2[1] + movq %rcx, %rax + mulq %r11 + movq $0x00, %r15 + addq %rax, %r14 + adcq %rdx, %r15 + # r1[1] * r2[0] + movq %r8, %rax + mulq %r10 + movq $0x00, %rsi + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rsi + # r1[0] * r2[2] + movq %rcx, %rax + mulq %r12 + addq %rax, %r15 + adcq %rdx, %rsi + # r1[1] * r2[1] + movq %r8, %rax + mulq %r11 + movq $0x00, %rbx + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[1] * r2[2] + movq %r8, %rax + mulq %r12 + addq %rax, %rsi + adcq %rdx, %rbx + # Reduce 260-bit to 130-bit + movq %r15, %rax + movq %rsi, %rdx + andq $-4, %rax + andq $3, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + shrdq $2, %rdx, %rax + shrdq $2, %rbx, %rdx + shrq $2, %rbx + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + movq %r15, %rax + andq $3, %r15 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + # Convert to 44 bits in 64 + movq %r13, %rax + shlq $20, %rax + shrq $20, %rax + movq %r13, %rdx + shrdq $44, %r14, %rdx + shlq $20, %rdx + shrq $20, %rdx + movq %r14, %rsi + shrdq $24, %r15, %rsi + movq %rax, 688(%rdi) + movq %rdx, 696(%rdi) + movq %rsi, 704(%rdi) + addq $0x60, %rsp + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size poly1305_calc_powers_avx512ifma,.-poly1305_calc_powers_avx512ifma +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl poly1305_setkey_avx512ifma +.type poly1305_setkey_avx512ifma,@function +.align 16 +poly1305_setkey_avx512ifma: +#else +.section __TEXT,__text +.globl _poly1305_setkey_avx512ifma +.p2align 4 +_poly1305_setkey_avx512ifma: +#endif /* __APPLE__ */ +#ifndef __APPLE__ + callq poly1305_setkey_avx@plt +#else + callq _poly1305_setkey_avx +#endif /* __APPLE__ */ + vpxorq %zmm0, %zmm0, %zmm0 + vmovdqu64 %zmm0, 752(%rdi) + vmovdqu64 %zmm0, 816(%rdi) + vmovdqu64 %zmm0, 880(%rdi) + movq $0x00, 608(%rdi) + movw $0x00, 616(%rdi) + repz retq +#ifndef __APPLE__ +.size poly1305_setkey_avx512ifma,.-poly1305_setkey_avx512ifma +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512ifma_blocks_mask44: +.quad 0x00000fffffffffff,0x00000fffffffffff +.quad 0x00000fffffffffff,0x00000fffffffffff +.quad 0x00000fffffffffff,0x00000fffffffffff +.quad 0x00000fffffffffff,0x00000fffffffffff +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512ifma_blocks_mask24: +.quad 0x0000000000ffffff,0x0000000000ffffff +.quad 0x0000000000ffffff,0x0000000000ffffff +.quad 0x0000000000ffffff,0x0000000000ffffff +.quad 0x0000000000ffffff,0x0000000000ffffff +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512ifma_blocks_pad: +.quad 0x0000010000000000,0x0000010000000000 +.quad 0x0000010000000000,0x0000010000000000 +.quad 0x0000010000000000,0x0000010000000000 +.quad 0x0000010000000000,0x0000010000000000 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512ifma_blocks_idxeven: +.quad 0x0000000000000000,0x0000000000000002 +.quad 0x0000000000000004,0x0000000000000006 +.quad 0x0000000000000008,0x000000000000000a +.quad 0x000000000000000c,0x000000000000000e +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512ifma_blocks_idxodd: +.quad 0x0000000000000001,0x0000000000000003 +.quad 0x0000000000000005,0x0000000000000007 +.quad 0x0000000000000009,0x000000000000000b +.quad 0x000000000000000d,0x000000000000000f +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_poly1305_avx512ifma_blocks_rxidx: +.quad 0x000000000000000c,0x0000000000000008 +.quad 0x0000000000000004,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x000000000000000d,0x0000000000000009 +.quad 0x0000000000000005,0x0000000000000001 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x000000000000000e,0x000000000000000a +.quad 0x0000000000000006,0x0000000000000002 +.quad 0x0000000000000000,0x0000000000000000 +.quad 0x0000000000000000,0x0000000000000000 +#ifndef __APPLE__ +.text +.globl poly1305_blocks_avx512ifma +.type poly1305_blocks_avx512ifma,@function +.align 16 +poly1305_blocks_avx512ifma: +#else +.section __TEXT,__text +.globl _poly1305_blocks_avx512ifma +.p2align 4 +_poly1305_blocks_avx512ifma: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + leaq L_poly1305_avx512ifma_blocks_mask44(%rip), %r8 + leaq L_poly1305_avx512ifma_blocks_mask24(%rip), %r9 + leaq L_poly1305_avx512ifma_blocks_pad(%rip), %r10 + leaq L_poly1305_avx512ifma_blocks_idxeven(%rip), %r11 + leaq L_poly1305_avx512ifma_blocks_idxodd(%rip), %r12 + leaq L_poly1305_avx512ifma_blocks_rxidx(%rip), %r13 + vmovdqu64 (%r8), %zmm18 + cmpw $0x00, 616(%rdi) + jne L_poly1305_avx512ifma_blocks_begin_h + # First 8 blocks initialise the lanes directly. + vmovdqu64 (%rsi), %zmm14 + vmovdqu64 64(%rsi), %zmm15 + vmovdqu64 (%r11), %zmm16 + vpermi2q %zmm15, %zmm14, %zmm16 + vmovdqu64 (%r12), %zmm17 + vpermi2q %zmm15, %zmm14, %zmm17 + vpandq (%r8), %zmm16, %zmm0 + vpsrlq $44, %zmm16, %zmm14 + vpandq (%r9), %zmm17, %zmm15 + vpsllq $20, %zmm15, %zmm15 + vporq %zmm14, %zmm15, %zmm1 + vpsrlq $24, %zmm17, %zmm2 + vporq (%r10), %zmm2, %zmm2 + addq $0x80, %rsi + subq $0x80, %rdx + jz L_poly1305_avx512ifma_blocks_store + jmp L_poly1305_avx512ifma_blocks_load_r8 +L_poly1305_avx512ifma_blocks_begin_h: + vmovdqu64 752(%rdi), %zmm0 + vmovdqu64 816(%rdi), %zmm1 + vmovdqu64 880(%rdi), %zmm2 + cmpb $0x00, 616(%rdi) + je L_poly1305_avx512ifma_blocks_load_r8 + # Finished: load the 8 distinct powers r^8..r^1. + vmovdqu64 224(%rdi), %zmm8 + vmovdqu64 288(%rdi), %zmm9 + vmovdqu64 624(%rdi), %zmm10 + vmovdqu64 688(%rdi), %zmm11 + vmovdqu64 (%r13), %zmm12 + vpermi2q %zmm11, %zmm10, %zmm12 + vmovdqu64 (%r13), %zmm13 + vpermi2q %zmm9, %zmm8, %zmm13 + vinserti64x4 $0x01, %ymm13, %zmm12, %zmm3 + vmovdqu64 64(%r13), %zmm12 + vpermi2q %zmm11, %zmm10, %zmm12 + vmovdqu64 64(%r13), %zmm13 + vpermi2q %zmm9, %zmm8, %zmm13 + vinserti64x4 $0x01, %ymm13, %zmm12, %zmm4 + vmovdqu64 128(%r13), %zmm12 + vpermi2q %zmm11, %zmm10, %zmm12 + vmovdqu64 128(%r13), %zmm13 + vpermi2q %zmm9, %zmm8, %zmm13 + vinserti64x4 $0x01, %ymm13, %zmm12, %zmm5 + jmp L_poly1305_avx512ifma_blocks_do_mul +L_poly1305_avx512ifma_blocks_load_r8: + vpbroadcastq 720(%rdi), %zmm3 + vpbroadcastq 728(%rdi), %zmm4 + vpbroadcastq 736(%rdi), %zmm5 +L_poly1305_avx512ifma_blocks_do_mul: + vpsllq $2, %zmm4, %zmm14 + vpsllq $4, %zmm4, %zmm6 + vpaddq %zmm14, %zmm6, %zmm6 + vpsllq $2, %zmm5, %zmm14 + vpsllq $4, %zmm5, %zmm7 + vpaddq %zmm14, %zmm7, %zmm7 + cmpb $0x01, 616(%rdi) + jne L_poly1305_avx512ifma_blocks_start + # Finished: final multiply, collapse lanes, reduce to ctx->h. + vpxorq %zmm8, %zmm8, %zmm8 + vpxorq %zmm9, %zmm9, %zmm9 + vpxorq %zmm10, %zmm10, %zmm10 + vpxorq %zmm11, %zmm11, %zmm11 + vpxorq %zmm12, %zmm12, %zmm12 + vpxorq %zmm13, %zmm13, %zmm13 + vpmadd52luq %zmm3, %zmm0, %zmm8 + vpmadd52luq %zmm7, %zmm1, %zmm8 + vpmadd52luq %zmm6, %zmm2, %zmm8 + vpmadd52huq %zmm3, %zmm0, %zmm11 + vpmadd52huq %zmm7, %zmm1, %zmm11 + vpmadd52huq %zmm6, %zmm2, %zmm11 + vpmadd52luq %zmm4, %zmm0, %zmm9 + vpmadd52luq %zmm3, %zmm1, %zmm9 + vpmadd52luq %zmm7, %zmm2, %zmm9 + vpmadd52huq %zmm4, %zmm0, %zmm12 + vpmadd52huq %zmm3, %zmm1, %zmm12 + vpmadd52huq %zmm7, %zmm2, %zmm12 + vpmadd52luq %zmm5, %zmm0, %zmm10 + vpmadd52luq %zmm4, %zmm1, %zmm10 + vpmadd52luq %zmm3, %zmm2, %zmm10 + vpmadd52huq %zmm5, %zmm0, %zmm13 + vpmadd52huq %zmm4, %zmm1, %zmm13 + vpmadd52huq %zmm3, %zmm2, %zmm13 + vpsllq $8, %zmm11, %zmm14 + vpaddq %zmm9, %zmm14, %zmm9 + vpsllq $8, %zmm12, %zmm14 + vpaddq %zmm10, %zmm14, %zmm10 + vpsllq $8, %zmm13, %zmm15 + vpsllq $2, %zmm15, %zmm14 + vpsllq $4, %zmm15, %zmm15 + vpaddq %zmm14, %zmm15, %zmm15 + vpaddq %zmm8, %zmm15, %zmm8 + vpsrlq $44, %zmm8, %zmm14 + vpandq %zmm18, %zmm8, %zmm0 + vpaddq %zmm9, %zmm14, %zmm9 + vpsrlq $44, %zmm9, %zmm14 + vpandq %zmm18, %zmm9, %zmm1 + vpaddq %zmm10, %zmm14, %zmm10 + vpsrlq $44, %zmm10, %zmm14 + vpandq %zmm18, %zmm10, %zmm2 + vpsllq $2, %zmm14, %zmm15 + vpsllq $4, %zmm14, %zmm14 + vpaddq %zmm15, %zmm14, %zmm14 + vpaddq %zmm0, %zmm14, %zmm0 + vshufi64x2 $0x4e, %zmm0, %zmm0, %zmm14 + vshufi64x2 $0x4e, %zmm1, %zmm1, %zmm15 + vshufi64x2 $0x4e, %zmm2, %zmm2, %zmm16 + vpaddq %zmm0, %zmm14, %zmm0 + vpaddq %zmm1, %zmm15, %zmm1 + vpaddq %zmm2, %zmm16, %zmm2 + vpsrldq $8, %zmm0, %zmm14 + vpsrldq $8, %zmm1, %zmm15 + vpsrldq $8, %zmm2, %zmm16 + vpaddq %zmm0, %zmm14, %zmm0 + vpaddq %zmm1, %zmm15, %zmm1 + vpaddq %zmm2, %zmm16, %zmm2 + vpermq $2, %zmm0, %zmm14 + vpermq $2, %zmm1, %zmm15 + vpermq $2, %zmm2, %zmm16 + vpaddq %zmm0, %zmm14, %zmm0 + vpaddq %zmm1, %zmm15, %zmm1 + vpaddq %zmm2, %zmm16, %zmm2 + vmovq %xmm0, %rax + vmovq %xmm1, %rcx + vmovq %xmm2, %rdx + movq %rcx, %r9 + shrq $20, %r9 + movq %rdx, %r10 + shrq $40, %r10 + movq %rax, %r8 + movq %rcx, %rax + shlq $44, %rax + addq %rax, %r8 + adcq $0x00, %r9 + movq %rdx, %rax + shlq $24, %rax + addq %rax, %r9 + adcq $0x00, %r10 + movq %r10, %r14 + andq $3, %r10 + shrq $2, %r14 + leaq 0(%r14,%r14,4), %r14 + addq %r14, %r8 + adcq $0x00, %r9 + adcq $0x00, %r10 + movq %r8, 24(%rdi) + movq %r9, 32(%rdi) + movq %r10, 40(%rdi) + jmp L_poly1305_avx512ifma_blocks_end_calc +L_poly1305_avx512ifma_blocks_start: + vmovdqu64 (%rsi), %zmm14 + vmovdqu64 64(%rsi), %zmm15 + vmovdqu64 (%r11), %zmm16 + vpermi2q %zmm15, %zmm14, %zmm16 + vmovdqu64 (%r12), %zmm17 + vpermi2q %zmm15, %zmm14, %zmm17 + vpandq (%r8), %zmm16, %zmm8 + vpsrlq $44, %zmm16, %zmm14 + vpandq (%r9), %zmm17, %zmm15 + vpsllq $20, %zmm15, %zmm15 + vporq %zmm14, %zmm15, %zmm9 + vpsrlq $24, %zmm17, %zmm10 + vporq (%r10), %zmm10, %zmm10 + vpxorq %zmm11, %zmm11, %zmm11 + vpxorq %zmm12, %zmm12, %zmm12 + vpxorq %zmm13, %zmm13, %zmm13 + vpmadd52luq %zmm3, %zmm0, %zmm8 + vpmadd52luq %zmm7, %zmm1, %zmm8 + vpmadd52luq %zmm6, %zmm2, %zmm8 + vpmadd52huq %zmm3, %zmm0, %zmm11 + vpmadd52huq %zmm7, %zmm1, %zmm11 + vpmadd52huq %zmm6, %zmm2, %zmm11 + vpmadd52luq %zmm4, %zmm0, %zmm9 + vpmadd52luq %zmm3, %zmm1, %zmm9 + vpmadd52luq %zmm7, %zmm2, %zmm9 + vpmadd52huq %zmm4, %zmm0, %zmm12 + vpmadd52huq %zmm3, %zmm1, %zmm12 + vpmadd52huq %zmm7, %zmm2, %zmm12 + vpmadd52luq %zmm5, %zmm0, %zmm10 + vpmadd52luq %zmm4, %zmm1, %zmm10 + vpmadd52luq %zmm3, %zmm2, %zmm10 + vpmadd52huq %zmm5, %zmm0, %zmm13 + vpmadd52huq %zmm4, %zmm1, %zmm13 + vpmadd52huq %zmm3, %zmm2, %zmm13 + vpsllq $8, %zmm11, %zmm14 + vpaddq %zmm9, %zmm14, %zmm9 + vpsllq $8, %zmm12, %zmm14 + vpaddq %zmm10, %zmm14, %zmm10 + vpsllq $8, %zmm13, %zmm15 + vpsllq $2, %zmm15, %zmm14 + vpsllq $4, %zmm15, %zmm15 + vpaddq %zmm14, %zmm15, %zmm15 + vpaddq %zmm8, %zmm15, %zmm8 + vpsrlq $44, %zmm8, %zmm14 + vpandq %zmm18, %zmm8, %zmm0 + vpaddq %zmm9, %zmm14, %zmm9 + vpsrlq $44, %zmm9, %zmm14 + vpandq %zmm18, %zmm9, %zmm1 + vpaddq %zmm10, %zmm14, %zmm10 + vpsrlq $44, %zmm10, %zmm14 + vpandq %zmm18, %zmm10, %zmm2 + vpsllq $2, %zmm14, %zmm15 + vpsllq $4, %zmm14, %zmm14 + vpaddq %zmm15, %zmm14, %zmm14 + vpaddq %zmm0, %zmm14, %zmm0 + addq $0x80, %rsi + subq $0x80, %rdx + jnz L_poly1305_avx512ifma_blocks_start +L_poly1305_avx512ifma_blocks_store: + vmovdqu64 %zmm0, 752(%rdi) + vmovdqu64 %zmm1, 816(%rdi) + vmovdqu64 %zmm2, 880(%rdi) +L_poly1305_avx512ifma_blocks_end_calc: +L_poly1305_avx512ifma_blocks_complete: + movb $0x01, 617(%rdi) + vzeroupper + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size poly1305_blocks_avx512ifma,.-poly1305_blocks_avx512ifma +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl poly1305_final_avx512ifma +.type poly1305_final_avx512ifma,@function +.align 16 +poly1305_final_avx512ifma: +#else +.section __TEXT,__text +.globl _poly1305_final_avx512ifma +.p2align 4 +_poly1305_final_avx512ifma: +#endif /* __APPLE__ */ + movb $0x01, 616(%rdi) + movb 617(%rdi), %cl + cmpb $0x00, %cl + je L_poly1305_avx512ifma_final_done_blocks_8 + pushq %rsi + movq $0x80, %rdx + xorq %rsi, %rsi +#ifndef __APPLE__ + callq poly1305_blocks_avx512ifma@plt +#else + callq _poly1305_blocks_avx512ifma +#endif /* __APPLE__ */ + popq %rsi +L_poly1305_avx512ifma_final_done_blocks_8: + movq 608(%rdi), %rax + movq %rax, %rcx + andq $-16, %rcx + cmpb $0x00, %cl + je L_poly1305_avx512ifma_final_done_blocks + pushq %rcx + pushq %rax + pushq %rsi + movq %rcx, %rdx + leaq 480(%rdi), %rsi +#ifndef __APPLE__ + callq poly1305_blocks_avx@plt +#else + callq _poly1305_blocks_avx +#endif /* __APPLE__ */ + popq %rsi + popq %rax + popq %rcx +L_poly1305_avx512ifma_final_done_blocks: + subq %rcx, 608(%rdi) + xorq %rdx, %rdx + jmp L_poly1305_avx512ifma_final_cmp_copy +L_poly1305_avx512ifma_final_start_copy: + movb 480(%rdi,%rcx,1), %r8b + movb %r8b, 480(%rdi,%rdx,1) + incb %cl + incb %dl +L_poly1305_avx512ifma_final_cmp_copy: + cmpb %cl, %al + jne L_poly1305_avx512ifma_final_start_copy +#ifndef __APPLE__ + callq poly1305_final_avx@plt +#else + callq _poly1305_final_avx +#endif /* __APPLE__ */ + vpxorq %zmm0, %zmm0, %zmm0 + vmovdqu %ymm0, 224(%rdi) + vmovdqu %ymm0, 256(%rdi) + vmovdqu %ymm0, 288(%rdi) + vmovdqu %ymm0, 320(%rdi) + vmovdqu %ymm0, 624(%rdi) + vmovdqu %ymm0, 656(%rdi) + vmovdqu %ymm0, 688(%rdi) + vmovdqu %ymm0, 720(%rdi) + vmovdqu64 %zmm0, 752(%rdi) + vmovdqu64 %zmm0, 816(%rdi) + vmovdqu64 %zmm0, 880(%rdi) + movq $0x00, 608(%rdi) + movw $0x00, 616(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size poly1305_final_avx512ifma,.-poly1305_final_avx512ifma +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl poly1305_fold_avx512ifma +.type poly1305_fold_avx512ifma,@function +.align 16 +poly1305_fold_avx512ifma: +#else +.section __TEXT,__text +.globl _poly1305_fold_avx512ifma +.p2align 4 +_poly1305_fold_avx512ifma: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + subq $0x40, %rsp + movl %esi, 24(%rsp) + movq (%rdi), %rcx + movq 8(%rdi), %r8 + xorq %r9, %r9 + movq %rcx, (%rsp) + movq %r8, 8(%rsp) + movq %r9, 16(%rsp) + bsrq %rsi, %rax + movq %rax, 32(%rsp) +L_poly1305_fold_loop: + movq 32(%rsp), %rax + testq %rax, %rax + jz L_poly1305_fold_done + decq %rax + movq %rax, 32(%rsp) + movq (%rsp), %rcx + movq 8(%rsp), %r8 + movq 16(%rsp), %r9 + # Square 130-bit + movq %r8, %rax + mulq %rcx + xorq %r13, %r13 + movq %rax, %r11 + movq %rdx, %r12 + addq %rax, %r11 + adcq %rdx, %r12 + adcq $0x00, %r13 + movq %rcx, %rax + mulq %rax + movq %rax, %r10 + movq %rdx, %r15 + movq %r8, %rax + mulq %rax + addq %r15, %r11 + adcq %rax, %r12 + adcq %rdx, %r13 + movq %r9, %rax + mulq %rax + movq %rax, %r14 + movq %r9, %rax + mulq %rcx + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + movq %r9, %rax + mulq %r8 + addq %rax, %r13 + adcq %rdx, %r14 + addq %rax, %r13 + adcq %rdx, %r14 + # Reduce 260-bit to 130-bit + movq %r12, %rax + movq %r13, %rdx + movq %r14, %r15 + andq $-4, %rax + andq $3, %r12 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + shrdq $2, %rdx, %rax + shrdq $2, %r15, %rdx + shrq $2, %r15 + addq %rax, %r10 + adcq %rdx, %r11 + adcq %r15, %r12 + movq %r12, %rax + andq $3, %r12 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + movq %r10, (%rsp) + movq %r11, 8(%rsp) + movq %r12, 16(%rsp) + movl 24(%rsp), %eax + movq 32(%rsp), %rdx + btq %rdx, %rax + jnc L_poly1305_fold_skip + movq (%rdi), %rcx + movq 8(%rdi), %r8 + xorq %r9, %r9 + movq (%rsp), %r10 + movq 8(%rsp), %r11 + movq 16(%rsp), %r12 + # Multiply 128-bit by 130-bit + # r1[0] * r2[0] + movq %rcx, %rax + mulq %r10 + movq %rax, %r13 + movq %rdx, %r14 + # r1[0] * r2[1] + movq %rcx, %rax + mulq %r11 + movq $0x00, %r15 + addq %rax, %r14 + adcq %rdx, %r15 + # r1[1] * r2[0] + movq %r8, %rax + mulq %r10 + movq $0x00, %rsi + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rsi + # r1[0] * r2[2] + movq %rcx, %rax + mulq %r12 + addq %rax, %r15 + adcq %rdx, %rsi + # r1[1] * r2[1] + movq %r8, %rax + mulq %r11 + movq $0x00, %rbx + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[1] * r2[2] + movq %r8, %rax + mulq %r12 + addq %rax, %rsi + adcq %rdx, %rbx + # Reduce 260-bit to 130-bit + movq %r15, %rax + movq %rsi, %rdx + andq $-4, %rax + andq $3, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + shrdq $2, %rdx, %rax + shrdq $2, %rbx, %rdx + shrq $2, %rbx + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbx, %r15 + movq %r15, %rax + andq $3, %r15 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + movq %r13, (%rsp) + movq %r14, 8(%rsp) + movq %r15, 16(%rsp) +L_poly1305_fold_skip: + jmp L_poly1305_fold_loop +L_poly1305_fold_done: + movq 64(%rdi), %rcx + movq 72(%rdi), %r8 + movq 80(%rdi), %r9 + movq (%rsp), %r10 + movq 8(%rsp), %r11 + movq 16(%rsp), %r12 + # Multiply 130-bit by 130-bit + movq $0x00, %r13 + movq $0x00, %r14 + movq $0x00, %r15 + movq $0x00, %rsi + movq $0x00, %rbx + # r1[0] * r2[0] + movq %rcx, %rax + mulq %r10 + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + adcq $0x00, %rsi + adcq $0x00, %rbx + # r1[0] * r2[1] + movq %rcx, %rax + mulq %r11 + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rsi + adcq $0x00, %rbx + # r1[0] * r2[2] + movq %rcx, %rax + mulq %r12 + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[1] * r2[0] + movq %r8, %rax + mulq %r10 + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rsi + adcq $0x00, %rbx + # r1[1] * r2[1] + movq %r8, %rax + mulq %r11 + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[1] * r2[2] + movq %r8, %rax + mulq %r12 + addq %rax, %rsi + adcq %rdx, %rbx + # r1[2] * r2[0] + movq %r9, %rax + mulq %r10 + addq %rax, %r15 + adcq %rdx, %rsi + adcq $0x00, %rbx + # r1[2] * r2[1] + movq %r9, %rax + mulq %r11 + addq %rax, %rsi + adcq %rdx, %rbx + # r1[2] * r2[2] + movq %r9, %rax + mulq %r12 + addq %rax, %rbx + # Reduce 260-bit to 130-bit + movq %r15, %rax + movq %rsi, %rdx + movq %rbx, %rbp + andq $-4, %rax + andq $3, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbp, %r15 + shrdq $2, %rdx, %rax + shrdq $2, %rbp, %rdx + shrq $2, %rbp + addq %rax, %r13 + adcq %rdx, %r14 + adcq %rbp, %r15 + movq %r15, %rax + andq $3, %r15 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + movq 24(%rdi), %rax + addq %rax, %r13 + movq 32(%rdi), %rax + adcq %rax, %r14 + movq 40(%rdi), %rax + adcq %rax, %r15 + movq %r15, %rax + andq $3, %r15 + shrq $2, %rax + leaq 0(%rax,%rax,4), %rax + addq %rax, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + movq %r13, 24(%rdi) + movq %r14, 32(%rdi) + movq %r15, 40(%rdi) + addq $0x40, %rsp + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size poly1305_fold_avx512ifma,.-poly1305_fold_avx512ifma +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX512 */ #endif /* WOLFSSL_X86_64_BUILD */ #if defined(__linux__) && defined(__ELF__) diff --git a/wolfcrypt/src/poly1305_asm.asm b/wolfcrypt/src/poly1305_asm.asm index ae34937a184..91bfdd7efee 100644 --- a/wolfcrypt/src/poly1305_asm.asm +++ b/wolfcrypt/src/poly1305_asm.asm @@ -1057,4 +1057,2349 @@ L_poly1305_avx2_final_cmp_copy: poly1305_final_avx2 ENDP _TEXT ENDS ENDIF +IFDEF HAVE_INTEL_AVX512 +_TEXT SEGMENT READONLY PARA +poly1305_calc_powers_avx512 PROC + push r12 + push r13 + push r14 + push r15 + push rdi + push rsi + push rbx + push rbp + sub rsp, 96 + mov r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+8] + xor r10, r10 + ; Convert to 26 bits in 32 + mov rax, r8 + mov rdx, r8 + mov rsi, r8 + mov rbx, r9 + mov rbp, r9 + shr rdx, 26 + shrd rsi, r9, 52 + shr rbx, 14 + shrd rbp, r10, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+224], eax + mov DWORD PTR [rcx+228], edx + mov DWORD PTR [rcx+232], esi + mov DWORD PTR [rcx+236], ebx + mov DWORD PTR [rcx+240], ebp + mov DWORD PTR [rcx+244], 0 + mov QWORD PTR [rsp], r8 + mov QWORD PTR [rsp+8], r9 + mov QWORD PTR [rsp+16], r10 + ; Square 128-bit + mov rax, r9 + mul r8 + xor r14, r14 + mov r12, rax + mov r13, rdx + add r12, rax + adc r13, rdx + adc r14, 0 + mov rax, r8 + mul rax + mov r11, rax + mov rdi, rdx + mov rax, r9 + mul rax + add r12, rdi + adc r13, rax + adc r14, rdx + ; Reduce 256-bit to 130-bit + mov rax, r13 + mov rdx, r14 + and rax, -4 + and r13, 3 + add r11, rax + adc r12, rdx + adc r13, 0 + shrd rax, rdx, 2 + shr rdx, 2 + add r11, rax + adc r12, rdx + adc r13, 0 + mov rax, r13 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + and r13, 3 + add r11, rax + adc r12, 0 + adc r13, 0 + ; Convert to 26 bits in 32 + mov rax, r11 + mov rdx, r11 + mov rsi, r11 + mov rbx, r12 + mov rbp, r12 + shr rdx, 26 + shrd rsi, r12, 52 + shr rbx, 14 + shrd rbp, r13, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+256], eax + mov DWORD PTR [rcx+260], edx + mov DWORD PTR [rcx+264], esi + mov DWORD PTR [rcx+268], ebx + mov DWORD PTR [rcx+272], ebp + mov DWORD PTR [rcx+276], 0 + mov QWORD PTR [rsp+24], r11 + mov QWORD PTR [rsp+32], r12 + mov QWORD PTR [rsp+40], r13 + ; Multiply 128-bit by 130-bit + ; r1[0] * r2[0] + mov rax, r8 + mul r11 + mov r14, rax + mov r15, rdx + ; r1[0] * r2[1] + mov rax, r8 + mul r12 + mov rdi, 0 + add r15, rax + adc rdi, rdx + ; r1[1] * r2[0] + mov rax, r9 + mul r11 + mov rsi, 0 + add r15, rax + adc rdi, rdx + adc rsi, 0 + ; r1[0] * r2[2] + mov rax, r8 + mul r13 + add rdi, rax + adc rsi, rdx + ; r1[1] * r2[1] + mov rax, r9 + mul r12 + mov rbx, 0 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[2] + mov rax, r9 + mul r13 + add rsi, rax + adc rbx, rdx + ; Reduce 260-bit to 130-bit + mov rax, rdi + mov rdx, rsi + and rax, -4 + and rdi, 3 + add r14, rax + adc r15, rdx + adc rdi, rbx + shrd rax, rdx, 2 + shrd rdx, rbx, 2 + shr rbx, 2 + add r14, rax + adc r15, rdx + adc rdi, rbx + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + ; Convert to 26 bits in 32 + mov rax, r14 + mov rdx, r14 + mov rsi, r14 + mov rbx, r15 + mov rbp, r15 + shr rdx, 26 + shrd rsi, r15, 52 + shr rbx, 14 + shrd rbp, rdi, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+288], eax + mov DWORD PTR [rcx+292], edx + mov DWORD PTR [rcx+296], esi + mov DWORD PTR [rcx+300], ebx + mov DWORD PTR [rcx+304], ebp + mov DWORD PTR [rcx+308], 0 + mov QWORD PTR [rsp+48], r14 + mov QWORD PTR [rsp+56], r15 + mov QWORD PTR [rsp+64], rdi + ; Square 130-bit + mov rax, r12 + mul r11 + xor r14, r14 + mov r9, rax + mov r10, rdx + add r9, rax + adc r10, rdx + adc r14, 0 + mov rax, r11 + mul rax + mov r8, rax + mov rdi, rdx + mov rax, r12 + mul rax + add r9, rdi + adc r10, rax + adc r14, rdx + mov rax, r13 + mul rax + mov r15, rax + mov rax, r13 + mul r11 + add r10, rax + adc r14, rdx + adc r15, 0 + add r10, rax + adc r14, rdx + adc r15, 0 + mov rax, r13 + mul r12 + add r14, rax + adc r15, rdx + add r14, rax + adc r15, rdx + ; Reduce 260-bit to 130-bit + mov rax, r10 + mov rdx, r14 + mov rdi, r15 + and rax, -4 + and r10, 3 + add r8, rax + adc r9, rdx + adc r10, rdi + shrd rax, rdx, 2 + shrd rdx, rdi, 2 + shr rdi, 2 + add r8, rax + adc r9, rdx + adc r10, rdi + mov rax, r10 + and r10, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r8, rax + adc r9, 0 + adc r10, 0 + ; Convert to 26 bits in 32 + mov rax, r8 + mov rdx, r8 + mov rsi, r8 + mov rbx, r9 + mov rbp, r9 + shr rdx, 26 + shrd rsi, r9, 52 + shr rbx, 14 + shrd rbp, r10, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+320], eax + mov DWORD PTR [rcx+324], edx + mov DWORD PTR [rcx+328], esi + mov DWORD PTR [rcx+332], ebx + mov DWORD PTR [rcx+336], ebp + mov DWORD PTR [rcx+340], 0 + mov QWORD PTR [rsp+72], r8 + mov QWORD PTR [rsp+80], r9 + mov QWORD PTR [rsp+88], r10 + mov r11, QWORD PTR [rsp] + mov r12, QWORD PTR [rsp+8] + mov r13, QWORD PTR [rsp+16] + ; Multiply 128-bit by 130-bit + ; r1[0] * r2[0] + mov rax, r11 + mul r8 + mov r14, rax + mov r15, rdx + ; r1[0] * r2[1] + mov rax, r11 + mul r9 + mov rdi, 0 + add r15, rax + adc rdi, rdx + ; r1[1] * r2[0] + mov rax, r12 + mul r8 + mov rsi, 0 + add r15, rax + adc rdi, rdx + adc rsi, 0 + ; r1[0] * r2[2] + mov rax, r11 + mul r10 + add rdi, rax + adc rsi, rdx + ; r1[1] * r2[1] + mov rax, r12 + mul r9 + mov rbx, 0 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[2] + mov rax, r12 + mul r10 + add rsi, rax + adc rbx, rdx + ; Reduce 260-bit to 130-bit + mov rax, rdi + mov rdx, rsi + and rax, -4 + and rdi, 3 + add r14, rax + adc r15, rdx + adc rdi, rbx + shrd rax, rdx, 2 + shrd rdx, rbx, 2 + shr rbx, 2 + add r14, rax + adc r15, rdx + adc rdi, rbx + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + ; Convert to 26 bits in 32 + mov rax, r14 + mov rdx, r14 + mov rsi, r14 + mov rbx, r15 + mov rbp, r15 + shr rdx, 26 + shrd rsi, r15, 52 + shr rbx, 14 + shrd rbp, rdi, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+624], eax + mov DWORD PTR [rcx+628], edx + mov DWORD PTR [rcx+632], esi + mov DWORD PTR [rcx+636], ebx + mov DWORD PTR [rcx+640], ebp + mov DWORD PTR [rcx+644], 0 + ; Square 130-bit + mov rax, r9 + mul r8 + xor r14, r14 + mov r12, rax + mov r13, rdx + add r12, rax + adc r13, rdx + adc r14, 0 + mov rax, r8 + mul rax + mov r11, rax + mov rdi, rdx + mov rax, r9 + mul rax + add r12, rdi + adc r13, rax + adc r14, rdx + mov rax, r10 + mul rax + mov r15, rax + mov rax, r10 + mul r8 + add r13, rax + adc r14, rdx + adc r15, 0 + add r13, rax + adc r14, rdx + adc r15, 0 + mov rax, r10 + mul r9 + add r14, rax + adc r15, rdx + add r14, rax + adc r15, rdx + ; Reduce 260-bit to 130-bit + mov rax, r13 + mov rdx, r14 + mov rdi, r15 + and rax, -4 + and r13, 3 + add r11, rax + adc r12, rdx + adc r13, rdi + shrd rax, rdx, 2 + shrd rdx, rdi, 2 + shr rdi, 2 + add r11, rax + adc r12, rdx + adc r13, rdi + mov rax, r13 + and r13, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r11, rax + adc r12, 0 + adc r13, 0 + ; Convert to 26 bits in 32 + mov rax, r11 + mov rdx, r11 + mov rsi, r11 + mov rbx, r12 + mov rbp, r12 + shr rdx, 26 + shrd rsi, r12, 52 + shr rbx, 14 + shrd rbp, r13, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+720], eax + mov DWORD PTR [rcx+724], edx + mov DWORD PTR [rcx+728], esi + mov DWORD PTR [rcx+732], ebx + mov DWORD PTR [rcx+736], ebp + mov DWORD PTR [rcx+740], 0 + mov r8, QWORD PTR [rsp+48] + mov r9, QWORD PTR [rsp+56] + mov r10, QWORD PTR [rsp+64] + ; Square 130-bit + mov rax, r9 + mul r8 + xor r14, r14 + mov r12, rax + mov r13, rdx + add r12, rax + adc r13, rdx + adc r14, 0 + mov rax, r8 + mul rax + mov r11, rax + mov rdi, rdx + mov rax, r9 + mul rax + add r12, rdi + adc r13, rax + adc r14, rdx + mov rax, r10 + mul rax + mov r15, rax + mov rax, r10 + mul r8 + add r13, rax + adc r14, rdx + adc r15, 0 + add r13, rax + adc r14, rdx + adc r15, 0 + mov rax, r10 + mul r9 + add r14, rax + adc r15, rdx + add r14, rax + adc r15, rdx + ; Reduce 260-bit to 130-bit + mov rax, r13 + mov rdx, r14 + mov rdi, r15 + and rax, -4 + and r13, 3 + add r11, rax + adc r12, rdx + adc r13, rdi + shrd rax, rdx, 2 + shrd rdx, rdi, 2 + shr rdi, 2 + add r11, rax + adc r12, rdx + adc r13, rdi + mov rax, r13 + and r13, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r11, rax + adc r12, 0 + adc r13, 0 + ; Convert to 26 bits in 32 + mov rax, r11 + mov rdx, r11 + mov rsi, r11 + mov rbx, r12 + mov rbp, r12 + shr rdx, 26 + shrd rsi, r12, 52 + shr rbx, 14 + shrd rbp, r13, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+656], eax + mov DWORD PTR [rcx+660], edx + mov DWORD PTR [rcx+664], esi + mov DWORD PTR [rcx+668], ebx + mov DWORD PTR [rcx+672], ebp + mov DWORD PTR [rcx+676], 0 + mov r8, QWORD PTR [rsp] + mov r9, QWORD PTR [rsp+8] + mov r10, QWORD PTR [rsp+16] + ; Multiply 128-bit by 130-bit + ; r1[0] * r2[0] + mov rax, r8 + mul r11 + mov r14, rax + mov r15, rdx + ; r1[0] * r2[1] + mov rax, r8 + mul r12 + mov rdi, 0 + add r15, rax + adc rdi, rdx + ; r1[1] * r2[0] + mov rax, r9 + mul r11 + mov rsi, 0 + add r15, rax + adc rdi, rdx + adc rsi, 0 + ; r1[0] * r2[2] + mov rax, r8 + mul r13 + add rdi, rax + adc rsi, rdx + ; r1[1] * r2[1] + mov rax, r9 + mul r12 + mov rbx, 0 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[2] + mov rax, r9 + mul r13 + add rsi, rax + adc rbx, rdx + ; Reduce 260-bit to 130-bit + mov rax, rdi + mov rdx, rsi + and rax, -4 + and rdi, 3 + add r14, rax + adc r15, rdx + adc rdi, rbx + shrd rax, rdx, 2 + shrd rdx, rbx, 2 + shr rbx, 2 + add r14, rax + adc r15, rdx + adc rdi, rbx + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + ; Convert to 26 bits in 32 + mov rax, r14 + mov rdx, r14 + mov rsi, r14 + mov rbx, r15 + mov rbp, r15 + shr rdx, 26 + shrd rsi, r15, 52 + shr rbx, 14 + shrd rbp, rdi, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+688], eax + mov DWORD PTR [rcx+692], edx + mov DWORD PTR [rcx+696], esi + mov DWORD PTR [rcx+700], ebx + mov DWORD PTR [rcx+704], ebp + mov DWORD PTR [rcx+708], 0 + add rsp, 96 + pop rbp + pop rbx + pop rsi + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + ret +poly1305_calc_powers_avx512 ENDP +_TEXT ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512_blocks_mask QWORD 0000000003ffffffh, 0000000003ffffffh + QWORD 0000000003ffffffh, 0000000003ffffffh + QWORD 0000000003ffffffh, 0000000003ffffffh + QWORD 0000000003ffffffh, 0000000003ffffffh +ptr_L_poly1305_avx512_blocks_mask QWORD L_poly1305_avx512_blocks_mask +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512_blocks_hibit QWORD 0000000001000000h, 0000000001000000h + QWORD 0000000001000000h, 0000000001000000h + QWORD 0000000001000000h, 0000000001000000h + QWORD 0000000001000000h, 0000000001000000h +ptr_L_poly1305_avx512_blocks_hibit QWORD L_poly1305_avx512_blocks_hibit +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512_blocks_permidx QWORD 0000000400000000h, 0000000c00000008h + QWORD 0000001400000010h, 0000001c00000018h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000500000001h, 0000000d00000009h + QWORD 0000001500000011h, 0000001d00000019h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000600000002h, 0000000e0000000ah + QWORD 0000001600000012h, 0000001e0000001ah + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000700000003h, 0000000f0000000bh + QWORD 0000001700000013h, 0000001f0000001bh + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h +ptr_L_poly1305_avx512_blocks_permidx QWORD L_poly1305_avx512_blocks_permidx +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512_blocks_rxidx QWORD 0000001000000018h, 0000000000000008h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000001100000019h, 0000000100000009h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 000000120000001ah, 000000020000000ah + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 000000130000001bh, 000000030000000bh + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 000000140000001ch, 000000040000000ch + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h +ptr_L_poly1305_avx512_blocks_rxidx QWORD L_poly1305_avx512_blocks_rxidx +_DATA ENDS +_TEXT SEGMENT READONLY PARA +poly1305_blocks_avx512 PROC + push r12 + push rdi + push rsi + push r13 + push r14 + push r15 + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + sub rsp, 160 + vmovdqu OWORD PTR [rsp], xmm6 + vmovdqu OWORD PTR [rsp+16], xmm7 + vmovdqu OWORD PTR [rsp+32], xmm8 + vmovdqu OWORD PTR [rsp+48], xmm9 + vmovdqu OWORD PTR [rsp+64], xmm10 + vmovdqu OWORD PTR [rsp+80], xmm11 + vmovdqu OWORD PTR [rsp+96], xmm12 + vmovdqu OWORD PTR [rsp+112], xmm13 + vmovdqu OWORD PTR [rsp+128], xmm14 + vmovdqu OWORD PTR [rsp+144], xmm15 + mov rcx, QWORD PTR [ptr_L_poly1305_avx512_blocks_mask] + mov r13, QWORD PTR [ptr_L_poly1305_avx512_blocks_hibit] + mov r14, QWORD PTR [ptr_L_poly1305_avx512_blocks_permidx] + mov r15, QWORD PTR [ptr_L_poly1305_avx512_blocks_rxidx] + vpxorq zmm24, zmm24, zmm24 + lea rax, QWORD PTR [rdi+64] + cmp WORD PTR [rdi+616], 0 + jne L_poly1305_avx512_blocks_begin_h + ; Load the message data + vmovdqu64 zmm25, [rsi] + vmovdqu64 zmm26, [rsi+64] + vmovdqu64 zmm27, [r14] + vpermi2d zmm27, zmm25, zmm26 + vpmovzxdq zmm0, ymm27 + vmovdqu64 zmm27, [r14+64] + vpermi2d zmm27, zmm25, zmm26 + vpmovzxdq zmm1, ymm27 + vmovdqu64 zmm27, [r14+128] + vpermi2d zmm27, zmm25, zmm26 + vpmovzxdq zmm2, ymm27 + vmovdqu64 zmm27, [r14+192] + vpermi2d zmm27, zmm25, zmm26 + vpmovzxdq zmm3, ymm27 + vmovdqu64 zmm4, [r13] + vpsllq zmm1, zmm1, 6 + vpsllq zmm2, zmm2, 12 + vpsllq zmm3, zmm3, 18 + vmovdqu64 zmm23, [rcx] + ; Reduce, in place, the message data + vpsrlq zmm19, zmm0, 26 + vpsrlq zmm20, zmm3, 26 + vpandq zmm0, zmm0, zmm23 + vpandq zmm3, zmm3, zmm23 + vpaddq zmm1, zmm19, zmm1 + vpaddq zmm4, zmm20, zmm4 + vpsrlq zmm19, zmm1, 26 + vpsrlq zmm20, zmm4, 26 + vpandq zmm1, zmm1, zmm23 + vpandq zmm4, zmm4, zmm23 + vpaddq zmm2, zmm19, zmm2 + vpslld zmm21, zmm20, 2 + vpaddd zmm21, zmm20, zmm21 + vpsrlq zmm19, zmm2, 26 + vpaddq zmm0, zmm21, zmm0 + vpsrlq zmm20, zmm0, 26 + vpandq zmm2, zmm2, zmm23 + vpandq zmm0, zmm0, zmm23 + vpaddq zmm3, zmm19, zmm3 + vpaddq zmm1, zmm20, zmm1 + vpsrlq zmm19, zmm3, 26 + vpandq zmm3, zmm3, zmm23 + vpaddq zmm4, zmm19, zmm4 + add rsi, 128 + sub rdx, 128 + jz L_poly1305_avx512_blocks_store + jmp L_poly1305_avx512_blocks_load_r8 +L_poly1305_avx512_blocks_begin_h: + ; Load the H values. + vpmovzxdq zmm0, [rax] + vpmovzxdq zmm1, [rax+32] + vpmovzxdq zmm2, [rax+64] + vpmovzxdq zmm3, [rax+96] + vpmovzxdq zmm4, [rax+128] + ; Check if there is a power of r to load - otherwise use r^8. + cmp BYTE PTR [rdi+616], 0 + je L_poly1305_avx512_blocks_load_r8 + ; Load the 8 powers of r - r^8 .. r^1. + vmovdqu64 zmm14, [rdi+224] + vmovdqu64 zmm15, [rdi+288] + vmovdqu64 zmm16, [rdi+624] + vmovdqu64 zmm17, [rdi+688] + vmovdqu64 zmm18, [r15] + vpermi2d zmm18, zmm16, zmm17 + vpmovzxdq ymm20, xmm18 + vmovdqu64 zmm19, [r15] + vpermi2d zmm19, zmm14, zmm15 + vpmovzxdq ymm21, xmm19 + vinserti64x4 zmm5, zmm20, ymm21, 1 + vmovdqu64 zmm18, [r15+64] + vpermi2d zmm18, zmm16, zmm17 + vpmovzxdq ymm20, xmm18 + vmovdqu64 zmm19, [r15+64] + vpermi2d zmm19, zmm14, zmm15 + vpmovzxdq ymm21, xmm19 + vinserti64x4 zmm6, zmm20, ymm21, 1 + vmovdqu64 zmm18, [r15+128] + vpermi2d zmm18, zmm16, zmm17 + vpmovzxdq ymm20, xmm18 + vmovdqu64 zmm19, [r15+128] + vpermi2d zmm19, zmm14, zmm15 + vpmovzxdq ymm21, xmm19 + vinserti64x4 zmm7, zmm20, ymm21, 1 + vmovdqu64 zmm18, [r15+192] + vpermi2d zmm18, zmm16, zmm17 + vpmovzxdq ymm20, xmm18 + vmovdqu64 zmm19, [r15+192] + vpermi2d zmm19, zmm14, zmm15 + vpmovzxdq ymm21, xmm19 + vinserti64x4 zmm8, zmm20, ymm21, 1 + vmovdqu64 zmm18, [r15+256] + vpermi2d zmm18, zmm16, zmm17 + vpmovzxdq ymm20, xmm18 + vmovdqu64 zmm19, [r15+256] + vpermi2d zmm19, zmm14, zmm15 + vpmovzxdq ymm21, xmm19 + vinserti64x4 zmm9, zmm20, ymm21, 1 + jmp L_poly1305_avx512_blocks_mul_5 +L_poly1305_avx512_blocks_load_r8: + ; Load r^8 into all eight lanes. + vpbroadcastd zmm5, DWORD PTR [rdi+720] + vpbroadcastd zmm6, DWORD PTR [rdi+724] + vpbroadcastd zmm7, DWORD PTR [rdi+728] + vpbroadcastd zmm8, DWORD PTR [rdi+732] + vpbroadcastd zmm9, DWORD PTR [rdi+736] +L_poly1305_avx512_blocks_mul_5: + ; Multiply top 4 26-bit values of all eight powers by 5 + vpslld zmm10, zmm6, 2 + vpslld zmm11, zmm7, 2 + vpslld zmm12, zmm8, 2 + vpslld zmm13, zmm9, 2 + vpaddq zmm10, zmm6, zmm10 + vpaddq zmm11, zmm7, zmm11 + vpaddq zmm12, zmm8, zmm12 + vpaddq zmm13, zmm9, zmm13 + vmovdqu64 zmm23, [rcx] + ; If not finished then loop over data + cmp BYTE PTR [rdi+616], 1 + jne L_poly1305_avx512_blocks_start + ; Do last multiply, reduce, add the eight H together and move to + ; 32-bit registers + vpmuludq zmm14, zmm4, zmm10 + vpmuludq zmm19, zmm3, zmm11 + vpmuludq zmm15, zmm4, zmm11 + vpmuludq zmm20, zmm3, zmm12 + vpmuludq zmm16, zmm4, zmm12 + vpaddq zmm14, zmm19, zmm14 + vpmuludq zmm21, zmm2, zmm12 + vpmuludq zmm17, zmm4, zmm13 + vpaddq zmm15, zmm20, zmm15 + vpmuludq zmm22, zmm1, zmm13 + vpmuludq zmm19, zmm2, zmm13 + vpaddq zmm14, zmm21, zmm14 + vpmuludq zmm20, zmm3, zmm13 + vpmuludq zmm21, zmm3, zmm5 + vpaddq zmm14, zmm22, zmm14 + vpmuludq zmm18, zmm4, zmm5 + vpaddq zmm15, zmm19, zmm15 + vpmuludq zmm22, zmm0, zmm5 + vpaddq zmm16, zmm20, zmm16 + vpmuludq zmm19, zmm1, zmm5 + vpaddq zmm17, zmm21, zmm17 + vpmuludq zmm20, zmm2, zmm5 + vpmuludq zmm21, zmm2, zmm6 + vpaddq zmm14, zmm22, zmm14 + vpmuludq zmm22, zmm3, zmm6 + vpaddq zmm15, zmm19, zmm15 + vpmuludq zmm19, zmm0, zmm6 + vpaddq zmm16, zmm20, zmm16 + vpmuludq zmm20, zmm1, zmm6 + vpaddq zmm17, zmm21, zmm17 + vpmuludq zmm21, zmm1, zmm7 + vpaddq zmm18, zmm22, zmm18 + vpmuludq zmm22, zmm2, zmm7 + vpaddq zmm15, zmm19, zmm15 + vpmuludq zmm19, zmm0, zmm7 + vpaddq zmm16, zmm20, zmm16 + vpmuludq zmm20, zmm0, zmm8 + vpaddq zmm17, zmm21, zmm17 + vpmuludq zmm21, zmm1, zmm8 + vpaddq zmm18, zmm22, zmm18 + vpaddq zmm16, zmm19, zmm16 + vpmuludq zmm22, zmm0, zmm9 + vpaddq zmm17, zmm20, zmm17 + vpaddq zmm18, zmm21, zmm18 + vpaddq zmm18, zmm22, zmm18 + vpsrlq zmm19, zmm14, 26 + vpsrlq zmm20, zmm17, 26 + vpandq zmm14, zmm14, zmm23 + vpandq zmm17, zmm17, zmm23 + vpaddq zmm15, zmm19, zmm15 + vpaddq zmm18, zmm20, zmm18 + vpsrlq zmm19, zmm15, 26 + vpsrlq zmm20, zmm18, 26 + vpandq zmm1, zmm15, zmm23 + vpandq zmm4, zmm18, zmm23 + vpaddq zmm16, zmm19, zmm16 + vpslld zmm21, zmm20, 2 + vpaddd zmm21, zmm20, zmm21 + vpsrlq zmm19, zmm16, 26 + vpaddq zmm14, zmm21, zmm14 + vpsrlq zmm20, zmm14, 26 + vpandq zmm2, zmm16, zmm23 + vpandq zmm0, zmm14, zmm23 + vpaddq zmm17, zmm19, zmm17 + vpaddq zmm1, zmm20, zmm1 + vpsrlq zmm19, zmm17, 26 + vpandq zmm3, zmm17, zmm23 + vpaddq zmm4, zmm19, zmm4 + vshufi64x2 zmm14, zmm0, zmm0, 78 + vshufi64x2 zmm15, zmm1, zmm1, 78 + vshufi64x2 zmm16, zmm2, zmm2, 78 + vshufi64x2 zmm17, zmm3, zmm3, 78 + vshufi64x2 zmm18, zmm4, zmm4, 78 + vpaddq zmm0, zmm14, zmm0 + vpaddq zmm1, zmm15, zmm1 + vpaddq zmm2, zmm16, zmm2 + vpaddq zmm3, zmm17, zmm3 + vpaddq zmm4, zmm18, zmm4 + vpsrldq zmm14, zmm0, 8 + vpsrldq zmm15, zmm1, 8 + vpsrldq zmm16, zmm2, 8 + vpsrldq zmm17, zmm3, 8 + vpsrldq zmm18, zmm4, 8 + vpaddq zmm0, zmm14, zmm0 + vpaddq zmm1, zmm15, zmm1 + vpaddq zmm2, zmm16, zmm2 + vpaddq zmm3, zmm17, zmm3 + vpaddq zmm4, zmm18, zmm4 + vpermq zmm14, zmm0, 2 + vpermq zmm15, zmm1, 2 + vpermq zmm16, zmm2, 2 + vpermq zmm17, zmm3, 2 + vpermq zmm18, zmm4, 2 + vpaddq zmm0, zmm14, zmm0 + vpaddq zmm1, zmm15, zmm1 + vpaddq zmm2, zmm16, zmm2 + vpaddq zmm3, zmm17, zmm3 + vpaddq zmm4, zmm18, zmm4 + vmovd r8d, xmm0 + vmovd r9d, xmm1 + vmovd r10d, xmm2 + vmovd r11d, xmm3 + vmovd r12d, xmm4 + jmp L_poly1305_avx512_blocks_end_calc +L_poly1305_avx512_blocks_start: + vmovdqu64 zmm25, [rsi] + vmovdqu64 zmm26, [rsi+64] + vmovdqu64 zmm27, [r14] + vpermi2d zmm27, zmm25, zmm26 + vpmovzxdq zmm14, ymm27 + vmovdqu64 zmm27, [r14+64] + vpermi2d zmm27, zmm25, zmm26 + vpmovzxdq zmm15, ymm27 + vmovdqu64 zmm27, [r14+128] + vpermi2d zmm27, zmm25, zmm26 + vpmovzxdq zmm16, ymm27 + vmovdqu64 zmm27, [r14+192] + vpermi2d zmm27, zmm25, zmm26 + vpmovzxdq zmm17, ymm27 + vmovdqu64 zmm18, [r13] + vpsllq zmm15, zmm15, 6 + vpsllq zmm16, zmm16, 12 + vpsllq zmm17, zmm17, 18 + vpmuludq zmm19, zmm4, zmm10 + vpaddq zmm14, zmm19, zmm14 + vpmuludq zmm19, zmm3, zmm11 + vpmuludq zmm20, zmm4, zmm11 + vpaddq zmm15, zmm20, zmm15 + vpmuludq zmm20, zmm3, zmm12 + vpmuludq zmm21, zmm4, zmm12 + vpaddq zmm16, zmm21, zmm16 + vpaddq zmm14, zmm19, zmm14 + vpmuludq zmm21, zmm2, zmm12 + vpmuludq zmm22, zmm4, zmm13 + vpaddq zmm17, zmm22, zmm17 + vpaddq zmm15, zmm20, zmm15 + vpmuludq zmm22, zmm1, zmm13 + vpmuludq zmm19, zmm2, zmm13 + vpaddq zmm14, zmm21, zmm14 + vpmuludq zmm20, zmm3, zmm13 + vpmuludq zmm21, zmm3, zmm5 + vpaddq zmm14, zmm22, zmm14 + vpmuludq zmm22, zmm4, zmm5 + vpaddq zmm18, zmm22, zmm18 + vpaddq zmm15, zmm19, zmm15 + vpmuludq zmm22, zmm0, zmm5 + vpaddq zmm16, zmm20, zmm16 + vpmuludq zmm19, zmm1, zmm5 + vpaddq zmm17, zmm21, zmm17 + vpmuludq zmm20, zmm2, zmm5 + vpmuludq zmm21, zmm2, zmm6 + vpaddq zmm14, zmm22, zmm14 + vpmuludq zmm22, zmm3, zmm6 + vpaddq zmm15, zmm19, zmm15 + vpmuludq zmm19, zmm0, zmm6 + vpaddq zmm16, zmm20, zmm16 + vpmuludq zmm20, zmm1, zmm6 + vpaddq zmm17, zmm21, zmm17 + vpmuludq zmm21, zmm1, zmm7 + vpaddq zmm18, zmm22, zmm18 + vpmuludq zmm22, zmm2, zmm7 + vpaddq zmm15, zmm19, zmm15 + vpmuludq zmm19, zmm0, zmm7 + vpaddq zmm16, zmm20, zmm16 + vpmuludq zmm20, zmm0, zmm8 + vpaddq zmm17, zmm21, zmm17 + vpmuludq zmm21, zmm1, zmm8 + vpaddq zmm18, zmm22, zmm18 + vpaddq zmm16, zmm19, zmm16 + vpmuludq zmm22, zmm0, zmm9 + vpaddq zmm17, zmm20, zmm17 + vpaddq zmm18, zmm21, zmm18 + vpaddq zmm18, zmm22, zmm18 + vpsrlq zmm19, zmm14, 26 + vpsrlq zmm20, zmm17, 26 + vpandq zmm14, zmm14, zmm23 + vpandq zmm17, zmm17, zmm23 + vpaddq zmm15, zmm19, zmm15 + vpaddq zmm18, zmm20, zmm18 + vpsrlq zmm19, zmm15, 26 + vpsrlq zmm20, zmm18, 26 + vpandq zmm1, zmm15, zmm23 + vpandq zmm4, zmm18, zmm23 + vpaddq zmm16, zmm19, zmm16 + vpslld zmm21, zmm20, 2 + vpaddd zmm21, zmm20, zmm21 + vpsrlq zmm19, zmm16, 26 + vpaddq zmm14, zmm21, zmm14 + vpsrlq zmm20, zmm14, 26 + vpandq zmm2, zmm16, zmm23 + vpandq zmm0, zmm14, zmm23 + vpaddq zmm17, zmm19, zmm17 + vpaddq zmm1, zmm20, zmm1 + vpsrlq zmm19, zmm17, 26 + vpandq zmm3, zmm17, zmm23 + vpaddq zmm4, zmm19, zmm4 + add rsi, 128 + sub rdx, 128 + jnz L_poly1305_avx512_blocks_start +L_poly1305_avx512_blocks_store: + ; Store eight H values - state + vpmovqd [rax], zmm0 + vpmovqd [rax+32], zmm1 + vpmovqd [rax+64], zmm2 + vpmovqd [rax+96], zmm3 + vpmovqd [rax+128], zmm4 +L_poly1305_avx512_blocks_end_calc: + cmp BYTE PTR [rdi+616], 0 + je L_poly1305_avx512_blocks_complete + mov rax, r8 + mov rdx, r10 + mov rcx, r12 + shr rdx, 12 + shr rcx, 24 + shl r9, 26 + shl r10, 52 + shl r11, 14 + shl r12, 40 + add rax, r9 + adc rax, r10 + adc rdx, r11 + adc rdx, r12 + adc rcx, 0 + mov r8, rcx + and rcx, 3 + shr r8, 2 + lea r8, QWORD PTR [r8+4*r8+0] + add rax, r8 + adc rdx, 0 + adc rcx, 0 + mov QWORD PTR [rdi+24], rax + mov QWORD PTR [rdi+32], rdx + mov QWORD PTR [rdi+40], rcx +L_poly1305_avx512_blocks_complete: + mov BYTE PTR [rdi+617], 1 + vzeroupper + vmovdqu xmm6, OWORD PTR [rsp] + vmovdqu xmm7, OWORD PTR [rsp+16] + vmovdqu xmm8, OWORD PTR [rsp+32] + vmovdqu xmm9, OWORD PTR [rsp+48] + vmovdqu xmm10, OWORD PTR [rsp+64] + vmovdqu xmm11, OWORD PTR [rsp+80] + vmovdqu xmm12, OWORD PTR [rsp+96] + vmovdqu xmm13, OWORD PTR [rsp+112] + vmovdqu xmm14, OWORD PTR [rsp+128] + vmovdqu xmm15, OWORD PTR [rsp+144] + add rsp, 160 + pop r15 + pop r14 + pop r13 + pop rsi + pop rdi + pop r12 + ret +poly1305_blocks_avx512 ENDP +_TEXT ENDS +_TEXT SEGMENT READONLY PARA +poly1305_final_avx512 PROC + push rdi + push rsi + mov rdi, rcx + mov rsi, rdx + mov BYTE PTR [rdi+616], 1 + mov cl, BYTE PTR [rdi+617] + cmp cl, 0 + je L_poly1305_avx512_final_done_blocks_X8 + push rsi + mov r8, 128 + xor rdx, rdx + mov rcx, rdi + call poly1305_blocks_avx512 + pop rsi +L_poly1305_avx512_final_done_blocks_X8: + mov rax, QWORD PTR [rdi+608] + mov rcx, rax + and rcx, -16 + cmp cl, 0 + je L_poly1305_avx512_final_done_blocks + push rcx + push rax + push rsi + mov r8, rcx + lea rdx, QWORD PTR [rdi+480] + mov rcx, rdi + call poly1305_blocks_avx + pop rsi + pop rax + pop rcx +L_poly1305_avx512_final_done_blocks: + sub QWORD PTR [rdi+608], rcx + xor rdx, rdx + jmp L_poly1305_avx512_final_cmp_copy +L_poly1305_avx512_final_start_copy: + mov r8b, BYTE PTR [rdi+rcx+480] + mov BYTE PTR [rdi+rdx+480], r8b + inc cl + inc dl +L_poly1305_avx512_final_cmp_copy: + cmp al, cl + jne L_poly1305_avx512_final_start_copy + mov rcx, rdi + mov rdx, rsi + call poly1305_final_avx + vpxor xmm0, xmm0, xmm0 + vmovdqu YMMWORD PTR [rdi+64], ymm0 + vmovdqu YMMWORD PTR [rdi+96], ymm0 + vmovdqu YMMWORD PTR [rdi+128], ymm0 + vmovdqu YMMWORD PTR [rdi+160], ymm0 + vmovdqu YMMWORD PTR [rdi+192], ymm0 + vmovdqu YMMWORD PTR [rdi+224], ymm0 + vmovdqu YMMWORD PTR [rdi+256], ymm0 + vmovdqu YMMWORD PTR [rdi+288], ymm0 + vmovdqu YMMWORD PTR [rdi+320], ymm0 + vmovdqu YMMWORD PTR [rdi+624], ymm0 + vmovdqu YMMWORD PTR [rdi+656], ymm0 + vmovdqu YMMWORD PTR [rdi+688], ymm0 + vmovdqu YMMWORD PTR [rdi+720], ymm0 + mov QWORD PTR [rdi+608], 0 + mov WORD PTR [rdi+616], 0 + vzeroupper + pop rsi + pop rdi + ret +poly1305_final_avx512 ENDP +_TEXT ENDS +ENDIF +IFDEF HAVE_INTEL_AVX512 +_TEXT SEGMENT READONLY PARA +poly1305_calc_powers_avx512ifma PROC + push r12 + push r13 + push r14 + push r15 + push rdi + push rsi + push rbx + push rbp + sub rsp, 96 + mov r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+8] + xor r10, r10 + ; Convert to 44 bits in 64 + mov rax, r8 + shl rax, 20 + shr rax, 20 + mov rdx, r8 + shrd rdx, r9, 44 + shl rdx, 20 + shr rdx, 20 + mov rsi, r9 + shrd rsi, r10, 24 + mov QWORD PTR [rcx+224], rax + mov QWORD PTR [rcx+232], rdx + mov QWORD PTR [rcx+240], rsi + mov QWORD PTR [rsp], r8 + mov QWORD PTR [rsp+8], r9 + mov QWORD PTR [rsp+16], r10 + ; Square 128-bit + mov rax, r9 + mul r8 + xor r14, r14 + mov r12, rax + mov r13, rdx + add r12, rax + adc r13, rdx + adc r14, 0 + mov rax, r8 + mul rax + mov r11, rax + mov rdi, rdx + mov rax, r9 + mul rax + add r12, rdi + adc r13, rax + adc r14, rdx + ; Reduce 256-bit to 130-bit + mov rax, r13 + mov rdx, r14 + and rax, -4 + and r13, 3 + add r11, rax + adc r12, rdx + adc r13, 0 + shrd rax, rdx, 2 + shr rdx, 2 + add r11, rax + adc r12, rdx + adc r13, 0 + mov rax, r13 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + and r13, 3 + add r11, rax + adc r12, 0 + adc r13, 0 + ; Convert to 44 bits in 64 + mov rax, r11 + shl rax, 20 + shr rax, 20 + mov rdx, r11 + shrd rdx, r12, 44 + shl rdx, 20 + shr rdx, 20 + mov rsi, r12 + shrd rsi, r13, 24 + mov QWORD PTR [rcx+256], rax + mov QWORD PTR [rcx+264], rdx + mov QWORD PTR [rcx+272], rsi + mov QWORD PTR [rsp+24], r11 + mov QWORD PTR [rsp+32], r12 + mov QWORD PTR [rsp+40], r13 + ; Multiply 128-bit by 130-bit + ; r1[0] * r2[0] + mov rax, r8 + mul r11 + mov r14, rax + mov r15, rdx + ; r1[0] * r2[1] + mov rax, r8 + mul r12 + mov rdi, 0 + add r15, rax + adc rdi, rdx + ; r1[1] * r2[0] + mov rax, r9 + mul r11 + mov rsi, 0 + add r15, rax + adc rdi, rdx + adc rsi, 0 + ; r1[0] * r2[2] + mov rax, r8 + mul r13 + add rdi, rax + adc rsi, rdx + ; r1[1] * r2[1] + mov rax, r9 + mul r12 + mov rbx, 0 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[2] + mov rax, r9 + mul r13 + add rsi, rax + adc rbx, rdx + ; Reduce 260-bit to 130-bit + mov rax, rdi + mov rdx, rsi + and rax, -4 + and rdi, 3 + add r14, rax + adc r15, rdx + adc rdi, rbx + shrd rax, rdx, 2 + shrd rdx, rbx, 2 + shr rbx, 2 + add r14, rax + adc r15, rdx + adc rdi, rbx + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + ; Convert to 44 bits in 64 + mov rax, r14 + shl rax, 20 + shr rax, 20 + mov rdx, r14 + shrd rdx, r15, 44 + shl rdx, 20 + shr rdx, 20 + mov rsi, r15 + shrd rsi, rdi, 24 + mov QWORD PTR [rcx+288], rax + mov QWORD PTR [rcx+296], rdx + mov QWORD PTR [rcx+304], rsi + mov QWORD PTR [rsp+48], r14 + mov QWORD PTR [rsp+56], r15 + mov QWORD PTR [rsp+64], rdi + ; Square 130-bit + mov rax, r12 + mul r11 + xor r14, r14 + mov r9, rax + mov r10, rdx + add r9, rax + adc r10, rdx + adc r14, 0 + mov rax, r11 + mul rax + mov r8, rax + mov rdi, rdx + mov rax, r12 + mul rax + add r9, rdi + adc r10, rax + adc r14, rdx + mov rax, r13 + mul rax + mov r15, rax + mov rax, r13 + mul r11 + add r10, rax + adc r14, rdx + adc r15, 0 + add r10, rax + adc r14, rdx + adc r15, 0 + mov rax, r13 + mul r12 + add r14, rax + adc r15, rdx + add r14, rax + adc r15, rdx + ; Reduce 260-bit to 130-bit + mov rax, r10 + mov rdx, r14 + mov rdi, r15 + and rax, -4 + and r10, 3 + add r8, rax + adc r9, rdx + adc r10, rdi + shrd rax, rdx, 2 + shrd rdx, rdi, 2 + shr rdi, 2 + add r8, rax + adc r9, rdx + adc r10, rdi + mov rax, r10 + and r10, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r8, rax + adc r9, 0 + adc r10, 0 + ; Convert to 44 bits in 64 + mov rax, r8 + shl rax, 20 + shr rax, 20 + mov rdx, r8 + shrd rdx, r9, 44 + shl rdx, 20 + shr rdx, 20 + mov rsi, r9 + shrd rsi, r10, 24 + mov QWORD PTR [rcx+320], rax + mov QWORD PTR [rcx+328], rdx + mov QWORD PTR [rcx+336], rsi + mov QWORD PTR [rsp+72], r8 + mov QWORD PTR [rsp+80], r9 + mov QWORD PTR [rsp+88], r10 + mov r11, QWORD PTR [rsp] + mov r12, QWORD PTR [rsp+8] + mov r13, QWORD PTR [rsp+16] + ; Multiply 128-bit by 130-bit + ; r1[0] * r2[0] + mov rax, r11 + mul r8 + mov r14, rax + mov r15, rdx + ; r1[0] * r2[1] + mov rax, r11 + mul r9 + mov rdi, 0 + add r15, rax + adc rdi, rdx + ; r1[1] * r2[0] + mov rax, r12 + mul r8 + mov rsi, 0 + add r15, rax + adc rdi, rdx + adc rsi, 0 + ; r1[0] * r2[2] + mov rax, r11 + mul r10 + add rdi, rax + adc rsi, rdx + ; r1[1] * r2[1] + mov rax, r12 + mul r9 + mov rbx, 0 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[2] + mov rax, r12 + mul r10 + add rsi, rax + adc rbx, rdx + ; Reduce 260-bit to 130-bit + mov rax, rdi + mov rdx, rsi + and rax, -4 + and rdi, 3 + add r14, rax + adc r15, rdx + adc rdi, rbx + shrd rax, rdx, 2 + shrd rdx, rbx, 2 + shr rbx, 2 + add r14, rax + adc r15, rdx + adc rdi, rbx + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + ; Convert to 44 bits in 64 + mov rax, r14 + shl rax, 20 + shr rax, 20 + mov rdx, r14 + shrd rdx, r15, 44 + shl rdx, 20 + shr rdx, 20 + mov rsi, r15 + shrd rsi, rdi, 24 + mov QWORD PTR [rcx+624], rax + mov QWORD PTR [rcx+632], rdx + mov QWORD PTR [rcx+640], rsi + ; Square 130-bit + mov rax, r9 + mul r8 + xor r14, r14 + mov r12, rax + mov r13, rdx + add r12, rax + adc r13, rdx + adc r14, 0 + mov rax, r8 + mul rax + mov r11, rax + mov rdi, rdx + mov rax, r9 + mul rax + add r12, rdi + adc r13, rax + adc r14, rdx + mov rax, r10 + mul rax + mov r15, rax + mov rax, r10 + mul r8 + add r13, rax + adc r14, rdx + adc r15, 0 + add r13, rax + adc r14, rdx + adc r15, 0 + mov rax, r10 + mul r9 + add r14, rax + adc r15, rdx + add r14, rax + adc r15, rdx + ; Reduce 260-bit to 130-bit + mov rax, r13 + mov rdx, r14 + mov rdi, r15 + and rax, -4 + and r13, 3 + add r11, rax + adc r12, rdx + adc r13, rdi + shrd rax, rdx, 2 + shrd rdx, rdi, 2 + shr rdi, 2 + add r11, rax + adc r12, rdx + adc r13, rdi + mov rax, r13 + and r13, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r11, rax + adc r12, 0 + adc r13, 0 + ; Convert to 44 bits in 64 + mov rax, r11 + shl rax, 20 + shr rax, 20 + mov rdx, r11 + shrd rdx, r12, 44 + shl rdx, 20 + shr rdx, 20 + mov rsi, r12 + shrd rsi, r13, 24 + mov QWORD PTR [rcx+720], rax + mov QWORD PTR [rcx+728], rdx + mov QWORD PTR [rcx+736], rsi + mov r8, QWORD PTR [rsp+48] + mov r9, QWORD PTR [rsp+56] + mov r10, QWORD PTR [rsp+64] + ; Square 130-bit + mov rax, r9 + mul r8 + xor r14, r14 + mov r12, rax + mov r13, rdx + add r12, rax + adc r13, rdx + adc r14, 0 + mov rax, r8 + mul rax + mov r11, rax + mov rdi, rdx + mov rax, r9 + mul rax + add r12, rdi + adc r13, rax + adc r14, rdx + mov rax, r10 + mul rax + mov r15, rax + mov rax, r10 + mul r8 + add r13, rax + adc r14, rdx + adc r15, 0 + add r13, rax + adc r14, rdx + adc r15, 0 + mov rax, r10 + mul r9 + add r14, rax + adc r15, rdx + add r14, rax + adc r15, rdx + ; Reduce 260-bit to 130-bit + mov rax, r13 + mov rdx, r14 + mov rdi, r15 + and rax, -4 + and r13, 3 + add r11, rax + adc r12, rdx + adc r13, rdi + shrd rax, rdx, 2 + shrd rdx, rdi, 2 + shr rdi, 2 + add r11, rax + adc r12, rdx + adc r13, rdi + mov rax, r13 + and r13, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r11, rax + adc r12, 0 + adc r13, 0 + ; Convert to 44 bits in 64 + mov rax, r11 + shl rax, 20 + shr rax, 20 + mov rdx, r11 + shrd rdx, r12, 44 + shl rdx, 20 + shr rdx, 20 + mov rsi, r12 + shrd rsi, r13, 24 + mov QWORD PTR [rcx+656], rax + mov QWORD PTR [rcx+664], rdx + mov QWORD PTR [rcx+672], rsi + mov r8, QWORD PTR [rsp] + mov r9, QWORD PTR [rsp+8] + mov r10, QWORD PTR [rsp+16] + ; Multiply 128-bit by 130-bit + ; r1[0] * r2[0] + mov rax, r8 + mul r11 + mov r14, rax + mov r15, rdx + ; r1[0] * r2[1] + mov rax, r8 + mul r12 + mov rdi, 0 + add r15, rax + adc rdi, rdx + ; r1[1] * r2[0] + mov rax, r9 + mul r11 + mov rsi, 0 + add r15, rax + adc rdi, rdx + adc rsi, 0 + ; r1[0] * r2[2] + mov rax, r8 + mul r13 + add rdi, rax + adc rsi, rdx + ; r1[1] * r2[1] + mov rax, r9 + mul r12 + mov rbx, 0 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[2] + mov rax, r9 + mul r13 + add rsi, rax + adc rbx, rdx + ; Reduce 260-bit to 130-bit + mov rax, rdi + mov rdx, rsi + and rax, -4 + and rdi, 3 + add r14, rax + adc r15, rdx + adc rdi, rbx + shrd rax, rdx, 2 + shrd rdx, rbx, 2 + shr rbx, 2 + add r14, rax + adc r15, rdx + adc rdi, rbx + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + ; Convert to 44 bits in 64 + mov rax, r14 + shl rax, 20 + shr rax, 20 + mov rdx, r14 + shrd rdx, r15, 44 + shl rdx, 20 + shr rdx, 20 + mov rsi, r15 + shrd rsi, rdi, 24 + mov QWORD PTR [rcx+688], rax + mov QWORD PTR [rcx+696], rdx + mov QWORD PTR [rcx+704], rsi + add rsp, 96 + pop rbp + pop rbx + pop rsi + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + ret +poly1305_calc_powers_avx512ifma ENDP +_TEXT ENDS +_TEXT SEGMENT READONLY PARA +poly1305_setkey_avx512ifma PROC + call poly1305_setkey_avx + vpxorq zmm0, zmm0, zmm0 + vmovdqu64 [rcx+752], zmm0 + vmovdqu64 [rcx+816], zmm0 + vmovdqu64 [rcx+880], zmm0 + mov QWORD PTR [rcx+608], 0 + mov WORD PTR [rcx+616], 0 + ret +poly1305_setkey_avx512ifma ENDP +_TEXT ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512ifma_blocks_mask44 QWORD 00000fffffffffffh, 00000fffffffffffh + QWORD 00000fffffffffffh, 00000fffffffffffh + QWORD 00000fffffffffffh, 00000fffffffffffh + QWORD 00000fffffffffffh, 00000fffffffffffh +ptr_L_poly1305_avx512ifma_blocks_mask44 QWORD L_poly1305_avx512ifma_blocks_mask44 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512ifma_blocks_mask24 QWORD 0000000000ffffffh, 0000000000ffffffh + QWORD 0000000000ffffffh, 0000000000ffffffh + QWORD 0000000000ffffffh, 0000000000ffffffh + QWORD 0000000000ffffffh, 0000000000ffffffh +ptr_L_poly1305_avx512ifma_blocks_mask24 QWORD L_poly1305_avx512ifma_blocks_mask24 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512ifma_blocks_pad QWORD 0000010000000000h, 0000010000000000h + QWORD 0000010000000000h, 0000010000000000h + QWORD 0000010000000000h, 0000010000000000h + QWORD 0000010000000000h, 0000010000000000h +ptr_L_poly1305_avx512ifma_blocks_pad QWORD L_poly1305_avx512ifma_blocks_pad +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512ifma_blocks_idxeven QWORD 0000000000000000h, 0000000000000002h + QWORD 0000000000000004h, 0000000000000006h + QWORD 0000000000000008h, 000000000000000ah + QWORD 000000000000000ch, 000000000000000eh +ptr_L_poly1305_avx512ifma_blocks_idxeven QWORD L_poly1305_avx512ifma_blocks_idxeven +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512ifma_blocks_idxodd QWORD 0000000000000001h, 0000000000000003h + QWORD 0000000000000005h, 0000000000000007h + QWORD 0000000000000009h, 000000000000000bh + QWORD 000000000000000dh, 000000000000000fh +ptr_L_poly1305_avx512ifma_blocks_idxodd QWORD L_poly1305_avx512ifma_blocks_idxodd +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx512ifma_blocks_rxidx QWORD 000000000000000ch, 0000000000000008h + QWORD 0000000000000004h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 000000000000000dh, 0000000000000009h + QWORD 0000000000000005h, 0000000000000001h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h + QWORD 000000000000000eh, 000000000000000ah + QWORD 0000000000000006h, 0000000000000002h + QWORD 0000000000000000h, 0000000000000000h + QWORD 0000000000000000h, 0000000000000000h +ptr_L_poly1305_avx512ifma_blocks_rxidx QWORD L_poly1305_avx512ifma_blocks_rxidx +_DATA ENDS +_TEXT SEGMENT READONLY PARA +poly1305_blocks_avx512ifma PROC + push rdi + push rsi + push r12 + push r13 + push r14 + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + sub rsp, 160 + vmovdqu OWORD PTR [rsp], xmm6 + vmovdqu OWORD PTR [rsp+16], xmm7 + vmovdqu OWORD PTR [rsp+32], xmm8 + vmovdqu OWORD PTR [rsp+48], xmm9 + vmovdqu OWORD PTR [rsp+64], xmm10 + vmovdqu OWORD PTR [rsp+80], xmm11 + vmovdqu OWORD PTR [rsp+96], xmm12 + vmovdqu OWORD PTR [rsp+112], xmm13 + vmovdqu OWORD PTR [rsp+128], xmm14 + vmovdqu OWORD PTR [rsp+144], xmm15 + mov r8, QWORD PTR [ptr_L_poly1305_avx512ifma_blocks_mask44] + mov r9, QWORD PTR [ptr_L_poly1305_avx512ifma_blocks_mask24] + mov r10, QWORD PTR [ptr_L_poly1305_avx512ifma_blocks_pad] + mov r11, QWORD PTR [ptr_L_poly1305_avx512ifma_blocks_idxeven] + mov r12, QWORD PTR [ptr_L_poly1305_avx512ifma_blocks_idxodd] + mov r13, QWORD PTR [ptr_L_poly1305_avx512ifma_blocks_rxidx] + vmovdqu64 zmm18, [r8] + cmp WORD PTR [rdi+616], 0 + jne L_poly1305_avx512ifma_blocks_begin_h + ; First 8 blocks initialise the lanes directly. + vmovdqu64 zmm14, [rsi] + vmovdqu64 zmm15, [rsi+64] + vmovdqu64 zmm16, [r11] + vpermi2q zmm16, zmm14, zmm15 + vmovdqu64 zmm17, [r12] + vpermi2q zmm17, zmm14, zmm15 + vpandq zmm0, zmm16, [r8] + vpsrlq zmm14, zmm16, 44 + vpandq zmm15, zmm17, [r9] + vpsllq zmm15, zmm15, 20 + vporq zmm1, zmm15, zmm14 + vpsrlq zmm2, zmm17, 24 + vporq zmm2, zmm2, [r10] + add rsi, 128 + sub rdx, 128 + jz L_poly1305_avx512ifma_blocks_store + jmp L_poly1305_avx512ifma_blocks_load_r8 +L_poly1305_avx512ifma_blocks_begin_h: + vmovdqu64 zmm0, [rdi+752] + vmovdqu64 zmm1, [rdi+816] + vmovdqu64 zmm2, [rdi+880] + cmp BYTE PTR [rdi+616], 0 + je L_poly1305_avx512ifma_blocks_load_r8 + ; Finished: load the 8 distinct powers r^8..r^1. + vmovdqu64 zmm8, [rdi+224] + vmovdqu64 zmm9, [rdi+288] + vmovdqu64 zmm10, [rdi+624] + vmovdqu64 zmm11, [rdi+688] + vmovdqu64 zmm12, [r13] + vpermi2q zmm12, zmm10, zmm11 + vmovdqu64 zmm13, [r13] + vpermi2q zmm13, zmm8, zmm9 + vinserti64x4 zmm3, zmm12, ymm13, 1 + vmovdqu64 zmm12, [r13+64] + vpermi2q zmm12, zmm10, zmm11 + vmovdqu64 zmm13, [r13+64] + vpermi2q zmm13, zmm8, zmm9 + vinserti64x4 zmm4, zmm12, ymm13, 1 + vmovdqu64 zmm12, [r13+128] + vpermi2q zmm12, zmm10, zmm11 + vmovdqu64 zmm13, [r13+128] + vpermi2q zmm13, zmm8, zmm9 + vinserti64x4 zmm5, zmm12, ymm13, 1 + jmp L_poly1305_avx512ifma_blocks_do_mul +L_poly1305_avx512ifma_blocks_load_r8: + vpbroadcastq zmm3, QWORD PTR [rdi+720] + vpbroadcastq zmm4, QWORD PTR [rdi+728] + vpbroadcastq zmm5, QWORD PTR [rdi+736] +L_poly1305_avx512ifma_blocks_do_mul: + vpsllq zmm14, zmm4, 2 + vpsllq zmm6, zmm4, 4 + vpaddq zmm6, zmm6, zmm14 + vpsllq zmm14, zmm5, 2 + vpsllq zmm7, zmm5, 4 + vpaddq zmm7, zmm7, zmm14 + cmp BYTE PTR [rdi+616], 1 + jne L_poly1305_avx512ifma_blocks_start + ; Finished: final multiply, collapse lanes, reduce to ctx->h. + vpxorq zmm8, zmm8, zmm8 + vpxorq zmm9, zmm9, zmm9 + vpxorq zmm10, zmm10, zmm10 + vpxorq zmm11, zmm11, zmm11 + vpxorq zmm12, zmm12, zmm12 + vpxorq zmm13, zmm13, zmm13 + vpmadd52luq zmm8, zmm0, zmm3 + vpmadd52luq zmm8, zmm1, zmm7 + vpmadd52luq zmm8, zmm2, zmm6 + vpmadd52huq zmm11, zmm0, zmm3 + vpmadd52huq zmm11, zmm1, zmm7 + vpmadd52huq zmm11, zmm2, zmm6 + vpmadd52luq zmm9, zmm0, zmm4 + vpmadd52luq zmm9, zmm1, zmm3 + vpmadd52luq zmm9, zmm2, zmm7 + vpmadd52huq zmm12, zmm0, zmm4 + vpmadd52huq zmm12, zmm1, zmm3 + vpmadd52huq zmm12, zmm2, zmm7 + vpmadd52luq zmm10, zmm0, zmm5 + vpmadd52luq zmm10, zmm1, zmm4 + vpmadd52luq zmm10, zmm2, zmm3 + vpmadd52huq zmm13, zmm0, zmm5 + vpmadd52huq zmm13, zmm1, zmm4 + vpmadd52huq zmm13, zmm2, zmm3 + vpsllq zmm14, zmm11, 8 + vpaddq zmm9, zmm14, zmm9 + vpsllq zmm14, zmm12, 8 + vpaddq zmm10, zmm14, zmm10 + vpsllq zmm15, zmm13, 8 + vpsllq zmm14, zmm15, 2 + vpsllq zmm15, zmm15, 4 + vpaddq zmm15, zmm15, zmm14 + vpaddq zmm8, zmm15, zmm8 + vpsrlq zmm14, zmm8, 44 + vpandq zmm0, zmm8, zmm18 + vpaddq zmm9, zmm14, zmm9 + vpsrlq zmm14, zmm9, 44 + vpandq zmm1, zmm9, zmm18 + vpaddq zmm10, zmm14, zmm10 + vpsrlq zmm14, zmm10, 44 + vpandq zmm2, zmm10, zmm18 + vpsllq zmm15, zmm14, 2 + vpsllq zmm14, zmm14, 4 + vpaddq zmm14, zmm14, zmm15 + vpaddq zmm0, zmm14, zmm0 + vshufi64x2 zmm14, zmm0, zmm0, 78 + vshufi64x2 zmm15, zmm1, zmm1, 78 + vshufi64x2 zmm16, zmm2, zmm2, 78 + vpaddq zmm0, zmm14, zmm0 + vpaddq zmm1, zmm15, zmm1 + vpaddq zmm2, zmm16, zmm2 + vpsrldq zmm14, zmm0, 8 + vpsrldq zmm15, zmm1, 8 + vpsrldq zmm16, zmm2, 8 + vpaddq zmm0, zmm14, zmm0 + vpaddq zmm1, zmm15, zmm1 + vpaddq zmm2, zmm16, zmm2 + vpermq zmm14, zmm0, 2 + vpermq zmm15, zmm1, 2 + vpermq zmm16, zmm2, 2 + vpaddq zmm0, zmm14, zmm0 + vpaddq zmm1, zmm15, zmm1 + vpaddq zmm2, zmm16, zmm2 + vmovq rax, xmm0 + vmovq rcx, xmm1 + vmovq rdx, xmm2 + mov r9, rcx + shr r9, 20 + mov r10, rdx + shr r10, 40 + mov r8, rax + mov rax, rcx + shl rax, 44 + add r8, rax + adc r9, 0 + mov rax, rdx + shl rax, 24 + add r9, rax + adc r10, 0 + mov r14, r10 + and r10, 3 + shr r14, 2 + lea r14, QWORD PTR [r14+4*r14+0] + add r8, r14 + adc r9, 0 + adc r10, 0 + mov QWORD PTR [rdi+24], r8 + mov QWORD PTR [rdi+32], r9 + mov QWORD PTR [rdi+40], r10 + jmp L_poly1305_avx512ifma_blocks_end_calc +L_poly1305_avx512ifma_blocks_start: + vmovdqu64 zmm14, [rsi] + vmovdqu64 zmm15, [rsi+64] + vmovdqu64 zmm16, [r11] + vpermi2q zmm16, zmm14, zmm15 + vmovdqu64 zmm17, [r12] + vpermi2q zmm17, zmm14, zmm15 + vpandq zmm8, zmm16, [r8] + vpsrlq zmm14, zmm16, 44 + vpandq zmm15, zmm17, [r9] + vpsllq zmm15, zmm15, 20 + vporq zmm9, zmm15, zmm14 + vpsrlq zmm10, zmm17, 24 + vporq zmm10, zmm10, [r10] + vpxorq zmm11, zmm11, zmm11 + vpxorq zmm12, zmm12, zmm12 + vpxorq zmm13, zmm13, zmm13 + vpmadd52luq zmm8, zmm0, zmm3 + vpmadd52luq zmm8, zmm1, zmm7 + vpmadd52luq zmm8, zmm2, zmm6 + vpmadd52huq zmm11, zmm0, zmm3 + vpmadd52huq zmm11, zmm1, zmm7 + vpmadd52huq zmm11, zmm2, zmm6 + vpmadd52luq zmm9, zmm0, zmm4 + vpmadd52luq zmm9, zmm1, zmm3 + vpmadd52luq zmm9, zmm2, zmm7 + vpmadd52huq zmm12, zmm0, zmm4 + vpmadd52huq zmm12, zmm1, zmm3 + vpmadd52huq zmm12, zmm2, zmm7 + vpmadd52luq zmm10, zmm0, zmm5 + vpmadd52luq zmm10, zmm1, zmm4 + vpmadd52luq zmm10, zmm2, zmm3 + vpmadd52huq zmm13, zmm0, zmm5 + vpmadd52huq zmm13, zmm1, zmm4 + vpmadd52huq zmm13, zmm2, zmm3 + vpsllq zmm14, zmm11, 8 + vpaddq zmm9, zmm14, zmm9 + vpsllq zmm14, zmm12, 8 + vpaddq zmm10, zmm14, zmm10 + vpsllq zmm15, zmm13, 8 + vpsllq zmm14, zmm15, 2 + vpsllq zmm15, zmm15, 4 + vpaddq zmm15, zmm15, zmm14 + vpaddq zmm8, zmm15, zmm8 + vpsrlq zmm14, zmm8, 44 + vpandq zmm0, zmm8, zmm18 + vpaddq zmm9, zmm14, zmm9 + vpsrlq zmm14, zmm9, 44 + vpandq zmm1, zmm9, zmm18 + vpaddq zmm10, zmm14, zmm10 + vpsrlq zmm14, zmm10, 44 + vpandq zmm2, zmm10, zmm18 + vpsllq zmm15, zmm14, 2 + vpsllq zmm14, zmm14, 4 + vpaddq zmm14, zmm14, zmm15 + vpaddq zmm0, zmm14, zmm0 + add rsi, 128 + sub rdx, 128 + jnz L_poly1305_avx512ifma_blocks_start +L_poly1305_avx512ifma_blocks_store: + vmovdqu64 [rdi+752], zmm0 + vmovdqu64 [rdi+816], zmm1 + vmovdqu64 [rdi+880], zmm2 +L_poly1305_avx512ifma_blocks_end_calc: +L_poly1305_avx512ifma_blocks_complete: + mov BYTE PTR [rdi+617], 1 + vzeroupper + vmovdqu xmm6, OWORD PTR [rsp] + vmovdqu xmm7, OWORD PTR [rsp+16] + vmovdqu xmm8, OWORD PTR [rsp+32] + vmovdqu xmm9, OWORD PTR [rsp+48] + vmovdqu xmm10, OWORD PTR [rsp+64] + vmovdqu xmm11, OWORD PTR [rsp+80] + vmovdqu xmm12, OWORD PTR [rsp+96] + vmovdqu xmm13, OWORD PTR [rsp+112] + vmovdqu xmm14, OWORD PTR [rsp+128] + vmovdqu xmm15, OWORD PTR [rsp+144] + add rsp, 160 + pop r14 + pop r13 + pop r12 + pop rsi + pop rdi + ret +poly1305_blocks_avx512ifma ENDP +_TEXT ENDS +_TEXT SEGMENT READONLY PARA +poly1305_final_avx512ifma PROC + push rdi + push rsi + mov rdi, rcx + mov rsi, rdx + mov BYTE PTR [rdi+616], 1 + mov cl, BYTE PTR [rdi+617] + cmp cl, 0 + je L_poly1305_avx512ifma_final_done_blocks_8 + push rsi + mov r8, 128 + xor rdx, rdx + mov rcx, rdi + call poly1305_blocks_avx512ifma + pop rsi +L_poly1305_avx512ifma_final_done_blocks_8: + mov rax, QWORD PTR [rdi+608] + mov rcx, rax + and rcx, -16 + cmp cl, 0 + je L_poly1305_avx512ifma_final_done_blocks + push rcx + push rax + push rsi + mov r8, rcx + lea rdx, QWORD PTR [rdi+480] + mov rcx, rdi + call poly1305_blocks_avx + pop rsi + pop rax + pop rcx +L_poly1305_avx512ifma_final_done_blocks: + sub QWORD PTR [rdi+608], rcx + xor rdx, rdx + jmp L_poly1305_avx512ifma_final_cmp_copy +L_poly1305_avx512ifma_final_start_copy: + mov r8b, BYTE PTR [rdi+rcx+480] + mov BYTE PTR [rdi+rdx+480], r8b + inc cl + inc dl +L_poly1305_avx512ifma_final_cmp_copy: + cmp al, cl + jne L_poly1305_avx512ifma_final_start_copy + mov rcx, rdi + mov rdx, rsi + call poly1305_final_avx + vpxorq zmm0, zmm0, zmm0 + vmovdqu YMMWORD PTR [rdi+224], ymm0 + vmovdqu YMMWORD PTR [rdi+256], ymm0 + vmovdqu YMMWORD PTR [rdi+288], ymm0 + vmovdqu YMMWORD PTR [rdi+320], ymm0 + vmovdqu YMMWORD PTR [rdi+624], ymm0 + vmovdqu YMMWORD PTR [rdi+656], ymm0 + vmovdqu YMMWORD PTR [rdi+688], ymm0 + vmovdqu YMMWORD PTR [rdi+720], ymm0 + vmovdqu64 [rdi+752], zmm0 + vmovdqu64 [rdi+816], zmm0 + vmovdqu64 [rdi+880], zmm0 + mov QWORD PTR [rdi+608], 0 + mov WORD PTR [rdi+616], 0 + vzeroupper + pop rsi + pop rdi + ret +poly1305_final_avx512ifma ENDP +_TEXT ENDS +_TEXT SEGMENT READONLY PARA +poly1305_fold_avx512ifma PROC + push r12 + push r13 + push r14 + push r15 + push rdi + push rsi + push rbx + push rbp + sub rsp, 64 + mov DWORD PTR [rsp+24], edx + mov r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+8] + xor r10, r10 + mov QWORD PTR [rsp], r8 + mov QWORD PTR [rsp+8], r9 + mov QWORD PTR [rsp+16], r10 + bsrq rax, rdx + mov QWORD PTR [rsp+32], rax +L_poly1305_fold_loop: + mov rax, QWORD PTR [rsp+32] + test rax, rax + jz L_poly1305_fold_done + dec rax + mov QWORD PTR [rsp+32], rax + mov r8, QWORD PTR [rsp] + mov r9, QWORD PTR [rsp+8] + mov r10, QWORD PTR [rsp+16] + ; Square 130-bit + mov rax, r9 + mul r8 + xor r14, r14 + mov r12, rax + mov r13, rdx + add r12, rax + adc r13, rdx + adc r14, 0 + mov rax, r8 + mul rax + mov r11, rax + mov rdi, rdx + mov rax, r9 + mul rax + add r12, rdi + adc r13, rax + adc r14, rdx + mov rax, r10 + mul rax + mov r15, rax + mov rax, r10 + mul r8 + add r13, rax + adc r14, rdx + adc r15, 0 + add r13, rax + adc r14, rdx + adc r15, 0 + mov rax, r10 + mul r9 + add r14, rax + adc r15, rdx + add r14, rax + adc r15, rdx + ; Reduce 260-bit to 130-bit + mov rax, r13 + mov rdx, r14 + mov rdi, r15 + and rax, -4 + and r13, 3 + add r11, rax + adc r12, rdx + adc r13, rdi + shrd rax, rdx, 2 + shrd rdx, rdi, 2 + shr rdi, 2 + add r11, rax + adc r12, rdx + adc r13, rdi + mov rax, r13 + and r13, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r11, rax + adc r12, 0 + adc r13, 0 + mov QWORD PTR [rsp], r11 + mov QWORD PTR [rsp+8], r12 + mov QWORD PTR [rsp+16], r13 + mov eax, DWORD PTR [rsp+24] + mov rdx, QWORD PTR [rsp+32] + btq rax, rdx + jnc L_poly1305_fold_skip + mov r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+8] + xor r10, r10 + mov r11, QWORD PTR [rsp] + mov r12, QWORD PTR [rsp+8] + mov r13, QWORD PTR [rsp+16] + ; Multiply 128-bit by 130-bit + ; r1[0] * r2[0] + mov rax, r8 + mul r11 + mov r14, rax + mov r15, rdx + ; r1[0] * r2[1] + mov rax, r8 + mul r12 + mov rdi, 0 + add r15, rax + adc rdi, rdx + ; r1[1] * r2[0] + mov rax, r9 + mul r11 + mov rsi, 0 + add r15, rax + adc rdi, rdx + adc rsi, 0 + ; r1[0] * r2[2] + mov rax, r8 + mul r13 + add rdi, rax + adc rsi, rdx + ; r1[1] * r2[1] + mov rax, r9 + mul r12 + mov rbx, 0 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[2] + mov rax, r9 + mul r13 + add rsi, rax + adc rbx, rdx + ; Reduce 260-bit to 130-bit + mov rax, rdi + mov rdx, rsi + and rax, -4 + and rdi, 3 + add r14, rax + adc r15, rdx + adc rdi, rbx + shrd rax, rdx, 2 + shrd rdx, rbx, 2 + shr rbx, 2 + add r14, rax + adc r15, rdx + adc rdi, rbx + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + mov QWORD PTR [rsp], r14 + mov QWORD PTR [rsp+8], r15 + mov QWORD PTR [rsp+16], rdi +L_poly1305_fold_skip: + jmp L_poly1305_fold_loop +L_poly1305_fold_done: + mov r8, QWORD PTR [rcx+64] + mov r9, QWORD PTR [rcx+72] + mov r10, QWORD PTR [rcx+80] + mov r11, QWORD PTR [rsp] + mov r12, QWORD PTR [rsp+8] + mov r13, QWORD PTR [rsp+16] + ; Multiply 130-bit by 130-bit + mov r14, 0 + mov r15, 0 + mov rdi, 0 + mov rsi, 0 + mov rbx, 0 + ; r1[0] * r2[0] + mov rax, r8 + mul r11 + add r14, rax + adc r15, rdx + adc rdi, 0 + adc rsi, 0 + adc rbx, 0 + ; r1[0] * r2[1] + mov rax, r8 + mul r12 + add r15, rax + adc rdi, rdx + adc rsi, 0 + adc rbx, 0 + ; r1[0] * r2[2] + mov rax, r8 + mul r13 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[0] + mov rax, r9 + mul r11 + add r15, rax + adc rdi, rdx + adc rsi, 0 + adc rbx, 0 + ; r1[1] * r2[1] + mov rax, r9 + mul r12 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[2] + mov rax, r9 + mul r13 + add rsi, rax + adc rbx, rdx + ; r1[2] * r2[0] + mov rax, r10 + mul r11 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[2] * r2[1] + mov rax, r10 + mul r12 + add rsi, rax + adc rbx, rdx + ; r1[2] * r2[2] + mov rax, r10 + mul r13 + add rbx, rax + ; Reduce 260-bit to 130-bit + mov rax, rdi + mov rdx, rsi + mov rbp, rbx + and rax, -4 + and rdi, 3 + add r14, rax + adc r15, rdx + adc rdi, rbp + shrd rax, rdx, 2 + shrd rdx, rbp, 2 + shr rbp, 2 + add r14, rax + adc r15, rdx + adc rdi, rbp + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + mov rax, QWORD PTR [rcx+24] + add r14, rax + mov rax, QWORD PTR [rcx+32] + adc r15, rax + mov rax, QWORD PTR [rcx+40] + adc rdi, rax + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + mov QWORD PTR [rcx+24], r14 + mov QWORD PTR [rcx+32], r15 + mov QWORD PTR [rcx+40], rdi + add rsp, 64 + pop rbp + pop rbx + pop rsi + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + ret +poly1305_fold_avx512ifma ENDP +_TEXT ENDS +ENDIF END diff --git a/wolfssl/wolfcrypt/chacha20_poly1305.h b/wolfssl/wolfcrypt/chacha20_poly1305.h index 8daba6d0784..051430f4b98 100644 --- a/wolfssl/wolfcrypt/chacha20_poly1305.h +++ b/wolfssl/wolfcrypt/chacha20_poly1305.h @@ -104,6 +104,20 @@ int wc_ChaCha20Poly1305_Decrypt( const byte inAuthTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE], byte* outPlaintext); +/* Encrypt+authenticate one message with pre-keyed ChaCha20 and Poly1305 + * contexts (analogue of wc_AesGcmEncrypt on a keyed Aes) - keeps the ChaCha key + * across records and only varies the nonce, and uses the single-pass stitch. + * Intended for the TLS record layer. */ +WOLFSSL_API int wc_ChaCha20Poly1305_Encrypt_ex(ChaCha* chacha, Poly1305* poly, + byte* out, const byte* in, word32 sz, const byte* nonce, byte* tag, + const byte* aad, word32 aadSz); +/* Decrypt+verify counterpart of wc_ChaCha20Poly1305_Encrypt_ex. On tag + * mismatch returns MAC_CMP_FAILED_E and zeroizes out (no plaintext released); + * out may alias in (in-place). */ +WOLFSSL_API WARN_UNUSED_RESULT int wc_ChaCha20Poly1305_Decrypt_ex( + ChaCha* chacha, Poly1305* poly, byte* out, const byte* in, word32 sz, + const byte* nonce, const byte* tag, const byte* aad, word32 aadSz); + WOLFSSL_API WARN_UNUSED_RESULT int wc_ChaCha20Poly1305_CheckTag( const byte authTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE], diff --git a/wolfssl/wolfcrypt/cpuid.h b/wolfssl/wolfcrypt/cpuid.h index faf96c6159d..3422306f58a 100644 --- a/wolfssl/wolfcrypt/cpuid.h +++ b/wolfssl/wolfcrypt/cpuid.h @@ -77,6 +77,9 @@ typedef word32 cpuid_flags_t; /* CPU vendor is AuthenticAMD. Detected and exposed via IS_CPU_AMD() for * future vendor-specific dispatch; no current caller relies on it. */ #define CPUID_AMD 0x2000 + #define CPUID_SSSE3 0x4000 + #define CPUID_AVX512VL 0x8000 + #define CPUID_AVX512_IFMA 0x10000 #define IS_INTEL_AVX1(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_AVX1) #define IS_INTEL_AVX2(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_AVX2) @@ -92,6 +95,11 @@ typedef word32 cpuid_flags_t; #define IS_INTEL_AVX512(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_AVX512) #define IS_CPU_INTEL(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_INTEL) #define IS_CPU_AMD(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_AMD) + #define IS_INTEL_SSSE3(f) (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_SSSE3) + #define IS_INTEL_AVX512VL(f) \ + (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_AVX512VL) + #define IS_INTEL_AVX512_IFMA(f) \ + (WOLFSSL_ATOMIC_COERCE_UINT(f) & CPUID_AVX512_IFMA) #elif defined(HAVE_CPUID_AARCH64) diff --git a/wolfssl/wolfcrypt/poly1305.h b/wolfssl/wolfcrypt/poly1305.h index dbf575cd1e4..2e97cdf4c16 100644 --- a/wolfssl/wolfcrypt/poly1305.h +++ b/wolfssl/wolfcrypt/poly1305.h @@ -52,6 +52,29 @@ #if defined(USE_INTEL_SPEEDUP) && !defined(NO_POLY1305_ASM) #define USE_INTEL_POLY1305_SPEEDUP #define HAVE_INTEL_AVX1 + /* 8-way AVX-512 path. Enabling it appends r^5..r^8 to the state (see the + * struct below); define WOLFSSL_POLY1305_NO_AVX512 to keep the smaller + * state and drop the path. */ + #if !defined(WOLFSSL_POLY1305_NO_AVX512) + #define WOLFSSL_POLY1305_AVX512 + #endif + /* Fused single-pass ChaCha20-Poly1305 (encrypt). It drives Poly1305 in the + * 4-way layout, so the ctx carries a flag forcing that path. */ + #if !defined(WOLFSSL_NO_CHACHA20_POLY1305_FUSED) + #define WOLFSSL_CHACHA20_POLY1305_FUSED + #endif + /* IFMA stitched single-pass ChaCha20-Poly1305 (AVX-512 + IFMA): a full + * 512-bit 16-block ChaCha interleaved with an 8-way IFMA (vpmadd52) + * Poly1305 that collapses to the scalar hash. It BEATS the two-pass by + * ~1.3-1.4x (>=16KB) - ChaCha is the bottleneck and Poly hides under it - + * so it is ON by default and runtime-gated on the AVX-512 + IFMA flags. + * Needs the AVX-512 IFMA state (r^1..r^8, ifma_h), so it follows + * WOLFSSL_POLY1305_AVX512. Define WOLFSSL_NO_CHACHA20_POLY1305_FUSED_IFMA + * to drop it; it drives Poly1305 scalar via the forceScalar flag. */ + #if defined(WOLFSSL_POLY1305_AVX512) && \ + !defined(WOLFSSL_NO_CHACHA20_POLY1305_FUSED_IFMA) + #define WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + #endif #endif #endif @@ -100,6 +123,31 @@ typedef struct Poly1305 { size_t leftover; unsigned char finished; unsigned char started; +#ifdef WOLFSSL_POLY1305_AVX512 + /* r^5..r^8 for the 8-way path, appended so the AVX1/AVX2 field offsets are + * unchanged. ALIGN8 keeps each power 8-byte aligned (26-bit limb packing + * matches r1..r4). */ + ALIGN8 word32 r5[8]; + word32 r6[8]; + word32 r7[8]; + word32 r8[8]; + /* IFMA path (radix 2^44) keeps r^1..r^8 in the r1..r8 fields above (three + * 44-bit limbs each) and its eight-lane running hash here: three limbs x + * eight lanes x 64-bit. hh (32-bit packed) is too small for 44-bit lanes. + */ + ALIGN8 word64 ifma_h[24]; +#endif +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED + /* When set, wc_Poly1305Update/Final use the 4-way path so the fused + * ChaCha20-Poly1305 kernel (also 4-way) stays layout-consistent. */ + unsigned char forceAvx2; +#endif +#ifdef WOLFSSL_CHACHA20_POLY1305_FUSED_IFMA + /* When set, wc_Poly1305Update/Final use the scalar path so the fused IFMA + * ChaCha20-Poly1305 stitch (which finishes in the scalar hash) stays + * layout-consistent. */ + unsigned char forceScalar; +#endif #elif defined(WOLFSSL_ARMASM) && defined(__aarch64__) ALIGN8 word64 r64[2]; ALIGN8 word32 r4[4];