From ce8959ea77265eef1d84925be2ab4a634f8044f9 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 1 Sep 2022 15:07:15 +1000 Subject: [PATCH] SHA-3 improvements Add x86_64 assembly code: - BMI2 - AVX2 (using ymm, slower than BMI2) - AVX2 of 4 similtaneous hashes Add SHAKE128 functions and tests. Add Absorb and Squeeze functions for SHAKE128 and SHAK256 and tests. Add doxygen for SHA-3 and SHAKE functions. Update other generated x86_64 assembly files to include settings.h. --- configure.ac | 27 + doc/dox_comments/header_files/hash.h | 173 +- doc/dox_comments/header_files/sha3.h | 1249 +++ src/include.am | 9 + wolfcrypt/src/aes_gcm_asm.S | 4 + wolfcrypt/src/chacha_asm.S | 4 + wolfcrypt/src/evp.c | 16 +- wolfcrypt/src/fe_x25519_asm.S | 4 + wolfcrypt/src/hash.c | 83 +- wolfcrypt/src/poly1305_asm.S | 4 + wolfcrypt/src/rsa.c | 4 +- wolfcrypt/src/sha256_asm.S | 4 + wolfcrypt/src/sha3.c | 267 +- wolfcrypt/src/sha3_asm.S | 14868 +++++++++++++++++++++++++ wolfcrypt/src/sha512_asm.S | 4 + wolfcrypt/test/test.c | 501 + wolfssl/wolfcrypt/hash.h | 7 +- wolfssl/wolfcrypt/sha3.h | 41 +- wolfssl/wolfcrypt/types.h | 4 +- 19 files changed, 17223 insertions(+), 50 deletions(-) create mode 100644 doc/dox_comments/header_files/sha3.h create mode 100644 wolfcrypt/src/sha3_asm.S diff --git a/configure.ac b/configure.ac index b798a5eb1..c36fca054 100644 --- a/configure.ac +++ b/configure.ac @@ -2605,6 +2605,13 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA3_SMALL" fi +# SHAKE128 +AC_ARG_ENABLE([shake128], + [AS_HELP_STRING([--enable-shake128],[Enable wolfSSL SHAKE128 support (default: disabled)])], + [ ENABLED_SHAKE128=$enableval ], + [ ENABLED_SHAKE128=no ] + ) + # SHAKE256 AC_ARG_ENABLE([shake256], [AS_HELP_STRING([--enable-shake256],[Enable wolfSSL SHAKE256 support (default: disabled)])], @@ -4009,6 +4016,10 @@ AS_CASE([$FIPS_VERSION], AS_IF([test "$ENABLED_WOLFSSH" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_ssh" != "no")], [enable_ssh="yes"]) + # Shake128 is a SHA-3 algorithm not in our FIPS algorithm list + AS_IF([test "$ENABLED_SHAKE128" != "no" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_shake128" != "yes")], + [ENABLED_SHAKE128=no; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_SHAKE128"]) + # Shake256 is a SHA-3 algorithm not in our FIPS algorithm list AS_IF([test "$ENABLED_SHAKE256" != "no" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_shake256" != "yes")], [ENABLED_SHAKE256=no; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_SHAKE256"]) @@ -4164,6 +4175,21 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA3" fi +# Set SHAKE128 flags +# FIPS does not support SHAKE 128 +AS_IF([test "x$ENABLED_FIPS" = "xyes"],[ENABLED_SHAKE128="no"]) + +if test "$ENABLED_SHAKE128" != "no" && test "$ENABLED_32BIT" = "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHAKE128" + if test "$ENABLED_SHA3" = "no" + then + AC_MSG_ERROR([Must have SHA-3 enabled: --enable-sha3]) + fi +else + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_SHAKE128" +fi + # Set SHAKE256 flags # FIPS does not support SHAKE 256 AS_IF([test "x$ENABLED_FIPS" = "xyes"],[ENABLED_SHAKE256="no"]) @@ -8361,6 +8387,7 @@ echo " * SHA-224: $ENABLED_SHA224" echo " * SHA-384: $ENABLED_SHA384" echo " * SHA-512: $ENABLED_SHA512" echo " * SHA3: $ENABLED_SHA3" +echo " * SHAKE128: $ENABLED_SHAKE128" echo " * SHAKE256: $ENABLED_SHAKE256" echo " * BLAKE2: $ENABLED_BLAKE2" echo " * BLAKE2S: $ENABLED_BLAKE2S" diff --git a/doc/dox_comments/header_files/hash.h b/doc/dox_comments/header_files/hash.h index 4d5ea6f37..5fcc2e7b5 100644 --- a/doc/dox_comments/header_files/hash.h +++ b/doc/dox_comments/header_files/hash.h @@ -143,6 +143,30 @@ int wc_Md5Hash(const byte* data, word32 len, byte* hash); */ int wc_ShaHash(const byte* data, word32 len, byte* hash); +/*! + \ingroup SHA + + \brief Convenience function, handles all the hashing and places the + result into hash. + + \return 0 Success + \return <0 Error + + \param data the data to hash + \param len the length of data + \param hash Byte array to hold hash value. + + _Example_ + \code + none + \endcode + + \sa wc_InitSha224 + \sa wc_Sha224Update + \sa wc_Sha224Final +*/ +int wc_Sha224Hash(const byte* data, word32 len, byte* hash); + /*! \ingroup SHA @@ -174,8 +198,9 @@ int wc_Sha256Hash(const byte* data, word32 len, byte* hash); \brief Convenience function, handles all the hashing and places the result into hash. - \return 0 Success - \return <0 Error + \return 0 Returned upon successfully hashing the data + \return Memory_E memory error, unable to allocate memory. This is only + possible with the small stack option enabled. \param data the data to hash \param len the length of data @@ -186,11 +211,11 @@ int wc_Sha256Hash(const byte* data, word32 len, byte* hash); none \endcode - \sa wc_InitSha224 - \sa wc_Sha224Update - \sa wc_Sha224Final + \sa wc_Sha384Hash + \sa wc_Sha384Final + \sa wc_InitSha384 */ -int wc_Sha224Hash(const byte* data, word32 len, byte* hash); +int wc_Sha384Hash(const byte* data, word32 len, byte* hash); /*! \ingroup SHA @@ -236,8 +261,136 @@ int wc_Sha512Hash(const byte* data, word32 len, byte* hash); none \endcode - \sa wc_Sha384Hash - \sa wc_Sha384Final - \sa wc_InitSha384 + \sa wc_InitSha3_224 + \sa wc_Sha3_224_Update + \sa wc_Sha3_224_Final */ -int wc_Sha384Hash(const byte* data, word32 len, byte* hash); +int wc_Sha3_224Hash(const byte* data, word32 len, byte* hash); + +/*! + \ingroup SHA + + \brief Convenience function, handles all the hashing and places the + result into hash. + + \return 0 Returned upon successfully hashing the data + \return Memory_E memory error, unable to allocate memory. This is only + possible with the small stack option enabled. + + \param data the data to hash + \param len the length of data + \param hash Byte array to hold hash value. + + _Example_ + \code + none + \endcode + + \sa wc_InitSha3_256 + \sa wc_Sha3_256_Update + \sa wc_Sha3_256_Final +*/ +int wc_Sha3_256Hash(const byte* data, word32 len, byte* hash); + +/*! + \ingroup SHA + + \brief Convenience function, handles all the hashing and places the + result into hash. + + \return 0 Returned upon successfully hashing the data + \return Memory_E memory error, unable to allocate memory. This is only + possible with the small stack option enabled. + + \param data the data to hash + \param len the length of data + \param hash Byte array to hold hash value. + + _Example_ + \code + none + \endcode + + \sa wc_InitSha3_384 + \sa wc_Sha3_384_Update + \sa wc_Sha3_384_Final +*/ +int wc_Sha3_384Hash(const byte* data, word32 len, byte* hash); + +/*! + \ingroup SHA + + \brief Convenience function, handles all the hashing and places the + result into hash. + + \return 0 Returned upon successfully hashing the inputted data + \return Memory_E memory error, unable to allocate memory. This is only + possible with the small stack option enabled. + + \param data the data to hash + \param len the length of data + \param hash Byte array to hold hash value. + + _Example_ + \code + none + \endcode + + \sa wc_InitSha3_512 + \sa wc_Sha3_512_Update + \sa wc_Sha3_512_Final +*/ +int wc_Sha3_512Hash(const byte* data, word32 len, byte* hash); + +/*! + \ingroup SHA + + \brief Convenience function, handles all the hashing and places the + result into hash. + + \return 0 Returned upon successfully hashing the inputted data + \return Memory_E memory error, unable to allocate memory. This is only + possible with the small stack option enabled. + + \param data the data to hash + \param len the length of data + \param hash Byte array to hold hash value. + + _Example_ + \code + none + \endcode + + \sa wc_InitShake128 + \sa wc_Shake128_Update + \sa wc_Shake128_Final +*/ +int wc_Shake128Hash(const byte* data, word32 len, byte* hash); + +/*! + \ingroup SHA + + \brief Convenience function, handles all the hashing and places the + result into hash. + + \return 0 Returned upon successfully hashing the inputted data + \return Memory_E memory error, unable to allocate memory. This is only + possible with the small stack option enabled. + + \param data the data to hash + \param len the length of data + \param hash Byte array to hold hash value. + + _Example_ + \code + none + \endcode + + \sa wc_InitShake256 + \sa wc_Shake256_Update + \sa wc_Shake256_Final +*/ +int wc_Shake256Hash(const byte* data, word32 len, byte* hash); + + + diff --git a/doc/dox_comments/header_files/sha3.h b/doc/dox_comments/header_files/sha3.h new file mode 100644 index 000000000..ff6e4aed5 --- /dev/null +++ b/doc/dox_comments/header_files/sha3.h @@ -0,0 +1,1249 @@ +/*! + \ingroup SHA + + \brief This function initializes SHA3-224. This is automatically + called by wc_Sha3_224Hash. + + \return 0 Returned upon successfully initializing + + \param sha3 pointer to the sha3 structure to use for encryption + + _Example_ + \code + wc_Sha3 sha3[1]; + if ((ret = wc_InitSha3_224(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_224 failed"); + } + else { + wc_Sha3_224_Update(sha3, data, len); + wc_Sha3_224_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_224Hash + \sa wc_Sha3_224_Update + \sa wc_Sha3_224_Final +*/ +int wc_InitSha3_224(wc_Sha3* sha3, void* heap, int devId); + +/*! + \ingroup SHA + + \brief Can be called to continually hash the provided byte + array of length len. + + \return 0 Returned upon successfully adding the data to the digest. + + \param sha3 pointer to the sha3 structure to use for encryption + \param data the data to be hashed + \param len length of data to be hashed + + _Example_ + \code + wc_Sha3 sha3[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_224(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_224 failed"); + } + else { + wc_Sha3_224_Update(sha3, data, len); + wc_Sha3_224_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_224Hash + \sa wc_Sha3_224_Final + \sa wc_InitSha3_224 +*/ +int wc_Sha3_224_Update(wc_Sha3* sha, const byte* data, word32 len); + +/*! + \ingroup SHA + + \brief Finalizes hashing of data. Result is placed into hash. + Resets state of sha3 struct. + + \return 0 Returned upon successfully finalizing. + + \param sha3 pointer to the sha3 structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Sha3 sha3[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_224(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_224 failed"); + } + else { + wc_Sha3_224_Update(sha3, data, len); + wc_Sha3_224_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_224Hash + \sa wc_Sha3_224_GetHash + \sa wc_InitSha3_224 +*/ +int wc_Sha3_224_Final(wc_Sha3* sha3, byte* hash); + +/*! + \ingroup SHA + + \brief Resets the wc_Sha3 structure. Note: this is only supported + if you have WOLFSSL_TI_HASH defined. + + \return none No returns. + + \param sha3 Pointer to the sha3 structure to be freed. + + _Example_ + \code + wc_Sha3 sha3; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_224(&sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_224 failed"); + } + else { + wc_Sha3_224_Update(&sha3, data, len); + wc_Sha3_224_Final(&sha3, hash); + wc_Sha3_224_Free(&sha3); + } + \endcode + + \sa wc_InitSha3_224 + \sa wc_Sha3_224_Update + \sa wc_Sha3_224_Final +*/ +void wc_Sha3_224_Free(wc_Sha3*); + +/*! + \ingroup SHA + + \brief Gets hash data. Result is placed into hash. Does not + reset state of sha3 struct. + + \return 0 Returned upon successful copying of the hash. + + \param sha3 pointer to the sha3 structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Sha3 sha3[1]; + if ((ret = wc_InitSha3_224(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_224 failed"); + } + else { + wc_Sha3_224_Update(sha3, data, len); + wc_Sha3_224_GetHash(sha3, hash); + } + \endcode + + \sa wc_Sha3_224Hash + \sa wc_Sha3_224_Final + \sa wc_InitSha3_224 + \sa wc_Sha3_224_Copy +*/ +int wc_Sha3_224_GetHash(wc_Sha3* sha3, byte* hash); + +/*! + \ingroup SHA + + \brief Copy the state of the hash. + + \return 0 Returned upon successful copying. + + \param sha3 pointer to the sha3 structure to copy + \param dst pointer to the sha3 structure to copy into + + _Example_ + \code + wc_Sha3 sha3[1]; + wc_Sha3 sha3_dup[1]; + if ((ret = wc_InitSha3_224(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_224 failed"); + } + else { + wc_Sha3_224_Update(sha3, data, len); + wc_Sha3_224_Copy(sha3, sha3_dup); + } + \endcode + + \sa wc_Sha3_224Hash + \sa wc_Sha3_224_Final + \sa wc_InitSha3_224 + \sa wc_Sha3_224_GetHash +*/ +int wc_Sha3_224_Copy(wc_Sha3* sha3, wc_Sha3* dst); + +/*! + \ingroup SHA + + \brief This function initializes SHA3-256. This is automatically + called by wc_Sha3_256Hash. + + \return 0 Returned upon successfully initializing + + \param sha3 pointer to the sha3 structure to use for encryption + + _Example_ + \code + wc_Sha3 sha3[1]; + if ((ret = wc_InitSha3_256(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_256 failed"); + } + else { + wc_Sha3_256_Update(sha3, data, len); + wc_Sha3_256_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_256Hash + \sa wc_Sha3_256_Update + \sa wc_Sha3_256_Final +*/ +int wc_InitSha3_256(wc_Sha3* sha3, void* heap, int devId); + +/*! + \ingroup SHA + + \brief Can be called to continually hash the provided byte + array of length len. + + \return 0 Returned upon successfully adding the data to the digest. + + \param sha3 pointer to the sha3 structure to use for encryption + \param data the data to be hashed + \param len length of data to be hashed + + _Example_ + \code + wc_Sha3 sha3[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_256(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_256 failed"); + } + else { + wc_Sha3_256_Update(sha3, data, len); + wc_Sha3_256_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_256Hash + \sa wc_Sha3_256_Final + \sa wc_InitSha3_256 +*/ +int wc_Sha3_256_Update(wc_Sha3* sha, const byte* data, word32 len); + +/*! + \ingroup SHA + + \brief Finalizes hashing of data. Result is placed into hash. + Resets state of sha3 struct. + + \return 0 Returned upon successfully finalizing. + + \param sha3 pointer to the sha3 structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Sha3 sha3[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_256(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_256 failed"); + } + else { + wc_Sha3_256_Update(sha3, data, len); + wc_Sha3_256_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_256Hash + \sa wc_Sha3_256_GetHash + \sa wc_InitSha3_256 +*/ +int wc_Sha3_256_Final(wc_Sha3* sha3, byte* hash); + +/*! + \ingroup SHA + + \brief Resets the wc_Sha3 structure. Note: this is only supported + if you have WOLFSSL_TI_HASH defined. + + \return none No returns. + + \param sha3 Pointer to the sha3 structure to be freed. + + _Example_ + \code + wc_Sha3 sha3; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_256(&sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_256 failed"); + } + else { + wc_Sha3_256_Update(&sha3, data, len); + wc_Sha3_256_Final(&sha3, hash); + wc_Sha3_256_Free(&sha3); + } + \endcode + + \sa wc_InitSha3_256 + \sa wc_Sha3_256_Update + \sa wc_Sha3_256_Final +*/ +void wc_Sha3_256_Free(wc_Sha3*); + +/*! + \ingroup SHA + + \brief Gets hash data. Result is placed into hash. Does not + reset state of sha3 struct. + + \return 0 Returned upon successful copying of the hash. + + \param sha3 pointer to the sha3 structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Sha3 sha3[1]; + if ((ret = wc_InitSha3_256(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_256 failed"); + } + else { + wc_Sha3_256_Update(sha3, data, len); + wc_Sha3_256_GetHash(sha3, hash); + } + \endcode + + \sa wc_Sha3_256Hash + \sa wc_Sha3_256_Final + \sa wc_InitSha3_256 + \sa wc_Sha3_256_Copy +*/ +int wc_Sha3_256_GetHash(wc_Sha3* sha3, byte* hash); + +/*! + \ingroup SHA + + \brief Copy the state of the hash. + + \return 0 Returned upon successful copying. + + \param sha3 pointer to the sha3 structure to copy + \param dst pointer to the sha3 structure to copy into + + _Example_ + \code + wc_Sha3 sha3[1]; + wc_Sha3 sha3_dup[1]; + if ((ret = wc_InitSha3_256(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_256 failed"); + } + else { + wc_Sha3_256_Update(sha3, data, len); + wc_Sha3_256_Copy(sha3, sha3_dup); + } + \endcode + + \sa wc_Sha3_256Hash + \sa wc_Sha3_256_Final + \sa wc_InitSha3_256 + \sa wc_Sha3_256_GetHash +*/ +int wc_Sha3_256_Copy(wc_Sha3* sha3, wc_Sha3* dst); + +/*! + \ingroup SHA + + \brief This function initializes SHA3-384. This is automatically + called by wc_Sha3_384Hash. + + \return 0 Returned upon successfully initializing + + \param sha3 pointer to the sha3 structure to use for encryption + + _Example_ + \code + wc_Sha3 sha3[1]; + if ((ret = wc_InitSha3_384(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_384 failed"); + } + else { + wc_Sha3_384_Update(sha3, data, len); + wc_Sha3_384_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_384Hash + \sa wc_Sha3_384_Update + \sa wc_Sha3_384_Final +*/ +int wc_InitSha3_384(wc_Sha3* sha3, void* heap, int devId); + +/*! + \ingroup SHA + + \brief Can be called to continually hash the provided byte + array of length len. + + \return 0 Returned upon successfully adding the data to the digest. + + \param sha3 pointer to the sha3 structure to use for encryption + \param data the data to be hashed + \param len length of data to be hashed + + _Example_ + \code + wc_Sha3 sha3[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_384(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_384 failed"); + } + else { + wc_Sha3_384_Update(sha3, data, len); + wc_Sha3_384_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_384Hash + \sa wc_Sha3_384_Final + \sa wc_InitSha3_384 +*/ +int wc_Sha3_384_Update(wc_Sha3* sha, const byte* data, word32 len); + +/*! + \ingroup SHA + + \brief Finalizes hashing of data. Result is placed into hash. + Resets state of sha3 struct. + + \return 0 Returned upon successfully finalizing. + + \param sha3 pointer to the sha3 structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Sha3 sha3[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_384(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_384 failed"); + } + else { + wc_Sha3_384_Update(sha3, data, len); + wc_Sha3_384_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_384Hash + \sa wc_Sha3_384_GetHash + \sa wc_InitSha3_384 +*/ +int wc_Sha3_384_Final(wc_Sha3* sha3, byte* hash); + +/*! + \ingroup SHA + + \brief Resets the wc_Sha3 structure. Note: this is only supported + if you have WOLFSSL_TI_HASH defined. + + \return none No returns. + + \param sha3 Pointer to the sha3 structure to be freed. + + _Example_ + \code + wc_Sha3 sha3; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_384(&sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_384 failed"); + } + else { + wc_Sha3_384_Update(&sha3, data, len); + wc_Sha3_384_Final(&sha3, hash); + wc_Sha3_384_Free(&sha3); + } + \endcode + + \sa wc_InitSha3_384 + \sa wc_Sha3_384_Update + \sa wc_Sha3_384_Final +*/ +void wc_Sha3_384_Free(wc_Sha3*); + +/*! + \ingroup SHA + + \brief Gets hash data. Result is placed into hash. Does not + reset state of sha3 struct. + + \return 0 Returned upon successful copying of the hash. + + \param sha3 pointer to the sha3 structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Sha3 sha3[1]; + if ((ret = wc_InitSha3_384(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_38384ailed"); + } + else { + wc_Sha3_384_Update(sha3, data, len); + wc_Sha3_384_GetHash(sha3, hash); + } + \endcode + + \sa wc_Sha3_384Hash + \sa wc_Sha3_384_Final + \sa wc_InitSha3_384 + \sa wc_Sha3_384_Copy +*/ +int wc_Sha3_384_GetHash(wc_Sha3* sha3, byte* hash); + +/*! + \ingroup SHA + + \brief Copy the state of the hash. + + \return 0 Returned upon successful copying. + + \param sha3 pointer to the sha3 structure to copy + \param dst pointer to the sha3 structure to copy into + + _Example_ + \code + wc_Sha3 sha3[1]; + wc_Sha3 sha3_dup[1]; + if ((ret = wc_InitSha3_384(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_384 failed"); + } + else { + wc_Sha3_384_Update(sha3, data, len); + wc_Sha3_384_Copy(sha3, sha3_dup); + } + \endcode + + \sa wc_Sha3_384Hash + \sa wc_Sha3_384_Final + \sa wc_InitSha3_384 + \sa wc_Sha3_384_GetHash +*/ +int wc_Sha3_384_Copy(wc_Sha3* sha3, wc_Sha3* dst); + +/*! + \ingroup SHA + + \brief This function initializes SHA3-512. This is automatically + called by wc_Sha3_512Hash. + + \return 0 Returned upon successfully initializing + + \param sha3 pointer to the sha3 structure to use for encryption + + _Example_ + \code + wc_Sha3 sha3[1]; + if ((ret = wc_InitSha3_512(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_512 failed"); + } + else { + wc_Sha3_512_Update(sha3, data, len); + wc_Sha3_512_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_512Hash + \sa wc_Sha3_512_Update + \sa wc_Sha3_512_Final +*/ +int wc_InitSha3_512(wc_Sha3* sha3, void* heap, int devId); + +/*! + \ingroup SHA + + \brief Can be called to continually hash the provided byte + array of length len. + + \return 0 Returned upon successfully adding the data to the digest. + + \param sha3 pointer to the sha3 structure to use for encryption + \param data the data to be hashed + \param len length of data to be hashed + + _Example_ + \code + wc_Sha3 sha3[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_512(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_512 failed"); + } + else { + wc_Sha3_512_Update(sha3, data, len); + wc_Sha3_512_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_512Hash + \sa wc_Sha3_512_Final + \sa wc_InitSha3_512 +*/ +int wc_Sha3_512_Update(wc_Sha3* sha, const byte* data, word32 len); + +/*! + \ingroup SHA + + \brief Finalizes hashing of data. Result is placed into hash. + Resets state of sha3 struct. + + \return 0 Returned upon successfully finalizing. + + \param sha3 pointer to the sha3 structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Sha3 sha3[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_512(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_512 failed"); + } + else { + wc_Sha3_512_Update(sha3, data, len); + wc_Sha3_512_Final(sha3, hash); + } + \endcode + + \sa wc_Sha3_512Hash + \sa wc_Sha3_512_GetHash + \sa wc_InitSha3_512 +*/ +int wc_Sha3_512_Final(wc_Sha3* sha3, byte* hash); + +/*! + \ingroup SHA + + \brief Resets the wc_Sha3 structure. Note: this is only supported + if you have WOLFSSL_TI_HASH defined. + + \return none No returns. + + \param sha3 Pointer to the sha3 structure to be freed. + + _Example_ + \code + wc_Sha3 sha3; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitSha3_512(&sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_512 failed"); + } + else { + wc_Sha3_512_Update(&sha3, data, len); + wc_Sha3_512_Final(&sha3, hash); + wc_Sha3_512_Free(&sha3); + } + \endcode + + \sa wc_InitSha3_512 + \sa wc_Sha3_512_Update + \sa wc_Sha3_512_Final +*/ +void wc_Sha3_512_Free(wc_Sha3*); + +/*! + \ingroup SHA + + \brief Gets hash data. Result is placed into hash. Does not + reset state of sha3 struct. + + \return 0 Returned upon successful copying of the hash. + + \param sha3 pointer to the sha3 structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Sha3 sha3[1]; + if ((ret = wc_InitSha3_512(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_512 failed"); + } + else { + wc_Sha3_512_Update(sha3, data, len); + wc_Sha3_512_GetHash(sha3, hash); + } + \endcode + + \sa wc_Sha3_512Hash + \sa wc_Sha3_512_Final + \sa wc_InitSha3_512 + \sa wc_Sha3_512_Copy +*/ +int wc_Sha3_512_GetHash(wc_Sha3* sha3, byte* hash); + +/*! + \ingroup SHA + + \brief Copy the state of the hash. + + \return 0 Returned upon successful copying. + + \param sha3 pointer to the sha3 structure to copy + \param dst pointer to the sha3 structure to copy into + + _Example_ + \code + wc_Sha3 sha3[1]; + wc_Sha3 sha3_dup[1]; + if ((ret = wc_InitSha3_512(sha3, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitSha3_512 failed"); + } + else { + wc_Sha3_512_Update(sha3, data, len); + wc_Sha3_512_Copy(sha3, sha3_dup); + } + \endcode + + \sa wc_Sha3_512Hash + \sa wc_Sha3_512_Final + \sa wc_InitSha3_512 + \sa wc_Sha3_512_GetHash +*/ +int wc_Sha3_512_Copy(wc_Sha3* sha3, wc_Sha3* dst); + +/*! + \ingroup SHA + + \brief This function initializes SHAKE-128. This is automatically + called by wc_Shake128Hash. + + \return 0 Returned upon successfully initializing + + \param shake pointer to the shake structure to use for encryption + + _Example_ + \code + wc_Shake shake[1]; + if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake128 failed"); + } + else { + wc_Shake128_Update(shake, data, len); + wc_Shake128_Final(shake, hash); + } + \endcode + + \sa wc_Shake128Hash + \sa wc_Shake128_Update + \sa wc_Shake128_Final +*/ +int wc_InitShake128(wc_Shake* shake, void* heap, int devId); + +/*! + \ingroup SHA + + \brief Can be called to continually hash the provided byte + array of length len. + + \return 0 Returned upon successfully adding the data to the digest. + + \param shake pointer to the shake structure to use for encryption + \param data the data to be hashed + \param len length of data to be hashed + + _Example_ + \code + wc_Shake shake[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake128 failed"); + } + else { + wc_Shake128_Update(shake, data, len); + wc_Shake128_Final(shake, hash); + } + \endcode + + \sa wc_Shake128Hash + \sa wc_Shake128_Final + \sa wc_InitShake128 +*/ +int wc_Shake128_Update(wc_Shake* sha, const byte* data, word32 len); + +/*! + \ingroup SHA + + \brief Finalizes hashing of data. Result is placed into hash. + Resets state of shake struct. + + \return 0 Returned upon successfully finalizing. + + \param shake pointer to the shake structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Shake shake[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake128 failed"); + } + else { + wc_Shake128_Update(shake, data, len); + wc_Shake128_Final(shake, hash); + } + \endcode + + \sa wc_Shake128Hash + \sa wc_Shake128_GetHash + \sa wc_InitShake128 +*/ +int wc_Shake128_Final(wc_Shake* shake, byte* hash); + +/*! + \ingroup SHA + + \brief Called to absorb the provided byte array of length len. Cannot + be called incrementally. + + \return 0 Returned upon successfully absorbed the data. + + \param shake pointer to the shake structure to use for encryption + \param data the data to be absorbed + \param len length of data to be absorbed + + _Example_ + \code + wc_Shake shake[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + byte out[2 * WC_SHA3_128_BLOCK_SIZE]; + int blocks = 2; + + if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake128 failed"); + } + else { + wc_Shake128_Absorb(shake, data, len); + wc_Shake128_SqueezeBlocks(shake, out, blocks); + } + \endcode + + \sa wc_Shake128_SqueezeBlocks + \sa wc_InitShake128 +*/ +int wc_Shake128_Absorb(wc_Shake* sha, const byte* data, word32 len); + +/*! + \ingroup SHA + + \brief Squeeze out more blocks of data. Result is placed into out. Can be + called inrementally. + + \return 0 Returned upon successfully squeezing. + + \param shake pointer to the shake structure to use for encryption + \param hash Byte array to hold output. + \param blocks Number of blocks to squeeze out. Each block is + WC_SHA3_128_BLOCK_SIZE bytes in length. + + _Example_ + \code + wc_Shake shake[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + byte out[2 * WC_SHA3_128_BLOCK_SIZE]; + int blocks = 2; + + if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake128 failed"); + } + else { + wc_Shake128_Absorb(shake, data, len); + wc_Shake128_SqueezeBlocks(shake, out, blocks); + } + \endcode + + \sa wc_Shake128_Absorb + \sa wc_InitShake128 +*/ +int wc_Shake128_SqueezeBlocks(wc_Shake* shake, byte* out, word32 blockCnt); + +/*! + \ingroup SHA + + \brief Resets the wc_Shake structure. Note: this is only supported + if you have WOLFSSL_TI_HASH defined. + + \return none No returns. + + \param shake Pointer to the shake structure to be freed. + + _Example_ + \code + wc_Shake shake; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitShake128(&shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake128 failed"); + } + else { + wc_Shake128_Update(&shake, data, len); + wc_Shake128_Final(&shake, hash); + wc_Shake128_Free(&shake); + } + \endcode + + \sa wc_InitShake128 + \sa wc_Shake128_Update + \sa wc_Shake128_Final +*/ +void wc_Shake128_Free(wc_Shake*); + +/*! + \ingroup SHA + + \brief Gets hash data. Result is placed into hash. Does not + reset state of shake struct. + + \return 0 Returned upon successful copying of the hash. + + \param shake pointer to the shake structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Shake shake[1]; + if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake128 failed"); + } + else { + wc_Shake128_Update(shake, data, len); + wc_Shake128_GetHash(shake, hash); + } + \endcode + + \sa wc_Shake128Hash + \sa wc_Shake128_Final + \sa wc_InitShake128 + \sa wc_Shake128_Copy +*/ +int wc_Shake128_GetHash(wc_Shake* shake, byte* hash); + +/*! + \ingroup SHA + + \brief Copy the state of the hash. + + \return 0 Returned upon successful copying. + + \param shake pointer to the shake structure to copy + \param dst pointer to the shake structure to copy into + + _Example_ + \code + wc_Shake shake[1]; + wc_Shake shake_dup[1]; + if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake128 failed"); + } + else { + wc_Shake128_Update(shake, data, len); + wc_Shake128_Copy(shake, shake_dup); + } + \endcode + + \sa wc_Shake128Hash + \sa wc_Shake128_Final + \sa wc_InitShake128 + \sa wc_Shake128_GetHash +*/ +int wc_Shake128_Copy(wc_Shake* shake, wc_Shake* dst); + +/*! + \ingroup SHA + + \brief This function initializes SHAKE-256. This is automatically + called by wc_Shake256Hash. + + \return 0 Returned upon successfully initializing + + \param shake pointer to the shake structure to use for encryption + + _Example_ + \code + wc_Shake shake[1]; + if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake256 failed"); + } + else { + wc_Shake256_Update(shake, data, len); + wc_Shake256_Final(shake, hash); + } + \endcode + + \sa wc_Shake256Hash + \sa wc_Shake256_Update + \sa wc_Shake256_Final +*/ +int wc_InitShake256(wc_Shake* shake, void* heap, int devId); + +/*! + \ingroup SHA + + \brief Can be called to continually hash the provided byte + array of length len. + + \return 0 Returned upon successfully adding the data to the digest. + + \param shake pointer to the shake structure to use for encryption + \param data the data to be hashed + \param len length of data to be hashed + + _Example_ + \code + wc_Shake shake[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake256 failed"); + } + else { + wc_Shake256_Update(shake, data, len); + wc_Shake256_Final(shake, hash); + } + \endcode + + \sa wc_Shake256Hash + \sa wc_Shake256_Final + \sa wc_InitShake256 +*/ +int wc_Shake256_Update(wc_Shake* sha, const byte* data, word32 len); + +/*! + \ingroup SHA + + \brief Finalizes hashing of data. Result is placed into hash. + Resets state of shake struct. + + \return 0 Returned upon successfully finalizing. + + \param shake pointer to the shake structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Shake shake[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake256 failed"); + } + else { + wc_Shake256_Update(shake, data, len); + wc_Shake256_Final(shake, hash); + } + \endcode + + \sa wc_Shake256Hash + \sa wc_Shake256_GetHash + \sa wc_InitShake256 +*/ +int wc_Shake256_Final(wc_Shake* shake, byte* hash); + +/*! + \ingroup SHA + + \brief Called to absorb the provided byte array of length len. Cannot + be called incrementally. + + \return 0 Returned upon successfully absorbed the data. + + \param shake pointer to the shake structure to use for encryption + \param data the data to be absorbed + \param len length of data to be absorbed + + _Example_ + \code + wc_Shake shake[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + byte out[2 * WC_SHA3_256_BLOCK_SIZE]; + int blocks = 2; + + if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake256 failed"); + } + else { + wc_Shake256_Absorb(shake, data, len); + wc_Shake256_SqueezeBlocks(shake, out, blocks); + } + \endcode + + \sa wc_Shake256_SqueezeBlocks + \sa wc_InitShake256 +*/ +int wc_Shake256_Absorb(wc_Shake* sha, const byte* data, word32 len); + +/*! + \ingroup SHA + + \brief Squeeze out more blocks of data. Result is placed into out. Can be + called incrementally. + + \return 0 Returned upon successfully squeezing. + + \param shake pointer to the shake structure to use for encryption + \param hash Byte array to hold output. + \param blocks Number of blocks to squeeze out. Each block is + WC_SHA3_256_BLOCK_SIZE bytes in length. + + _Example_ + \code + wc_Shake shake[1]; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + byte out[2 * WC_SHA3_256_BLOCK_SIZE]; + int blocks = 2; + + if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake256 failed"); + } + else { + wc_Shake256_Absorb(shake, data, len); + wc_Shake256_SqueezeBlocks(shake, out, blocks); + } + \endcode + + \sa wc_Shake256_Absorb + \sa wc_InitShake256 +*/ +int wc_Shake256_SqueezeBlocks(wc_Shake* shake, byte* out, word32 blockCnt); + +/*! + \ingroup SHA + + \brief Resets the wc_Shake structure. Note: this is only supported + if you have WOLFSSL_TI_HASH defined. + + \return none No returns. + + \param shake Pointer to the shake structure to be freed. + + _Example_ + \code + wc_Shake shake; + byte data[] = { Data to be hashed }; + word32 len = sizeof(data); + + if ((ret = wc_InitShake256(&shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake256 failed"); + } + else { + wc_Shake256_Update(&shake, data, len); + wc_Shake256_Final(&shake, hash); + wc_Shake256_Free(&shake); + } + \endcode + + \sa wc_InitShake256 + \sa wc_Shake256_Update + \sa wc_Shake256_Final +*/ +void wc_Shake256_Free(wc_Shake*); + +/*! + \ingroup SHA + + \brief Gets hash data. Result is placed into hash. Does not + reset state of shake struct. + + \return 0 Returned upon successful copying of the hash. + + \param shake pointer to the shake structure to use for encryption + \param hash Byte array to hold hash value. + + _Example_ + \code + wc_Shake shake[1]; + if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake256 failed"); + } + else { + wc_Shake256_Update(shake, data, len); + wc_Shake256_GetHash(shake, hash); + } + \endcode + + \sa wc_Shake256Hash + \sa wc_Shake256_Final + \sa wc_InitShake256 + \sa wc_Shake256_Copy +*/ +int wc_Shake256_GetHash(wc_Shake* shake, byte* hash); + +/*! + \ingroup SHA + + \brief Copy the state of the hash. + + \return 0 Returned upon successful copying. + + \param shake pointer to the shake structure to copy + \param dst pointer to the shake structure to copy into + + _Example_ + \code + wc_Shake shake[1]; + wc_Shake shake_dup[1]; + if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("wc_InitShake256 failed"); + } + else { + wc_Shake256_Update(shake, data, len); + wc_Shake256_Copy(shake, shake_dup); + } + \endcode + + \sa wc_Shake256Hash + \sa wc_Shake256_Final + \sa wc_InitShake256 + \sa wc_Shake256_GetHash +*/ +int wc_Shake256_Copy(wc_Shake* shake, wc_Shake* dst); + + diff --git a/src/include.am b/src/include.am index 40903938a..064d59ee7 100644 --- a/src/include.am +++ b/src/include.am @@ -134,6 +134,9 @@ endif if BUILD_SHA3 src_libwolfssl_la_SOURCES += wolfcrypt/src/sha3.c +if BUILD_INTELASM +src_libwolfssl_la_SOURCES += wolfcrypt/src/sha3_asm.S +endif endif if BUILD_DH @@ -234,6 +237,9 @@ else src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S endif endif +if BUILD_INTELASM +src_libwolfssl_la_SOURCES += wolfcrypt/src/sha3_asm.S +endif endif if BUILD_DH @@ -434,6 +440,9 @@ else src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S endif endif +if BUILD_INTELASM +src_libwolfssl_la_SOURCES += wolfcrypt/src/sha3_asm.S +endif endif endif !BUILD_FIPS_CURRENT diff --git a/wolfcrypt/src/aes_gcm_asm.S b/wolfcrypt/src/aes_gcm_asm.S index 8b9423810..3d9e5b562 100644 --- a/wolfcrypt/src/aes_gcm_asm.S +++ b/wolfcrypt/src/aes_gcm_asm.S @@ -19,6 +19,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +#ifdef WOLFSSL_USER_SETTINGS +#include "wolfssl/wolfcrypt/settings.h" +#endif + #ifndef HAVE_INTEL_AVX1 #define HAVE_INTEL_AVX1 #endif /* HAVE_INTEL_AVX1 */ diff --git a/wolfcrypt/src/chacha_asm.S b/wolfcrypt/src/chacha_asm.S index 8485f4565..d8d5ec07f 100644 --- a/wolfcrypt/src/chacha_asm.S +++ b/wolfcrypt/src/chacha_asm.S @@ -19,6 +19,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +#ifdef WOLFSSL_USER_SETTINGS +#include "wolfssl/wolfcrypt/settings.h" +#endif + #ifndef HAVE_INTEL_AVX1 #define HAVE_INTEL_AVX1 #endif /* HAVE_INTEL_AVX1 */ diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 818dacac8..ecf56128e 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -4864,8 +4864,10 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD* type) case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif default: @@ -5389,8 +5391,10 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD* type) case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif default: @@ -7248,8 +7252,10 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD* type) case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif default: @@ -7359,8 +7365,10 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD* type) case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif default: diff --git a/wolfcrypt/src/fe_x25519_asm.S b/wolfcrypt/src/fe_x25519_asm.S index b468f997f..fb25f2f5a 100644 --- a/wolfcrypt/src/fe_x25519_asm.S +++ b/wolfcrypt/src/fe_x25519_asm.S @@ -19,6 +19,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +#ifdef WOLFSSL_USER_SETTINGS +#include "wolfssl/wolfcrypt/settings.h" +#endif + #ifndef HAVE_INTEL_AVX1 #define HAVE_INTEL_AVX1 #endif /* HAVE_INTEL_AVX1 */ diff --git a/wolfcrypt/src/hash.c b/wolfcrypt/src/hash.c index 1a856c5ef..6a4687eda 100644 --- a/wolfcrypt/src/hash.c +++ b/wolfcrypt/src/hash.c @@ -212,16 +212,14 @@ int wc_HashGetOID(enum wc_HashType hash_type) oid = SHA3_512h; #endif break; - #ifndef WOLFSSL_NO_SHAKE256 + #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128) case WC_HASH_TYPE_SHAKE128: - #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128) oid = SHAKE128h; - #endif break; + #endif + #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256) case WC_HASH_TYPE_SHAKE256: - #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256) oid = SHAKE256h; - #endif break; #endif @@ -398,8 +396,10 @@ int wc_HashGetDigestSize(enum wc_HashType hash_type) break; /* Not Supported */ - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif case WC_HASH_TYPE_NONE: @@ -509,8 +509,10 @@ int wc_HashGetBlockSize(enum wc_HashType hash_type) break; /* Not Supported */ - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif case WC_HASH_TYPE_NONE: @@ -625,8 +627,10 @@ int wc_Hash(enum wc_HashType hash_type, const byte* data, case WC_HASH_TYPE_MD4: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif case WC_HASH_TYPE_NONE: @@ -721,8 +725,10 @@ int wc_HashInit_ex(wc_HashAlg* hash, enum wc_HashType type, void* heap, case WC_HASH_TYPE_MD4: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif case WC_HASH_TYPE_NONE: @@ -825,8 +831,10 @@ int wc_HashUpdate(wc_HashAlg* hash, enum wc_HashType type, const byte* data, case WC_HASH_TYPE_MD4: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif case WC_HASH_TYPE_NONE: @@ -920,8 +928,10 @@ int wc_HashFinal(wc_HashAlg* hash, enum wc_HashType type, byte* out) case WC_HASH_TYPE_MD4: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif case WC_HASH_TYPE_NONE: @@ -1027,8 +1037,10 @@ int wc_HashFree(wc_HashAlg* hash, enum wc_HashType type) case WC_HASH_TYPE_MD4: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif case WC_HASH_TYPE_NONE: @@ -1101,8 +1113,10 @@ int wc_HashSetFlags(wc_HashAlg* hash, enum wc_HashType type, word32 flags) case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: case WC_HASH_TYPE_NONE: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif default: @@ -1171,8 +1185,10 @@ int wc_HashGetFlags(wc_HashAlg* hash, enum wc_HashType type, word32* flags) case WC_HASH_TYPE_MD4: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif case WC_HASH_TYPE_NONE: @@ -1664,6 +1680,45 @@ int wc_HashGetFlags(wc_HashAlg* hash, enum wc_HashType type, word32* flags) } #endif /* !WOLFSSL_NOSHA3_512 */ +#ifdef WOLFSSL_SHAKE128 + int wc_Shake128Hash(const byte* data, word32 len, byte* hash, + word32 hashLen) + { + int ret = 0; + #ifdef WOLFSSL_SMALL_STACK + wc_Shake* shake; + #else + wc_Shake shake[1]; + #endif + + #ifdef WOLFSSL_SMALL_STACK + shake = (wc_Shake*)XMALLOC(sizeof(wc_Shake), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (shake == NULL) + return MEMORY_E; + #endif + + if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) { + WOLFSSL_MSG("InitShake128 failed"); + } + else { + if ((ret = wc_Shake128_Update(shake, data, len)) != 0) { + WOLFSSL_MSG("Shake128_Update failed"); + } + else if ((ret = wc_Shake128_Final(shake, hash, hashLen)) != 0) { + WOLFSSL_MSG("Shake128_Final failed"); + } + wc_Shake128_Free(shake); + } + + #ifdef WOLFSSL_SMALL_STACK + XFREE(shake, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + + return ret; + } +#endif /* WOLFSSL_SHAKE_128 */ + #ifdef WOLFSSL_SHAKE256 int wc_Shake256Hash(const byte* data, word32 len, byte* hash, word32 hashLen) diff --git a/wolfcrypt/src/poly1305_asm.S b/wolfcrypt/src/poly1305_asm.S index fcdfcca89..098fec83c 100644 --- a/wolfcrypt/src/poly1305_asm.S +++ b/wolfcrypt/src/poly1305_asm.S @@ -19,6 +19,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +#ifdef WOLFSSL_USER_SETTINGS +#include "wolfssl/wolfcrypt/settings.h" +#endif + #ifndef HAVE_INTEL_AVX1 #define HAVE_INTEL_AVX1 #endif /* HAVE_INTEL_AVX1 */ diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index 5c6425da3..8df81e361 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -1989,8 +1989,10 @@ int wc_hash2mgf(enum wc_HashType hType) case WC_HASH_TYPE_SHA3_512: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 case WC_HASH_TYPE_SHAKE128: + #endif + #ifndef WOLFSSL_NO_SHAKE256 case WC_HASH_TYPE_SHAKE256: #endif default: diff --git a/wolfcrypt/src/sha256_asm.S b/wolfcrypt/src/sha256_asm.S index a6c51d348..1ec7c3f9e 100644 --- a/wolfcrypt/src/sha256_asm.S +++ b/wolfcrypt/src/sha256_asm.S @@ -19,6 +19,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +#ifdef WOLFSSL_USER_SETTINGS +#include "wolfssl/wolfcrypt/settings.h" +#endif + #ifndef HAVE_INTEL_AVX1 #define HAVE_INTEL_AVX1 #endif /* HAVE_INTEL_AVX1 */ diff --git a/wolfcrypt/src/sha3.c b/wolfcrypt/src/sha3.c index ee3883ef4..c3b595135 100644 --- a/wolfcrypt/src/sha3.c +++ b/wolfcrypt/src/sha3.c @@ -52,6 +52,17 @@ #if !defined(WOLFSSL_ARMASM) || !defined(WOLFSSL_ARMASM_CRYPTO_SHA3) + +#ifdef USE_INTEL_SPEEDUP + #include + + word32 cpuid_flags; + int cpuid_flags_set = 0; + void (*sha3_block)(word64 *s) = NULL; + void (*sha3_block_n)(word64 *s, const byte* data, word32 n, + word64 c) = NULL; +#endif + #ifdef WOLFSSL_SHA3_SMALL /* Rotate a 64-bit value left. * @@ -217,7 +228,10 @@ while (0) * * s The state. */ -static void BlockSha3(word64 *s) +#ifndef USE_INTEL_SPEEDUP +static +#endif +void BlockSha3(word64 *s) { byte i, x, y; word64 t0, t1; @@ -505,7 +519,10 @@ while (0) * * s The state. */ -static void BlockSha3(word64 *s) +#ifndef USE_INTEL_SPEEDUP +static +#endif +void BlockSha3(word64 *s) { word64 n[25]; word64 b[5]; @@ -593,6 +610,23 @@ static int InitSha3(wc_Sha3* sha3) sha3->flags = 0; #endif +#ifdef USE_INTEL_SPEEDUP + if (!cpuid_flags_set) { + cpuid_flags = cpuid_get_flags(); + cpuid_flags_set = 1; + if (IS_INTEL_BMI2(cpuid_flags)) { + sha3_block = sha3_block_bmi2; + sha3_block_n = sha3_block_n_bmi2; + } + else if (IS_INTEL_AVX2(cpuid_flags)) { + sha3_block = sha3_block_avx2; + } + else { + sha3_block = BlockSha3; + } + } +#endif + return 0; } @@ -609,6 +643,7 @@ static int Sha3Update(wc_Sha3* sha3, const byte* data, word32 len, byte p) word32 i; byte l; byte *t; + word32 blocks; if (sha3->i > 0) { l = p * 8 - sha3->i; @@ -617,29 +652,48 @@ static int Sha3Update(wc_Sha3* sha3, const byte* data, word32 len, byte p) } t = &sha3->t[sha3->i]; - for (i = 0; i < l; i++) + for (i = 0; i < l; i++) { t[i] = data[i]; + } data += i; len -= i; sha3->i += (byte) i; if (sha3->i == p * 8) { - for (i = 0; i < p; i++) + for (i = 0; i < p; i++) { sha3->s[i] ^= Load64BitBigEndian(sha3->t + 8 * i); + } + #ifdef USE_INTEL_SPEEDUP + (*sha3_block)(sha3->s); + #else BlockSha3(sha3->s); + #endif sha3->i = 0; } } - while (len >= ((word32)(p * 8))) { - for (i = 0; i < p; i++) + blocks = len / (p * 8); + #ifdef USE_INTEL_SPEEDUP + if ((sha3_block_n != NULL) && (blocks > 0)) { + (*sha3_block_n)(sha3->s, data, blocks, p * 8); + len -= blocks * (p * 8); + data += blocks * (p * 8); + blocks = 0; + } + #endif + for (; blocks > 0; blocks--) { + for (i = 0; i < p; i++) { sha3->s[i] ^= Load64Unaligned(data + 8 * i); + } + #ifdef USE_INTEL_SPEEDUP + (*sha3_block)(sha3->s); + #else BlockSha3(sha3->s); + #endif len -= p * 8; data += p * 8; } - for (i = 0; i < len; i++) - sha3->t[i] = data[i]; - sha3->i += (byte) i; + XMEMCPY(sha3->t, data, len); + sha3->i += len; return 0; } @@ -660,17 +714,21 @@ static int Sha3Final(wc_Sha3* sha3, byte padChar, byte* hash, byte p, word32 l) sha3->t[rate - 1] = 0x00; #ifdef WOLFSSL_HASH_FLAGS - if (p == WC_SHA3_256_COUNT && sha3->flags & WC_HASH_SHA3_KECCAK256) + if ((p == WC_SHA3_256_COUNT) && (sha3->flags & WC_HASH_SHA3_KECCAK256)) padChar = 0x01; #endif sha3->t[sha3->i ] = padChar; sha3->t[rate - 1] |= 0x80; - for (i=sha3->i + 1; i < rate - 1; i++) - sha3->t[i] = 0; - for (i = 0; i < p; i++) + XMEMSET(sha3->t + sha3->i + 1, 0, rate - 1 - sha3->i - 1); + for (i = 0; i < p; i++) { sha3->s[i] ^= Load64BitBigEndian(sha3->t + 8 * i); + } for (j = 0; l - j >= rate; j += rate) { + #ifdef USE_INTEL_SPEEDUP + (*sha3_block)(sha3->s); + #else BlockSha3(sha3->s); + #endif #if defined(BIG_ENDIAN_ORDER) ByteReverseWords64((word64*)(hash + j), sha3->s, rate); #else @@ -678,7 +736,11 @@ static int Sha3Final(wc_Sha3* sha3, byte padChar, byte* hash, byte p, word32 l) #endif } if (j != l) { + #ifdef USE_INTEL_SPEEDUP + (*sha3_block)(sha3->s); + #else BlockSha3(sha3->s); + #endif #if defined(BIG_ENDIAN_ORDER) ByteReverseWords64(sha3->s, sha3->s, rate); #endif @@ -1168,6 +1230,135 @@ int wc_Sha3_GetFlags(wc_Sha3* sha3, word32* flags) } #endif +#ifdef WOLFSSL_SHAKE128 +/* Initialize the state for a Shake128 hash operation. + * + * shake wc_Shake object holding state. + * heap Heap reference for dynamic memory allocation. (Used in async ops.) + * devId Device identifier for asynchronous operation. + * returns 0 on success. + */ +int wc_InitShake128(wc_Shake* shake, void* heap, int devId) +{ + return wc_InitSha3(shake, heap, devId); +} + +/* Update the SHAKE128 hash state with message data. + * + * shake wc_Shake object holding state. + * data Message data to be hashed. + * len Length of the message data. + * returns 0 on success. + */ +int wc_Shake128_Update(wc_Shake* shake, const byte* data, word32 len) +{ + if (shake == NULL || (data == NULL && len > 0)) { + return BAD_FUNC_ARG; + } + + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + + return Sha3Update(shake, data, len, WC_SHA3_128_COUNT); +} + +/* Calculate the SHAKE128 hash based on all the message data seen. + * The state is initialized ready for a new message to hash. + * + * shake wc_Shake object holding state. + * hash Buffer to hold the hash result. Must be at least 64 bytes. + * returns 0 on success. + */ +int wc_Shake128_Final(wc_Shake* shake, byte* hash, word32 hashLen) +{ + int ret; + + if (shake == NULL || hash == NULL) { + return BAD_FUNC_ARG; + } + + ret = Sha3Final(shake, 0x1f, hash, WC_SHA3_128_COUNT, hashLen); + if (ret != 0) + return ret; + + return InitSha3(shake); /* reset state */ +} + +/* Absorb the data for squeezing. + * + * Update and final with data but no output and no reset + * + * shake wc_Shake object holding state. + * data Data to absorb. + * len Length of d to absorb in bytes. + * returns 0 on success. + */ +int wc_Shake128_Absorb(wc_Shake* shake, const byte* data, word32 len) +{ + int ret; + byte hash[1]; + + ret = Sha3Update(shake, data, len, WC_SHA3_128_COUNT); + if (ret == 0) { + ret = Sha3Final(shake, 0x1f, hash, WC_SHA3_128_COUNT, 0); + } + /* No partial data. */ + shake->i = 0; + + return ret; +} + +/* Squeeze the state to produce pseudo-random output. + * + * shake wc_Shake object holding state. + * out Output buffer. + * blockCnt Number of blocks to write. + * returns 0 on success. + */ +int wc_Shake128_SqueezeBlocks(wc_Shake* shake, byte* out, word32 blockCnt) +{ + for (; (blockCnt > 0); blockCnt--) { + #ifdef USE_INTEL_SPEEDUP + (*sha3_block)(shake->s); + #else + BlockSha3(shake->s); + #endif + #if defined(BIG_ENDIAN_ORDER) + ByteReverseWords64((word64*)out, shake->s, WC_SHA3_128_COUNT * 8); + #else + XMEMCPY(out, shake->s, WC_SHA3_128_COUNT * 8); + #endif + out += WC_SHA3_128_COUNT * 8; + } + + return 0; +} + +/* Dispose of any dynamically allocated data from the SHAKE128 operation. + * (Required for async ops.) + * + * shake wc_Shake object holding state. + * returns 0 on success. + */ +void wc_Shake128_Free(wc_Shake* shake) +{ + wc_Sha3Free(shake); +} + +/* Copy the state of the SHA3-512 operation. + * + * src wc_Shake object holding state top copy. + * dst wc_Shake object to copy into. + * returns 0 on success. + */ +int wc_Shake128_Copy(wc_Shake* src, wc_Shake* dst) +{ + return wc_Sha3Copy(src, dst); +} +#endif + #ifdef WOLFSSL_SHAKE256 /* Initialize the state for a Shake256 hash operation. * @@ -1224,6 +1415,56 @@ int wc_Shake256_Final(wc_Shake* shake, byte* hash, word32 hashLen) return InitSha3(shake); /* reset state */ } +/* Absorb the data for squeezing. + * + * Update and final with data but no output and no reset + * + * shake wc_Shake object holding state. + * data Data to absorb. + * len Length of d to absorb in bytes. + * returns 0 on success. + */ +int wc_Shake256_Absorb(wc_Shake* shake, const byte* data, word32 len) +{ + int ret; + byte hash[1]; + + ret = Sha3Update(shake, data, len, WC_SHA3_256_COUNT); + if (ret == 0) { + ret = Sha3Final(shake, 0x1f, hash, WC_SHA3_256_COUNT, 0); + } + /* No partial data. */ + shake->i = 0; + + return ret; +} + +/* Squeeze the state to produce pseudo-random output. + * + * shake wc_Shake object holding state. + * out Output buffer. + * blockCnt Number of blocks to write. + * returns 0 on success. + */ +int wc_Shake256_SqueezeBlocks(wc_Shake* shake, byte* out, word32 blockCnt) +{ + for (; (blockCnt > 0); blockCnt--) { + #ifdef USE_INTEL_SPEEDUP + (*sha3_block)(shake->s); + #else + BlockSha3(shake->s); + #endif + #if defined(BIG_ENDIAN_ORDER) + ByteReverseWords64((word64*)out, shake->s, WC_SHA3_256_COUNT * 8); + #else + XMEMCPY(out, shake->s, WC_SHA3_256_COUNT * 8); + #endif + out += WC_SHA3_256_COUNT * 8; + } + + return 0; +} + /* Dispose of any dynamically allocated data from the SHAKE256 operation. * (Required for async ops.) * diff --git a/wolfcrypt/src/sha3_asm.S b/wolfcrypt/src/sha3_asm.S new file mode 100644 index 000000000..c3f6d8d4b --- /dev/null +++ b/wolfcrypt/src/sha3_asm.S @@ -0,0 +1,14868 @@ +/* sha3_asm + * + * Copyright (C) 2006-2022 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef WOLFSSL_USER_SETTINGS +#include "wolfssl/wolfcrypt/settings.h" +#endif + +#ifndef HAVE_INTEL_AVX1 +#define HAVE_INTEL_AVX1 +#endif /* HAVE_INTEL_AVX1 */ +#ifndef NO_AVX2_SUPPORT +#define HAVE_INTEL_AVX2 +#endif /* NO_AVX2_SUPPORT */ + +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_sha3_avx2_r: +.quad 0x1,0x1 +.quad 0x1,0x1 +.quad 0x8082,0x8082 +.quad 0x8082,0x8082 +.quad 0x800000000000808a,0x800000000000808a +.quad 0x800000000000808a,0x800000000000808a +.quad 0x8000000080008000,0x8000000080008000 +.quad 0x8000000080008000,0x8000000080008000 +.quad 0x808b,0x808b +.quad 0x808b,0x808b +.quad 0x80000001,0x80000001 +.quad 0x80000001,0x80000001 +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000000008009,0x8000000000008009 +.quad 0x8000000000008009,0x8000000000008009 +.quad 0x8a,0x8a +.quad 0x8a,0x8a +.quad 0x88,0x88 +.quad 0x88,0x88 +.quad 0x80008009,0x80008009 +.quad 0x80008009,0x80008009 +.quad 0x8000000a,0x8000000a +.quad 0x8000000a,0x8000000a +.quad 0x8000808b,0x8000808b +.quad 0x8000808b,0x8000808b +.quad 0x800000000000008b,0x800000000000008b +.quad 0x800000000000008b,0x800000000000008b +.quad 0x8000000000008089,0x8000000000008089 +.quad 0x8000000000008089,0x8000000000008089 +.quad 0x8000000000008003,0x8000000000008003 +.quad 0x8000000000008003,0x8000000000008003 +.quad 0x8000000000008002,0x8000000000008002 +.quad 0x8000000000008002,0x8000000000008002 +.quad 0x8000000000000080,0x8000000000000080 +.quad 0x8000000000000080,0x8000000000000080 +.quad 0x800a,0x800a +.quad 0x800a,0x800a +.quad 0x800000008000000a,0x800000008000000a +.quad 0x800000008000000a,0x800000008000000a +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000000008080,0x8000000000008080 +.quad 0x8000000000008080,0x8000000000008080 +.quad 0x80000001,0x80000001 +.quad 0x80000001,0x80000001 +.quad 0x8000000080008008,0x8000000080008008 +.quad 0x8000000080008008,0x8000000080008008 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_sha3_x4_avx2_r: +.quad 0x1,0x1 +.quad 0x1,0x1 +.quad 0x8082,0x8082 +.quad 0x8082,0x8082 +.quad 0x800000000000808a,0x800000000000808a +.quad 0x800000000000808a,0x800000000000808a +.quad 0x8000000080008000,0x8000000080008000 +.quad 0x8000000080008000,0x8000000080008000 +.quad 0x808b,0x808b +.quad 0x808b,0x808b +.quad 0x80000001,0x80000001 +.quad 0x80000001,0x80000001 +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000000008009,0x8000000000008009 +.quad 0x8000000000008009,0x8000000000008009 +.quad 0x8a,0x8a +.quad 0x8a,0x8a +.quad 0x88,0x88 +.quad 0x88,0x88 +.quad 0x80008009,0x80008009 +.quad 0x80008009,0x80008009 +.quad 0x8000000a,0x8000000a +.quad 0x8000000a,0x8000000a +.quad 0x8000808b,0x8000808b +.quad 0x8000808b,0x8000808b +.quad 0x800000000000008b,0x800000000000008b +.quad 0x800000000000008b,0x800000000000008b +.quad 0x8000000000008089,0x8000000000008089 +.quad 0x8000000000008089,0x8000000000008089 +.quad 0x8000000000008003,0x8000000000008003 +.quad 0x8000000000008003,0x8000000000008003 +.quad 0x8000000000008002,0x8000000000008002 +.quad 0x8000000000008002,0x8000000000008002 +.quad 0x8000000000000080,0x8000000000000080 +.quad 0x8000000000000080,0x8000000000000080 +.quad 0x800a,0x800a +.quad 0x800a,0x800a +.quad 0x800000008000000a,0x800000008000000a +.quad 0x800000008000000a,0x800000008000000a +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000000008080,0x8000000000008080 +.quad 0x8000000000008080,0x8000000000008080 +.quad 0x80000001,0x80000001 +.quad 0x80000001,0x80000001 +.quad 0x8000000080008008,0x8000000080008008 +.quad 0x8000000080008008,0x8000000080008008 +#ifdef HAVE_INTEL_AVX2 +#ifndef __APPLE__ +.text +.globl sha3_block_bmi2 +.type sha3_block_bmi2,@function +.align 16 +sha3_block_bmi2: +#else +.section __TEXT,__text +.globl _sha3_block_bmi2 +.p2align 4 +_sha3_block_bmi2: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + movq (%rdi), %rsi + addq $0x60, %rdi + # Round 0 + movq %rsi, %r10 + movq -88(%rdi), %r11 + movq -80(%rdi), %r12 + movq -72(%rdi), %r13 + movq -64(%rdi), %r14 + xorq -56(%rdi), %r10 + xorq -48(%rdi), %r11 + xorq -40(%rdi), %r12 + xorq -32(%rdi), %r13 + xorq -24(%rdi), %r14 + xorq -16(%rdi), %r10 + xorq -8(%rdi), %r11 + xorq (%rdi), %r12 + xorq 8(%rdi), %r13 + xorq 16(%rdi), %r14 + xorq 24(%rdi), %r10 + xorq 32(%rdi), %r11 + xorq 40(%rdi), %r12 + xorq 48(%rdi), %r13 + xorq 56(%rdi), %r14 + xorq 64(%rdi), %r10 + xorq 72(%rdi), %r11 + xorq 80(%rdi), %r12 + xorq 88(%rdi), %r13 + xorq 96(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -48(%rdi), %r11 + movq (%rdi), %r12 + movq 48(%rdi), %r13 + movq 96(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -48(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, (%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 48(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 96(%rdi) + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq $0x01, %rsi + # Row 1 + movq -72(%rdi), %r10 + movq -24(%rdi), %r11 + movq -16(%rdi), %r12 + movq 32(%rdi), %r13 + movq 80(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -24(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -16(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 32(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 80(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -72(%rdi) + # Row 2 + movq -88(%rdi), %r10 + movq -40(%rdi), %r11 + movq 8(%rdi), %r12 + movq 56(%rdi), %r13 + movq 64(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -40(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 8(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 56(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 64(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -88(%rdi) + # Row 3 + movq -64(%rdi), %r10 + movq -56(%rdi), %r11 + movq -8(%rdi), %r12 + movq 40(%rdi), %r13 + movq 88(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -56(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -8(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 40(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 88(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -64(%rdi) + # Row 4 + xorq -80(%rdi), %rcx + xorq -32(%rdi), %r8 + xorq 16(%rdi), %r9 + xorq 24(%rdi), %rdx + xorq 72(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -80(%rdi) + movq %r11, -32(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, 72(%rdi) + # Round 1 + xorq %rsi, %r10 + xorq -88(%rdi), %r10 + xorq -72(%rdi), %r10 + xorq -64(%rdi), %r10 + xorq -56(%rdi), %r11 + xorq -48(%rdi), %r11 + xorq -40(%rdi), %r11 + xorq -24(%rdi), %r11 + xorq -16(%rdi), %r12 + xorq -8(%rdi), %r12 + xorq (%rdi), %r12 + xorq 8(%rdi), %r12 + xorq 32(%rdi), %r13 + xorq 40(%rdi), %r13 + xorq 48(%rdi), %r13 + xorq 56(%rdi), %r13 + xorq 64(%rdi), %r14 + xorq 80(%rdi), %r14 + xorq 88(%rdi), %r14 + xorq 96(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -24(%rdi), %r11 + movq 8(%rdi), %r12 + movq 40(%rdi), %r13 + movq 72(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -24(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 8(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 40(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 72(%rdi) + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq $0x8082, %rsi + # Row 1 + movq 48(%rdi), %r10 + movq 80(%rdi), %r11 + movq -88(%rdi), %r12 + movq -56(%rdi), %r13 + movq 16(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 80(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -88(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -56(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 16(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 48(%rdi) + # Row 2 + movq -48(%rdi), %r10 + movq -16(%rdi), %r11 + movq 56(%rdi), %r12 + movq 88(%rdi), %r13 + movq -80(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -16(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 56(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 88(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -80(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -48(%rdi) + # Row 3 + movq 96(%rdi), %r10 + movq -72(%rdi), %r11 + movq -40(%rdi), %r12 + movq -8(%rdi), %r13 + movq 24(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -72(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -40(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -8(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 24(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 96(%rdi) + # Row 4 + xorq (%rdi), %rcx + xorq 32(%rdi), %r8 + xorq 64(%rdi), %r9 + xorq -64(%rdi), %rdx + xorq -32(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, (%rdi) + movq %r11, 32(%rdi) + movq %r12, 64(%rdi) + movq %r13, -64(%rdi) + movq %r14, -32(%rdi) + # Round 2 + xorq %rsi, %r10 + xorq -88(%rdi), %r12 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r11 + xorq -56(%rdi), %r13 + xorq -48(%rdi), %r10 + xorq -40(%rdi), %r12 + xorq -24(%rdi), %r11 + xorq -16(%rdi), %r11 + xorq -8(%rdi), %r13 + xorq 8(%rdi), %r12 + xorq 16(%rdi), %r14 + xorq 24(%rdi), %r14 + xorq 40(%rdi), %r13 + xorq 48(%rdi), %r10 + xorq 56(%rdi), %r12 + xorq 72(%rdi), %r14 + xorq 80(%rdi), %r11 + xorq 88(%rdi), %r13 + xorq 96(%rdi), %r10 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 80(%rdi), %r11 + movq 56(%rdi), %r12 + movq -8(%rdi), %r13 + movq -32(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 80(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 56(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -8(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -32(%rdi) + movq $0x800000000000808a, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 40(%rdi), %r10 + movq 16(%rdi), %r11 + movq -48(%rdi), %r12 + movq -72(%rdi), %r13 + movq 64(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 16(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -48(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -72(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 64(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 40(%rdi) + # Row 2 + movq -24(%rdi), %r10 + movq -88(%rdi), %r11 + movq 88(%rdi), %r12 + movq 24(%rdi), %r13 + movq (%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -88(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 88(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 24(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, (%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -24(%rdi) + # Row 3 + movq 72(%rdi), %r10 + movq 48(%rdi), %r11 + movq -16(%rdi), %r12 + movq -40(%rdi), %r13 + movq -64(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 48(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -16(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -40(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -64(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 72(%rdi) + # Row 4 + xorq 8(%rdi), %rcx + xorq -56(%rdi), %r8 + xorq -80(%rdi), %r9 + xorq 96(%rdi), %rdx + xorq 32(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 8(%rdi) + movq %r11, -56(%rdi) + movq %r12, -80(%rdi) + movq %r13, 96(%rdi) + movq %r14, 32(%rdi) + # Round 3 + xorq %rsi, %r10 + xorq -88(%rdi), %r11 + xorq -72(%rdi), %r13 + xorq -64(%rdi), %r14 + xorq -48(%rdi), %r12 + xorq -40(%rdi), %r13 + xorq -32(%rdi), %r14 + xorq -24(%rdi), %r10 + xorq -16(%rdi), %r12 + xorq -8(%rdi), %r13 + xorq (%rdi), %r14 + xorq 16(%rdi), %r11 + xorq 24(%rdi), %r13 + xorq 40(%rdi), %r10 + xorq 48(%rdi), %r11 + xorq 56(%rdi), %r12 + xorq 64(%rdi), %r14 + xorq 72(%rdi), %r10 + xorq 80(%rdi), %r11 + xorq 88(%rdi), %r12 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 16(%rdi), %r11 + movq 88(%rdi), %r12 + movq -40(%rdi), %r13 + movq 32(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 16(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 88(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -40(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 32(%rdi) + movq $0x8000000080008000, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq -8(%rdi), %r10 + movq 64(%rdi), %r11 + movq -24(%rdi), %r12 + movq 48(%rdi), %r13 + movq -80(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 64(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -24(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 48(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -80(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -8(%rdi) + # Row 2 + movq 80(%rdi), %r10 + movq -48(%rdi), %r11 + movq 24(%rdi), %r12 + movq -64(%rdi), %r13 + movq 8(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -48(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 24(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -64(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 8(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 80(%rdi) + # Row 3 + movq -32(%rdi), %r10 + movq 40(%rdi), %r11 + movq -88(%rdi), %r12 + movq -16(%rdi), %r13 + movq 96(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 40(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -88(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -16(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 96(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -32(%rdi) + # Row 4 + xorq 56(%rdi), %rcx + xorq -72(%rdi), %r8 + xorq (%rdi), %r9 + xorq 72(%rdi), %rdx + xorq -56(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 56(%rdi) + movq %r11, -72(%rdi) + movq %r12, (%rdi) + movq %r13, 72(%rdi) + movq %r14, -56(%rdi) + # Round 4 + xorq %rsi, %r10 + xorq -88(%rdi), %r12 + xorq -80(%rdi), %r14 + xorq -64(%rdi), %r13 + xorq -48(%rdi), %r11 + xorq -40(%rdi), %r13 + xorq -32(%rdi), %r10 + xorq -24(%rdi), %r12 + xorq -16(%rdi), %r13 + xorq -8(%rdi), %r10 + xorq 8(%rdi), %r14 + xorq 16(%rdi), %r11 + xorq 24(%rdi), %r12 + xorq 32(%rdi), %r14 + xorq 40(%rdi), %r11 + xorq 48(%rdi), %r13 + xorq 64(%rdi), %r11 + xorq 80(%rdi), %r10 + xorq 88(%rdi), %r12 + xorq 96(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 64(%rdi), %r11 + movq 24(%rdi), %r12 + movq -16(%rdi), %r13 + movq -56(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 64(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 24(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -16(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -56(%rdi) + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq $0x808b, %rsi + # Row 1 + movq -40(%rdi), %r10 + movq -80(%rdi), %r11 + movq 80(%rdi), %r12 + movq 40(%rdi), %r13 + movq (%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -80(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 80(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 40(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, (%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -40(%rdi) + # Row 2 + movq 16(%rdi), %r10 + movq -24(%rdi), %r11 + movq -64(%rdi), %r12 + movq 96(%rdi), %r13 + movq 56(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -24(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -64(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 96(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 56(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 16(%rdi) + # Row 3 + movq 32(%rdi), %r10 + movq -8(%rdi), %r11 + movq -48(%rdi), %r12 + movq -88(%rdi), %r13 + movq 72(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -8(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -48(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -88(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 72(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 32(%rdi) + # Row 4 + xorq 88(%rdi), %rcx + xorq 48(%rdi), %r8 + xorq 8(%rdi), %r9 + xorq -32(%rdi), %rdx + xorq -72(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 88(%rdi) + movq %r11, 48(%rdi) + movq %r12, 8(%rdi) + movq %r13, -32(%rdi) + movq %r14, -72(%rdi) + # Round 5 + xorq %rsi, %r10 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r11 + xorq -64(%rdi), %r12 + xorq -56(%rdi), %r14 + xorq -48(%rdi), %r12 + xorq -40(%rdi), %r10 + xorq -24(%rdi), %r11 + xorq -16(%rdi), %r13 + xorq -8(%rdi), %r11 + xorq (%rdi), %r14 + xorq 16(%rdi), %r10 + xorq 24(%rdi), %r12 + xorq 32(%rdi), %r10 + xorq 40(%rdi), %r13 + xorq 56(%rdi), %r14 + xorq 64(%rdi), %r11 + xorq 72(%rdi), %r14 + xorq 80(%rdi), %r12 + xorq 96(%rdi), %r13 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -80(%rdi), %r11 + movq -64(%rdi), %r12 + movq -88(%rdi), %r13 + movq -72(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -80(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -64(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -88(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -72(%rdi) + movq $0x80000001, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq -16(%rdi), %r10 + movq (%rdi), %r11 + movq 16(%rdi), %r12 + movq -8(%rdi), %r13 + movq 8(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, (%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 16(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -8(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 8(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -16(%rdi) + # Row 2 + movq 64(%rdi), %r10 + movq 80(%rdi), %r11 + movq 96(%rdi), %r12 + movq 72(%rdi), %r13 + movq 88(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 80(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 96(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 72(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 88(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 64(%rdi) + # Row 3 + movq -56(%rdi), %r10 + movq -40(%rdi), %r11 + movq -24(%rdi), %r12 + movq -48(%rdi), %r13 + movq -32(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -40(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -24(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -48(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -32(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -56(%rdi) + # Row 4 + xorq 24(%rdi), %rcx + xorq 40(%rdi), %r8 + xorq 56(%rdi), %r9 + xorq 32(%rdi), %rdx + xorq 48(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 24(%rdi) + movq %r11, 40(%rdi) + movq %r12, 56(%rdi) + movq %r13, 32(%rdi) + movq %r14, 48(%rdi) + # Round 6 + xorq %rsi, %r10 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r11 + xorq -72(%rdi), %r14 + xorq -64(%rdi), %r12 + xorq -56(%rdi), %r10 + xorq -48(%rdi), %r13 + xorq -40(%rdi), %r11 + xorq -32(%rdi), %r14 + xorq -24(%rdi), %r12 + xorq -16(%rdi), %r10 + xorq -8(%rdi), %r13 + xorq (%rdi), %r11 + xorq 8(%rdi), %r14 + xorq 16(%rdi), %r12 + xorq 64(%rdi), %r10 + xorq 72(%rdi), %r13 + xorq 80(%rdi), %r11 + xorq 88(%rdi), %r14 + xorq 96(%rdi), %r12 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq (%rdi), %r11 + movq 96(%rdi), %r12 + movq -48(%rdi), %r13 + movq 48(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, (%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 96(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -48(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 48(%rdi) + movq $0x8000000080008081, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq -88(%rdi), %r10 + movq 8(%rdi), %r11 + movq 64(%rdi), %r12 + movq -40(%rdi), %r13 + movq 56(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 8(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 64(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -40(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 56(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -88(%rdi) + # Row 2 + movq -80(%rdi), %r10 + movq 16(%rdi), %r11 + movq 72(%rdi), %r12 + movq -32(%rdi), %r13 + movq 24(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 16(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 72(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -32(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 24(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -80(%rdi) + # Row 3 + movq -72(%rdi), %r10 + movq -16(%rdi), %r11 + movq 80(%rdi), %r12 + movq -24(%rdi), %r13 + movq 32(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -16(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 80(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -24(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 32(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -72(%rdi) + # Row 4 + xorq -64(%rdi), %rcx + xorq -8(%rdi), %r8 + xorq 88(%rdi), %r9 + xorq -56(%rdi), %rdx + xorq 40(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -64(%rdi) + movq %r11, -8(%rdi) + movq %r12, 88(%rdi) + movq %r13, -56(%rdi) + movq %r14, 40(%rdi) + # Round 7 + xorq %rsi, %r10 + xorq -88(%rdi), %r10 + xorq -80(%rdi), %r10 + xorq -72(%rdi), %r10 + xorq -48(%rdi), %r13 + xorq -40(%rdi), %r13 + xorq -32(%rdi), %r13 + xorq -24(%rdi), %r13 + xorq -16(%rdi), %r11 + xorq (%rdi), %r11 + xorq 8(%rdi), %r11 + xorq 16(%rdi), %r11 + xorq 24(%rdi), %r14 + xorq 32(%rdi), %r14 + xorq 48(%rdi), %r14 + xorq 56(%rdi), %r14 + xorq 64(%rdi), %r12 + xorq 72(%rdi), %r12 + xorq 80(%rdi), %r12 + xorq 96(%rdi), %r12 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 8(%rdi), %r11 + movq 72(%rdi), %r12 + movq -24(%rdi), %r13 + movq 40(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 8(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 72(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -24(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 40(%rdi) + movq $0x8000000000008009, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq -48(%rdi), %r10 + movq 56(%rdi), %r11 + movq -80(%rdi), %r12 + movq -16(%rdi), %r13 + movq 88(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 56(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -80(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -16(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 88(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -48(%rdi) + # Row 2 + movq (%rdi), %r10 + movq 64(%rdi), %r11 + movq -32(%rdi), %r12 + movq 32(%rdi), %r13 + movq -64(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 64(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -32(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 32(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -64(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, (%rdi) + # Row 3 + movq 48(%rdi), %r10 + movq -88(%rdi), %r11 + movq 16(%rdi), %r12 + movq 80(%rdi), %r13 + movq -56(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -88(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 16(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 80(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -56(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 48(%rdi) + # Row 4 + xorq 96(%rdi), %rcx + xorq -40(%rdi), %r8 + xorq 24(%rdi), %r9 + xorq -72(%rdi), %rdx + xorq -8(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 96(%rdi) + movq %r11, -40(%rdi) + movq %r12, 24(%rdi) + movq %r13, -72(%rdi) + movq %r14, -8(%rdi) + # Round 8 + xorq %rsi, %r10 + xorq -88(%rdi), %r11 + xorq -80(%rdi), %r12 + xorq -64(%rdi), %r14 + xorq -56(%rdi), %r14 + xorq -48(%rdi), %r10 + xorq -32(%rdi), %r12 + xorq -24(%rdi), %r13 + xorq -16(%rdi), %r13 + xorq (%rdi), %r10 + xorq 8(%rdi), %r11 + xorq 16(%rdi), %r12 + xorq 32(%rdi), %r13 + xorq 40(%rdi), %r14 + xorq 48(%rdi), %r10 + xorq 56(%rdi), %r11 + xorq 64(%rdi), %r11 + xorq 72(%rdi), %r12 + xorq 80(%rdi), %r13 + xorq 88(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 56(%rdi), %r11 + movq -32(%rdi), %r12 + movq 80(%rdi), %r13 + movq -8(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 56(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -32(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 80(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -8(%rdi) + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq $0x8a, %rsi + # Row 1 + movq -24(%rdi), %r10 + movq 88(%rdi), %r11 + movq (%rdi), %r12 + movq -88(%rdi), %r13 + movq 24(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 88(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, (%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -88(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 24(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -24(%rdi) + # Row 2 + movq 8(%rdi), %r10 + movq -80(%rdi), %r11 + movq 32(%rdi), %r12 + movq -56(%rdi), %r13 + movq 96(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -80(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 32(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -56(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 96(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 8(%rdi) + # Row 3 + movq 40(%rdi), %r10 + movq -48(%rdi), %r11 + movq 64(%rdi), %r12 + movq 16(%rdi), %r13 + movq -72(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -48(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 64(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 16(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -72(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 40(%rdi) + # Row 4 + xorq 72(%rdi), %rcx + xorq -16(%rdi), %r8 + xorq -64(%rdi), %r9 + xorq 48(%rdi), %rdx + xorq -40(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 72(%rdi) + movq %r11, -16(%rdi) + movq %r12, -64(%rdi) + movq %r13, 48(%rdi) + movq %r14, -40(%rdi) + # Round 9 + xorq %rsi, %r10 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r11 + xorq -72(%rdi), %r14 + xorq -56(%rdi), %r13 + xorq -48(%rdi), %r11 + xorq -32(%rdi), %r12 + xorq -24(%rdi), %r10 + xorq -8(%rdi), %r14 + xorq (%rdi), %r12 + xorq 8(%rdi), %r10 + xorq 16(%rdi), %r13 + xorq 24(%rdi), %r14 + xorq 32(%rdi), %r12 + xorq 40(%rdi), %r10 + xorq 56(%rdi), %r11 + xorq 64(%rdi), %r12 + xorq 80(%rdi), %r13 + xorq 88(%rdi), %r11 + xorq 96(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 88(%rdi), %r11 + movq 32(%rdi), %r12 + movq 16(%rdi), %r13 + movq -40(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 88(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 32(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 16(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -40(%rdi) + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq $0x88, %rsi + # Row 1 + movq 80(%rdi), %r10 + movq 24(%rdi), %r11 + movq 8(%rdi), %r12 + movq -48(%rdi), %r13 + movq -64(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 24(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 8(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -48(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -64(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 80(%rdi) + # Row 2 + movq 56(%rdi), %r10 + movq (%rdi), %r11 + movq -56(%rdi), %r12 + movq -72(%rdi), %r13 + movq 72(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, (%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -56(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -72(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 72(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 56(%rdi) + # Row 3 + movq -8(%rdi), %r10 + movq -24(%rdi), %r11 + movq -80(%rdi), %r12 + movq 64(%rdi), %r13 + movq 48(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -24(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -80(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 64(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 48(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -8(%rdi) + # Row 4 + xorq -32(%rdi), %rcx + xorq -88(%rdi), %r8 + xorq 96(%rdi), %r9 + xorq 40(%rdi), %rdx + xorq -16(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -32(%rdi) + movq %r11, -88(%rdi) + movq %r12, 96(%rdi) + movq %r13, 40(%rdi) + movq %r14, -16(%rdi) + # Round 10 + xorq %rsi, %r10 + xorq -80(%rdi), %r12 + xorq -72(%rdi), %r13 + xorq -64(%rdi), %r14 + xorq -56(%rdi), %r12 + xorq -48(%rdi), %r13 + xorq -40(%rdi), %r14 + xorq -24(%rdi), %r11 + xorq -8(%rdi), %r10 + xorq (%rdi), %r11 + xorq 8(%rdi), %r12 + xorq 16(%rdi), %r13 + xorq 24(%rdi), %r11 + xorq 32(%rdi), %r12 + xorq 48(%rdi), %r14 + xorq 56(%rdi), %r10 + xorq 64(%rdi), %r13 + xorq 72(%rdi), %r14 + xorq 80(%rdi), %r10 + xorq 88(%rdi), %r11 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 24(%rdi), %r11 + movq -56(%rdi), %r12 + movq 64(%rdi), %r13 + movq -16(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 24(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -56(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 64(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -16(%rdi) + movq $0x80008009, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 16(%rdi), %r10 + movq -64(%rdi), %r11 + movq 56(%rdi), %r12 + movq -24(%rdi), %r13 + movq 96(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -64(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 56(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -24(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 96(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 16(%rdi) + # Row 2 + movq 88(%rdi), %r10 + movq 8(%rdi), %r11 + movq -72(%rdi), %r12 + movq 48(%rdi), %r13 + movq -32(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 8(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -72(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 48(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -32(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 88(%rdi) + # Row 3 + movq -40(%rdi), %r10 + movq 80(%rdi), %r11 + movq (%rdi), %r12 + movq -80(%rdi), %r13 + movq 40(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 80(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, (%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -80(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 40(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -40(%rdi) + # Row 4 + xorq 32(%rdi), %rcx + xorq -48(%rdi), %r8 + xorq 72(%rdi), %r9 + xorq -8(%rdi), %rdx + xorq -88(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 32(%rdi) + movq %r11, -48(%rdi) + movq %r12, 72(%rdi) + movq %r13, -8(%rdi) + movq %r14, -88(%rdi) + # Round 11 + xorq %rsi, %r10 + xorq -80(%rdi), %r13 + xorq -72(%rdi), %r12 + xorq -64(%rdi), %r11 + xorq -56(%rdi), %r12 + xorq -40(%rdi), %r10 + xorq -32(%rdi), %r14 + xorq -24(%rdi), %r13 + xorq -16(%rdi), %r14 + xorq (%rdi), %r12 + xorq 8(%rdi), %r11 + xorq 16(%rdi), %r10 + xorq 24(%rdi), %r11 + xorq 40(%rdi), %r14 + xorq 48(%rdi), %r13 + xorq 56(%rdi), %r12 + xorq 64(%rdi), %r13 + xorq 80(%rdi), %r11 + xorq 88(%rdi), %r10 + xorq 96(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -64(%rdi), %r11 + movq -72(%rdi), %r12 + movq -80(%rdi), %r13 + movq -88(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -64(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -72(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -80(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -88(%rdi) + movq $0x8000000a, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 64(%rdi), %r10 + movq 96(%rdi), %r11 + movq 88(%rdi), %r12 + movq 80(%rdi), %r13 + movq 72(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 96(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 88(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 80(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 72(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 64(%rdi) + # Row 2 + movq 24(%rdi), %r10 + movq 56(%rdi), %r11 + movq 48(%rdi), %r12 + movq 40(%rdi), %r13 + movq 32(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 56(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 48(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 40(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 32(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 24(%rdi) + # Row 3 + movq -16(%rdi), %r10 + movq 16(%rdi), %r11 + movq 8(%rdi), %r12 + movq (%rdi), %r13 + movq -8(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 16(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 8(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, (%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -8(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -16(%rdi) + # Row 4 + xorq -56(%rdi), %rcx + xorq -24(%rdi), %r8 + xorq -32(%rdi), %r9 + xorq -40(%rdi), %rdx + xorq -48(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -56(%rdi) + movq %r11, -24(%rdi) + movq %r12, -32(%rdi) + movq %r13, -40(%rdi) + movq %r14, -48(%rdi) + # Round 12 + xorq %rsi, %r10 + xorq -88(%rdi), %r14 + xorq -80(%rdi), %r13 + xorq -72(%rdi), %r12 + xorq -64(%rdi), %r11 + xorq -16(%rdi), %r10 + xorq -8(%rdi), %r14 + xorq (%rdi), %r13 + xorq 8(%rdi), %r12 + xorq 16(%rdi), %r11 + xorq 24(%rdi), %r10 + xorq 32(%rdi), %r14 + xorq 40(%rdi), %r13 + xorq 48(%rdi), %r12 + xorq 56(%rdi), %r11 + xorq 64(%rdi), %r10 + xorq 72(%rdi), %r14 + xorq 80(%rdi), %r13 + xorq 88(%rdi), %r12 + xorq 96(%rdi), %r11 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 96(%rdi), %r11 + movq 48(%rdi), %r12 + movq (%rdi), %r13 + movq -48(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 96(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 48(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, (%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -48(%rdi) + movq $0x8000808b, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq -80(%rdi), %r10 + movq 72(%rdi), %r11 + movq 24(%rdi), %r12 + movq 16(%rdi), %r13 + movq -32(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 72(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 24(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 16(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -32(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -80(%rdi) + # Row 2 + movq -64(%rdi), %r10 + movq 88(%rdi), %r11 + movq 40(%rdi), %r12 + movq -8(%rdi), %r13 + movq -56(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 88(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 40(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -8(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -56(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -64(%rdi) + # Row 3 + movq -88(%rdi), %r10 + movq 64(%rdi), %r11 + movq 56(%rdi), %r12 + movq 8(%rdi), %r13 + movq -40(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 64(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 56(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 8(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -40(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -88(%rdi) + # Row 4 + xorq -72(%rdi), %rcx + xorq 80(%rdi), %r8 + xorq 32(%rdi), %r9 + xorq -16(%rdi), %rdx + xorq -24(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -72(%rdi) + movq %r11, 80(%rdi) + movq %r12, 32(%rdi) + movq %r13, -16(%rdi) + movq %r14, -24(%rdi) + # Round 13 + xorq %rsi, %r10 + xorq -88(%rdi), %r10 + xorq -80(%rdi), %r10 + xorq -64(%rdi), %r10 + xorq -56(%rdi), %r14 + xorq -48(%rdi), %r14 + xorq -40(%rdi), %r14 + xorq -32(%rdi), %r14 + xorq -8(%rdi), %r13 + xorq (%rdi), %r13 + xorq 8(%rdi), %r13 + xorq 16(%rdi), %r13 + xorq 24(%rdi), %r12 + xorq 40(%rdi), %r12 + xorq 48(%rdi), %r12 + xorq 56(%rdi), %r12 + xorq 64(%rdi), %r11 + xorq 72(%rdi), %r11 + xorq 88(%rdi), %r11 + xorq 96(%rdi), %r11 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 72(%rdi), %r11 + movq 40(%rdi), %r12 + movq 8(%rdi), %r13 + movq -24(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 72(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 40(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 8(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -24(%rdi) + movq $0x800000000000008b, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq (%rdi), %r10 + movq -32(%rdi), %r11 + movq -64(%rdi), %r12 + movq 64(%rdi), %r13 + movq 32(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -32(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -64(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 64(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 32(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, (%rdi) + # Row 2 + movq 96(%rdi), %r10 + movq 24(%rdi), %r11 + movq -8(%rdi), %r12 + movq -40(%rdi), %r13 + movq -72(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 24(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -8(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -40(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -72(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 96(%rdi) + # Row 3 + movq -48(%rdi), %r10 + movq -80(%rdi), %r11 + movq 88(%rdi), %r12 + movq 56(%rdi), %r13 + movq -16(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -80(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 88(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 56(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -16(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -48(%rdi) + # Row 4 + xorq 48(%rdi), %rcx + xorq 16(%rdi), %r8 + xorq -56(%rdi), %r9 + xorq -88(%rdi), %rdx + xorq 80(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 48(%rdi) + movq %r11, 16(%rdi) + movq %r12, -56(%rdi) + movq %r13, -88(%rdi) + movq %r14, 80(%rdi) + # Round 14 + xorq %rsi, %r10 + xorq -80(%rdi), %r11 + xorq -72(%rdi), %r14 + xorq -64(%rdi), %r12 + xorq -48(%rdi), %r10 + xorq -40(%rdi), %r13 + xorq -32(%rdi), %r11 + xorq -24(%rdi), %r14 + xorq -16(%rdi), %r14 + xorq -8(%rdi), %r12 + xorq (%rdi), %r10 + xorq 8(%rdi), %r13 + xorq 24(%rdi), %r11 + xorq 32(%rdi), %r14 + xorq 40(%rdi), %r12 + xorq 56(%rdi), %r13 + xorq 64(%rdi), %r13 + xorq 72(%rdi), %r11 + xorq 88(%rdi), %r12 + xorq 96(%rdi), %r10 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -32(%rdi), %r11 + movq -8(%rdi), %r12 + movq 56(%rdi), %r13 + movq 80(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -32(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -8(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 56(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 80(%rdi) + movq $0x8000000000008089, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 8(%rdi), %r10 + movq 32(%rdi), %r11 + movq 96(%rdi), %r12 + movq -80(%rdi), %r13 + movq -56(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 32(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 96(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -80(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -56(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 8(%rdi) + # Row 2 + movq 72(%rdi), %r10 + movq -64(%rdi), %r11 + movq -40(%rdi), %r12 + movq -16(%rdi), %r13 + movq 48(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -64(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -40(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -16(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 48(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 72(%rdi) + # Row 3 + movq -24(%rdi), %r10 + movq (%rdi), %r11 + movq 24(%rdi), %r12 + movq 88(%rdi), %r13 + movq -88(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, (%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 24(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 88(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -88(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -24(%rdi) + # Row 4 + xorq 40(%rdi), %rcx + xorq 64(%rdi), %r8 + xorq -72(%rdi), %r9 + xorq -48(%rdi), %rdx + xorq 16(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 40(%rdi) + movq %r11, 64(%rdi) + movq %r12, -72(%rdi) + movq %r13, -48(%rdi) + movq %r14, 16(%rdi) + # Round 15 + xorq %rsi, %r10 + xorq -88(%rdi), %r14 + xorq -80(%rdi), %r13 + xorq -64(%rdi), %r11 + xorq -56(%rdi), %r14 + xorq -40(%rdi), %r12 + xorq -32(%rdi), %r11 + xorq -24(%rdi), %r10 + xorq -16(%rdi), %r13 + xorq -8(%rdi), %r12 + xorq (%rdi), %r11 + xorq 8(%rdi), %r10 + xorq 24(%rdi), %r12 + xorq 32(%rdi), %r11 + xorq 48(%rdi), %r14 + xorq 56(%rdi), %r13 + xorq 72(%rdi), %r10 + xorq 80(%rdi), %r14 + xorq 88(%rdi), %r13 + xorq 96(%rdi), %r12 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 32(%rdi), %r11 + movq -40(%rdi), %r12 + movq 88(%rdi), %r13 + movq 16(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 32(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -40(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 88(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 16(%rdi) + movq $0x8000000000008003, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 56(%rdi), %r10 + movq -56(%rdi), %r11 + movq 72(%rdi), %r12 + movq (%rdi), %r13 + movq -72(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -56(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 72(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, (%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -72(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 56(%rdi) + # Row 2 + movq -32(%rdi), %r10 + movq 96(%rdi), %r11 + movq -16(%rdi), %r12 + movq -88(%rdi), %r13 + movq 40(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 96(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -16(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -88(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 40(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -32(%rdi) + # Row 3 + movq 80(%rdi), %r10 + movq 8(%rdi), %r11 + movq -64(%rdi), %r12 + movq 24(%rdi), %r13 + movq -48(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 8(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -64(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 24(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -48(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 80(%rdi) + # Row 4 + xorq -8(%rdi), %rcx + xorq -80(%rdi), %r8 + xorq 48(%rdi), %r9 + xorq -24(%rdi), %rdx + xorq 64(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -8(%rdi) + movq %r11, -80(%rdi) + movq %r12, 48(%rdi) + movq %r13, -24(%rdi) + movq %r14, 64(%rdi) + # Round 16 + xorq %rsi, %r10 + xorq -88(%rdi), %r13 + xorq -72(%rdi), %r14 + xorq -64(%rdi), %r12 + xorq -56(%rdi), %r11 + xorq -48(%rdi), %r14 + xorq -40(%rdi), %r12 + xorq -32(%rdi), %r10 + xorq -16(%rdi), %r12 + xorq (%rdi), %r13 + xorq 8(%rdi), %r11 + xorq 16(%rdi), %r14 + xorq 24(%rdi), %r13 + xorq 32(%rdi), %r11 + xorq 40(%rdi), %r14 + xorq 56(%rdi), %r10 + xorq 72(%rdi), %r12 + xorq 80(%rdi), %r10 + xorq 88(%rdi), %r13 + xorq 96(%rdi), %r11 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -56(%rdi), %r11 + movq -16(%rdi), %r12 + movq 24(%rdi), %r13 + movq 64(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -56(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -16(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 24(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 64(%rdi) + movq $0x8000000000008002, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 88(%rdi), %r10 + movq -72(%rdi), %r11 + movq -32(%rdi), %r12 + movq 8(%rdi), %r13 + movq 48(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -72(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -32(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 8(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 48(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 88(%rdi) + # Row 2 + movq 32(%rdi), %r10 + movq 72(%rdi), %r11 + movq -88(%rdi), %r12 + movq -48(%rdi), %r13 + movq -8(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 72(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -88(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -48(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -8(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 32(%rdi) + # Row 3 + movq 16(%rdi), %r10 + movq 56(%rdi), %r11 + movq 96(%rdi), %r12 + movq -64(%rdi), %r13 + movq -24(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 56(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 96(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -64(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -24(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 16(%rdi) + # Row 4 + xorq -40(%rdi), %rcx + xorq (%rdi), %r8 + xorq 40(%rdi), %r9 + xorq 80(%rdi), %rdx + xorq -80(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -40(%rdi) + movq %r11, (%rdi) + movq %r12, 40(%rdi) + movq %r13, 80(%rdi) + movq %r14, -80(%rdi) + # Round 17 + xorq %rsi, %r10 + xorq -88(%rdi), %r12 + xorq -72(%rdi), %r11 + xorq -64(%rdi), %r13 + xorq -56(%rdi), %r11 + xorq -48(%rdi), %r13 + xorq -32(%rdi), %r12 + xorq -24(%rdi), %r14 + xorq -16(%rdi), %r12 + xorq -8(%rdi), %r14 + xorq 8(%rdi), %r13 + xorq 16(%rdi), %r10 + xorq 24(%rdi), %r13 + xorq 32(%rdi), %r10 + xorq 48(%rdi), %r14 + xorq 56(%rdi), %r11 + xorq 64(%rdi), %r14 + xorq 72(%rdi), %r11 + xorq 88(%rdi), %r10 + xorq 96(%rdi), %r12 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -72(%rdi), %r11 + movq -88(%rdi), %r12 + movq -64(%rdi), %r13 + movq -80(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -72(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -88(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -64(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -80(%rdi) + movq $0x8000000000000080, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 24(%rdi), %r10 + movq 48(%rdi), %r11 + movq 32(%rdi), %r12 + movq 56(%rdi), %r13 + movq 40(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 48(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 32(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 56(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 40(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 24(%rdi) + # Row 2 + movq -56(%rdi), %r10 + movq -32(%rdi), %r11 + movq -48(%rdi), %r12 + movq -24(%rdi), %r13 + movq -40(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -32(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -48(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -24(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -40(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -56(%rdi) + # Row 3 + movq 64(%rdi), %r10 + movq 88(%rdi), %r11 + movq 72(%rdi), %r12 + movq 96(%rdi), %r13 + movq 80(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 88(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 72(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 96(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 80(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 64(%rdi) + # Row 4 + xorq -16(%rdi), %rcx + xorq 8(%rdi), %r8 + xorq -8(%rdi), %r9 + xorq 16(%rdi), %rdx + xorq (%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -16(%rdi) + movq %r11, 8(%rdi) + movq %r12, -8(%rdi) + movq %r13, 16(%rdi) + movq %r14, (%rdi) + # Round 18 + xorq %rsi, %r10 + xorq -88(%rdi), %r12 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r11 + xorq -64(%rdi), %r13 + xorq -56(%rdi), %r10 + xorq -48(%rdi), %r12 + xorq -40(%rdi), %r14 + xorq -32(%rdi), %r11 + xorq -24(%rdi), %r13 + xorq 24(%rdi), %r10 + xorq 32(%rdi), %r12 + xorq 40(%rdi), %r14 + xorq 48(%rdi), %r11 + xorq 56(%rdi), %r13 + xorq 64(%rdi), %r10 + xorq 72(%rdi), %r12 + xorq 80(%rdi), %r14 + xorq 88(%rdi), %r11 + xorq 96(%rdi), %r13 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 48(%rdi), %r11 + movq -48(%rdi), %r12 + movq 96(%rdi), %r13 + movq (%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 48(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -48(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 96(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, (%rdi) + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq $0x800a, %rsi + # Row 1 + movq -64(%rdi), %r10 + movq 40(%rdi), %r11 + movq -56(%rdi), %r12 + movq 88(%rdi), %r13 + movq -8(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 40(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -56(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 88(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -8(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -64(%rdi) + # Row 2 + movq -72(%rdi), %r10 + movq 32(%rdi), %r11 + movq -24(%rdi), %r12 + movq 80(%rdi), %r13 + movq -16(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 32(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -24(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 80(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -16(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -72(%rdi) + # Row 3 + movq -80(%rdi), %r10 + movq 24(%rdi), %r11 + movq -32(%rdi), %r12 + movq 72(%rdi), %r13 + movq 16(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 24(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -32(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 72(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 16(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -80(%rdi) + # Row 4 + xorq -88(%rdi), %rcx + xorq 56(%rdi), %r8 + xorq -40(%rdi), %r9 + xorq 64(%rdi), %rdx + xorq 8(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -88(%rdi) + movq %r11, 56(%rdi) + movq %r12, -40(%rdi) + movq %r13, 64(%rdi) + movq %r14, 8(%rdi) + # Round 19 + xorq %rsi, %r10 + xorq -80(%rdi), %r10 + xorq -72(%rdi), %r10 + xorq -64(%rdi), %r10 + xorq -56(%rdi), %r12 + xorq -48(%rdi), %r12 + xorq -32(%rdi), %r12 + xorq -24(%rdi), %r12 + xorq -16(%rdi), %r14 + xorq -8(%rdi), %r14 + xorq (%rdi), %r14 + xorq 16(%rdi), %r14 + xorq 24(%rdi), %r11 + xorq 32(%rdi), %r11 + xorq 40(%rdi), %r11 + xorq 48(%rdi), %r11 + xorq 72(%rdi), %r13 + xorq 80(%rdi), %r13 + xorq 88(%rdi), %r13 + xorq 96(%rdi), %r13 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq 40(%rdi), %r11 + movq -24(%rdi), %r12 + movq 72(%rdi), %r13 + movq 8(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 40(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -24(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 72(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 8(%rdi) + movq $0x800000008000000a, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 96(%rdi), %r10 + movq -8(%rdi), %r11 + movq -72(%rdi), %r12 + movq 24(%rdi), %r13 + movq -40(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -8(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -72(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 24(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -40(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 96(%rdi) + # Row 2 + movq 48(%rdi), %r10 + movq -56(%rdi), %r11 + movq 80(%rdi), %r12 + movq 16(%rdi), %r13 + movq -88(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -56(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 80(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 16(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -88(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 48(%rdi) + # Row 3 + movq (%rdi), %r10 + movq -64(%rdi), %r11 + movq 32(%rdi), %r12 + movq -32(%rdi), %r13 + movq 64(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -64(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 32(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -32(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 64(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, (%rdi) + # Row 4 + xorq -48(%rdi), %rcx + xorq 88(%rdi), %r8 + xorq -16(%rdi), %r9 + xorq -80(%rdi), %rdx + xorq 56(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -48(%rdi) + movq %r11, 88(%rdi) + movq %r12, -16(%rdi) + movq %r13, -80(%rdi) + movq %r14, 56(%rdi) + # Round 20 + xorq %rsi, %r10 + xorq -88(%rdi), %r14 + xorq -72(%rdi), %r12 + xorq -64(%rdi), %r11 + xorq -56(%rdi), %r11 + xorq -40(%rdi), %r14 + xorq -32(%rdi), %r13 + xorq -24(%rdi), %r12 + xorq -8(%rdi), %r11 + xorq (%rdi), %r10 + xorq 8(%rdi), %r14 + xorq 16(%rdi), %r13 + xorq 24(%rdi), %r13 + xorq 32(%rdi), %r12 + xorq 40(%rdi), %r11 + xorq 48(%rdi), %r10 + xorq 64(%rdi), %r14 + xorq 72(%rdi), %r13 + xorq 80(%rdi), %r12 + xorq 96(%rdi), %r10 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -8(%rdi), %r11 + movq 80(%rdi), %r12 + movq -32(%rdi), %r13 + movq 56(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -8(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 80(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -32(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 56(%rdi) + movq $0x8000000080008081, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 72(%rdi), %r10 + movq -40(%rdi), %r11 + movq 48(%rdi), %r12 + movq -64(%rdi), %r13 + movq -16(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -40(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 48(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -64(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -16(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 72(%rdi) + # Row 2 + movq 40(%rdi), %r10 + movq -72(%rdi), %r11 + movq 16(%rdi), %r12 + movq 64(%rdi), %r13 + movq -48(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -72(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 16(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 64(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -48(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 40(%rdi) + # Row 3 + movq 8(%rdi), %r10 + movq 96(%rdi), %r11 + movq -56(%rdi), %r12 + movq 32(%rdi), %r13 + movq -80(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 96(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -56(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 32(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -80(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 8(%rdi) + # Row 4 + xorq -24(%rdi), %rcx + xorq 24(%rdi), %r8 + xorq -88(%rdi), %r9 + xorq (%rdi), %rdx + xorq 88(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, -24(%rdi) + movq %r11, 24(%rdi) + movq %r12, -88(%rdi) + movq %r13, (%rdi) + movq %r14, 88(%rdi) + # Round 21 + xorq %rsi, %r10 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r11 + xorq -64(%rdi), %r13 + xorq -56(%rdi), %r12 + xorq -48(%rdi), %r14 + xorq -40(%rdi), %r11 + xorq -32(%rdi), %r13 + xorq -16(%rdi), %r14 + xorq -8(%rdi), %r11 + xorq 8(%rdi), %r10 + xorq 16(%rdi), %r12 + xorq 32(%rdi), %r13 + xorq 40(%rdi), %r10 + xorq 48(%rdi), %r12 + xorq 56(%rdi), %r14 + xorq 64(%rdi), %r13 + xorq 72(%rdi), %r10 + xorq 80(%rdi), %r12 + xorq 96(%rdi), %r11 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -40(%rdi), %r11 + movq 16(%rdi), %r12 + movq 32(%rdi), %r13 + movq 88(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -40(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 16(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 32(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 88(%rdi) + movq $0x8000000000008080, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq -32(%rdi), %r10 + movq -16(%rdi), %r11 + movq 40(%rdi), %r12 + movq 96(%rdi), %r13 + movq -88(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -16(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 40(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 96(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -88(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -32(%rdi) + # Row 2 + movq -8(%rdi), %r10 + movq 48(%rdi), %r11 + movq 64(%rdi), %r12 + movq -80(%rdi), %r13 + movq -24(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 48(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 64(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -80(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -24(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -8(%rdi) + # Row 3 + movq 56(%rdi), %r10 + movq 72(%rdi), %r11 + movq -72(%rdi), %r12 + movq -56(%rdi), %r13 + movq (%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 72(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -72(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -56(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, (%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 56(%rdi) + # Row 4 + xorq 80(%rdi), %rcx + xorq -64(%rdi), %r8 + xorq -48(%rdi), %r9 + xorq 8(%rdi), %rdx + xorq 24(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 80(%rdi) + movq %r11, -64(%rdi) + movq %r12, -48(%rdi) + movq %r13, 8(%rdi) + movq %r14, 24(%rdi) + # Round 22 + xorq %rsi, %r10 + xorq -88(%rdi), %r14 + xorq -80(%rdi), %r13 + xorq -72(%rdi), %r12 + xorq -56(%rdi), %r13 + xorq -40(%rdi), %r11 + xorq -32(%rdi), %r10 + xorq -24(%rdi), %r14 + xorq -16(%rdi), %r11 + xorq -8(%rdi), %r10 + xorq (%rdi), %r14 + xorq 16(%rdi), %r12 + xorq 32(%rdi), %r13 + xorq 40(%rdi), %r12 + xorq 48(%rdi), %r11 + xorq 56(%rdi), %r10 + xorq 64(%rdi), %r12 + xorq 72(%rdi), %r11 + xorq 88(%rdi), %r14 + xorq 96(%rdi), %r13 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -16(%rdi), %r11 + movq 64(%rdi), %r12 + movq -56(%rdi), %r13 + movq 24(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -16(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 64(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -56(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 24(%rdi) + movq $0x80000001, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq 32(%rdi), %r10 + movq -88(%rdi), %r11 + movq -8(%rdi), %r12 + movq 72(%rdi), %r13 + movq -48(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -88(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -8(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 72(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -48(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 32(%rdi) + # Row 2 + movq -40(%rdi), %r10 + movq 40(%rdi), %r11 + movq -80(%rdi), %r12 + movq (%rdi), %r13 + movq 80(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 40(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -80(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, (%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 80(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -40(%rdi) + # Row 3 + movq 88(%rdi), %r10 + movq -32(%rdi), %r11 + movq 48(%rdi), %r12 + movq -72(%rdi), %r13 + movq 8(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -32(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 48(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -72(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 8(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 88(%rdi) + # Row 4 + xorq 16(%rdi), %rcx + xorq 96(%rdi), %r8 + xorq -24(%rdi), %r9 + xorq 56(%rdi), %rdx + xorq -64(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 16(%rdi) + movq %r11, 96(%rdi) + movq %r12, -24(%rdi) + movq %r13, 56(%rdi) + movq %r14, -64(%rdi) + # Round 23 + xorq %rsi, %r10 + xorq -88(%rdi), %r11 + xorq -80(%rdi), %r12 + xorq -72(%rdi), %r13 + xorq -56(%rdi), %r13 + xorq -48(%rdi), %r14 + xorq -40(%rdi), %r10 + xorq -32(%rdi), %r11 + xorq -16(%rdi), %r11 + xorq -8(%rdi), %r12 + xorq (%rdi), %r13 + xorq 8(%rdi), %r14 + xorq 24(%rdi), %r14 + xorq 32(%rdi), %r10 + xorq 40(%rdi), %r11 + xorq 48(%rdi), %r12 + xorq 64(%rdi), %r12 + xorq 72(%rdi), %r13 + xorq 80(%rdi), %r14 + xorq 88(%rdi), %r10 + # Calc t[0..4] + rorxq $63, %r11, %rdx + rorxq $63, %r12, %rax + rorxq $63, %r13, %rcx + rorxq $63, %r14, %r8 + rorxq $63, %r10, %r9 + xorq %r14, %rdx + xorq %r10, %rax + xorq %r11, %rcx + xorq %r12, %r8 + xorq %r13, %r9 + # Row Mix + # Row 0 + movq %rsi, %r10 + movq -88(%rdi), %r11 + movq -80(%rdi), %r12 + movq -72(%rdi), %r13 + movq -64(%rdi), %r14 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + rolq $44, %r11 + rolq $43, %r12 + rolq $21, %r13 + rolq $14, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -88(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -80(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -72(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -64(%rdi) + movq $0x8000000080008008, %r14 + andnq %r12, %r11, %rsi + xorq %r10, %rsi + # XOR in constant + xorq %r14, %rsi + # Row 1 + movq -56(%rdi), %r10 + movq -48(%rdi), %r11 + movq -40(%rdi), %r12 + movq -32(%rdi), %r13 + movq -24(%rdi), %r14 + xorq %r8, %r10 + xorq %r9, %r11 + xorq %rdx, %r12 + xorq %rax, %r13 + xorq %rcx, %r14 + rolq $28, %r10 + rolq $20, %r11 + rolq $3, %r12 + rolq $45, %r13 + rolq $61, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -48(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, -40(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, -32(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, -24(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -56(%rdi) + # Row 2 + movq -16(%rdi), %r10 + movq -8(%rdi), %r11 + movq (%rdi), %r12 + movq 8(%rdi), %r13 + movq 16(%rdi), %r14 + xorq %rax, %r10 + xorq %rcx, %r11 + xorq %r8, %r12 + xorq %r9, %r13 + xorq %rdx, %r14 + rolq $0x01, %r10 + rolq $6, %r11 + rolq $25, %r12 + rolq $8, %r13 + rolq $18, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, -8(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, (%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 8(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 16(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, -16(%rdi) + # Row 3 + movq 24(%rdi), %r10 + movq 32(%rdi), %r11 + movq 40(%rdi), %r12 + movq 48(%rdi), %r13 + movq 56(%rdi), %r14 + xorq %r9, %r10 + xorq %rdx, %r11 + xorq %rax, %r12 + xorq %rcx, %r13 + xorq %r8, %r14 + rolq $27, %r10 + rolq $36, %r11 + rolq $10, %r12 + rolq $15, %r13 + rolq $56, %r14 + andnq %r13, %r12, %r15 + xorq %r11, %r15 + movq %r15, 32(%rdi) + andnq %r14, %r13, %r15 + xorq %r12, %r15 + movq %r15, 40(%rdi) + andnq %r10, %r14, %r15 + xorq %r13, %r15 + movq %r15, 48(%rdi) + andnq %r11, %r10, %r15 + xorq %r14, %r15 + movq %r15, 56(%rdi) + andnq %r12, %r11, %r15 + xorq %r10, %r15 + movq %r15, 24(%rdi) + # Row 4 + xorq 64(%rdi), %rcx + xorq 72(%rdi), %r8 + xorq 80(%rdi), %r9 + xorq 88(%rdi), %rdx + xorq 96(%rdi), %rax + rorxq $2, %rcx, %r10 + rorxq $9, %r8, %r11 + rorxq $25, %r9, %r12 + rorxq $23, %rdx, %r13 + rorxq $62, %rax, %r14 + andnq %r12, %r11, %rdx + andnq %r13, %r12, %rax + andnq %r14, %r13, %rcx + andnq %r10, %r14, %r8 + andnq %r11, %r10, %r9 + xorq %rdx, %r10 + xorq %rax, %r11 + xorq %rcx, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + movq %r10, 64(%rdi) + movq %r11, 72(%rdi) + movq %r12, 80(%rdi) + movq %r13, 88(%rdi) + movq %r14, 96(%rdi) + movq %rsi, -96(%rdi) + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size sha3_block_bmi2,.-sha3_block_bmi2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl sha3_block_n_bmi2 +.type sha3_block_n_bmi2,@function +.align 16 +sha3_block_n_bmi2: +#else +.section __TEXT,__text +.globl _sha3_block_n_bmi2 +.p2align 4 +_sha3_block_n_bmi2: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + pushq %rcx + movq %rcx, %rbp + movq (%rdi), %rcx + addq $0x60, %rdi +L_sha3_block_n_bmi2_start: + cmpq $0x88, %rbp + je L_sha3_block_n_bmi2_load_256 + cmpq $0xa8, %rbp + je L_sha3_block_n_bmi2_load_128 + cmpq $0x90, %rbp + je L_sha3_block_n_bmi2_load_224 + cmpq $0x68, %rbp + je L_sha3_block_n_bmi2_load_384 + movq (%rsi), %r12 + movq 8(%rsi), %r13 + movq 16(%rsi), %r14 + movq 24(%rsi), %r15 + movq 32(%rsi), %rbx + movq 40(%rsi), %rax + movq 48(%rsi), %r8 + movq 56(%rsi), %r9 + movq 64(%rsi), %r10 + xorq %rcx, %r12 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r15 + xorq -64(%rdi), %rbx + xorq -56(%rdi), %rax + xorq -48(%rdi), %r8 + xorq -40(%rdi), %r9 + xorq -32(%rdi), %r10 + movq %r12, %rcx + movq %r13, -88(%rdi) + movq %r14, -80(%rdi) + movq %r15, -72(%rdi) + movq %rbx, -64(%rdi) + movq %rax, -56(%rdi) + movq %r8, -48(%rdi) + movq %r9, -40(%rdi) + movq %r10, -32(%rdi) + jmp L_sha3_block_n_bmi2_rounds +L_sha3_block_n_bmi2_load_128: + movq (%rsi), %r12 + movq 8(%rsi), %r13 + movq 16(%rsi), %r14 + movq 24(%rsi), %r15 + movq 32(%rsi), %rbx + xorq %rcx, %r12 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r15 + xorq -64(%rdi), %rbx + movq %r12, %rcx + movq %r13, -88(%rdi) + movq %r14, -80(%rdi) + movq %r15, -72(%rdi) + movq %rbx, -64(%rdi) + movq 40(%rsi), %rax + movq 48(%rsi), %r8 + movq 56(%rsi), %r9 + movq 64(%rsi), %r10 + movq 72(%rsi), %r11 + movq 80(%rsi), %rbp + xorq -56(%rdi), %rax + xorq -48(%rdi), %r8 + xorq -40(%rdi), %r9 + xorq -32(%rdi), %r10 + xorq -24(%rdi), %r11 + xorq -16(%rdi), %rbp + movq %rax, -56(%rdi) + movq %r8, -48(%rdi) + movq %r9, -40(%rdi) + movq %r10, -32(%rdi) + movq %r11, -24(%rdi) + movq %rbp, -16(%rdi) + movq 88(%rsi), %rax + movq 96(%rsi), %r8 + movq 104(%rsi), %r9 + movq 112(%rsi), %r10 + movq 120(%rsi), %r11 + movq 128(%rsi), %rbp + xorq -8(%rdi), %rax + xorq (%rdi), %r8 + xorq 8(%rdi), %r9 + xorq 16(%rdi), %r10 + xorq 24(%rdi), %r11 + xorq 32(%rdi), %rbp + movq %rax, -8(%rdi) + movq %r8, (%rdi) + movq %r9, 8(%rdi) + movq %r10, 16(%rdi) + movq %r11, 24(%rdi) + movq %rbp, 32(%rdi) + movq 136(%rsi), %rax + movq 144(%rsi), %r8 + movq 152(%rsi), %r9 + movq 160(%rsi), %r10 + xorq 40(%rdi), %rax + xorq 48(%rdi), %r8 + xorq 56(%rdi), %r9 + xorq 64(%rdi), %r10 + movq %rax, 40(%rdi) + movq %r8, 48(%rdi) + movq %r9, 56(%rdi) + movq %r10, 64(%rdi) + jmp L_sha3_block_n_bmi2_rounds +L_sha3_block_n_bmi2_load_224: + movq 40(%rsi), %r12 + movq 48(%rsi), %r13 + movq 56(%rsi), %r14 + movq 64(%rsi), %r15 + movq 72(%rsi), %rbx + movq 80(%rsi), %rax + movq 88(%rsi), %r8 + movq 96(%rsi), %r9 + movq 104(%rsi), %r10 + movq 112(%rsi), %r11 + xorq -56(%rdi), %r12 + xorq -48(%rdi), %r13 + xorq -40(%rdi), %r14 + xorq -32(%rdi), %r15 + xorq -24(%rdi), %rbx + xorq -16(%rdi), %rax + xorq -8(%rdi), %r8 + xorq (%rdi), %r9 + xorq 8(%rdi), %r10 + xorq 16(%rdi), %r11 + movq %r12, -56(%rdi) + movq %r13, -48(%rdi) + movq %r14, -40(%rdi) + movq %r15, -32(%rdi) + movq %rbx, -24(%rdi) + movq %rax, -16(%rdi) + movq %r8, -8(%rdi) + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq (%rsi), %r12 + movq 8(%rsi), %r13 + movq 16(%rsi), %r14 + movq 24(%rsi), %r15 + movq 32(%rsi), %rbx + movq 120(%rsi), %rax + movq 128(%rsi), %r8 + movq 136(%rsi), %r9 + xorq %rcx, %r12 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r15 + xorq -64(%rdi), %rbx + xorq 24(%rdi), %rax + xorq 32(%rdi), %r8 + xorq 40(%rdi), %r9 + movq %r12, %rcx + movq %r13, -88(%rdi) + movq %r14, -80(%rdi) + movq %r15, -72(%rdi) + movq %rbx, -64(%rdi) + movq %rax, 24(%rdi) + movq %r8, 32(%rdi) + movq %r9, 40(%rdi) + jmp L_sha3_block_n_bmi2_rounds +L_sha3_block_n_bmi2_load_384: + movq (%rsi), %r12 + movq 8(%rsi), %r13 + movq 16(%rsi), %r14 + movq 24(%rsi), %r15 + movq 32(%rsi), %rbx + movq 40(%rsi), %rax + movq 48(%rsi), %r8 + movq 56(%rsi), %r9 + movq 64(%rsi), %r10 + xorq %rcx, %r12 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r15 + xorq -64(%rdi), %rbx + xorq -56(%rdi), %rax + xorq -48(%rdi), %r8 + xorq -40(%rdi), %r9 + xorq -32(%rdi), %r10 + movq %r12, %rcx + movq %r13, -88(%rdi) + movq %r14, -80(%rdi) + movq %r15, -72(%rdi) + movq %rbx, -64(%rdi) + movq %rax, -56(%rdi) + movq %r8, -48(%rdi) + movq %r9, -40(%rdi) + movq %r10, -32(%rdi) + movq 72(%rsi), %rax + movq 80(%rsi), %r8 + movq 88(%rsi), %r9 + movq 96(%rsi), %r10 + xorq -24(%rdi), %rax + xorq -16(%rdi), %r8 + xorq -8(%rdi), %r9 + xorq (%rdi), %r10 + movq %rax, -24(%rdi) + movq %r8, -16(%rdi) + movq %r9, -8(%rdi) + movq %r10, (%rdi) + jmp L_sha3_block_n_bmi2_rounds +L_sha3_block_n_bmi2_load_256: + movq (%rsi), %r12 + movq 8(%rsi), %r13 + movq 16(%rsi), %r14 + movq 24(%rsi), %r15 + movq 32(%rsi), %rbx + movq 40(%rsi), %rax + movq 48(%rsi), %r8 + movq 56(%rsi), %r9 + movq 64(%rsi), %r10 + movq 72(%rsi), %r11 + movq 80(%rsi), %rbp + xorq %rcx, %r12 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r15 + xorq -64(%rdi), %rbx + xorq -56(%rdi), %rax + xorq -48(%rdi), %r8 + xorq -40(%rdi), %r9 + xorq -32(%rdi), %r10 + xorq -24(%rdi), %r11 + xorq -16(%rdi), %rbp + movq %r12, %rcx + movq %r13, -88(%rdi) + movq %r14, -80(%rdi) + movq %r15, -72(%rdi) + movq %rbx, -64(%rdi) + movq %rax, -56(%rdi) + movq %r8, -48(%rdi) + movq %r9, -40(%rdi) + movq %r10, -32(%rdi) + movq %r11, -24(%rdi) + movq %rbp, -16(%rdi) + movq 88(%rsi), %rax + movq 96(%rsi), %r8 + movq 104(%rsi), %r9 + movq 112(%rsi), %r10 + movq 120(%rsi), %r11 + movq 128(%rsi), %rbp + xorq -8(%rdi), %rax + xorq (%rdi), %r8 + xorq 8(%rdi), %r9 + xorq 16(%rdi), %r10 + xorq 24(%rdi), %r11 + xorq 32(%rdi), %rbp + movq %rax, -8(%rdi) + movq %r8, (%rdi) + movq %r9, 8(%rdi) + movq %r10, 16(%rdi) + movq %r11, 24(%rdi) + movq %rbp, 32(%rdi) +L_sha3_block_n_bmi2_rounds: + # Round 0 + xorq -56(%rdi), %r12 + xorq -48(%rdi), %r13 + xorq -40(%rdi), %r14 + xorq -32(%rdi), %r15 + xorq -24(%rdi), %rbx + xorq -16(%rdi), %r12 + xorq -8(%rdi), %r13 + xorq (%rdi), %r14 + xorq 8(%rdi), %r15 + xorq 16(%rdi), %rbx + xorq 24(%rdi), %r12 + xorq 32(%rdi), %r13 + xorq 40(%rdi), %r14 + xorq 48(%rdi), %r15 + xorq 56(%rdi), %rbx + xorq 64(%rdi), %r12 + xorq 72(%rdi), %r13 + xorq 80(%rdi), %r14 + xorq 88(%rdi), %r15 + xorq 96(%rdi), %rbx + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -48(%rdi), %r13 + movq (%rdi), %r14 + movq 48(%rdi), %r15 + movq 96(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -48(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, (%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 48(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 96(%rdi) + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq $0x01, %rcx + # Row 1 + movq -72(%rdi), %r12 + movq -24(%rdi), %r13 + movq -16(%rdi), %r14 + movq 32(%rdi), %r15 + movq 80(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -24(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -16(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 32(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 80(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -72(%rdi) + # Row 2 + movq -88(%rdi), %r12 + movq -40(%rdi), %r13 + movq 8(%rdi), %r14 + movq 56(%rdi), %r15 + movq 64(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -40(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 8(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 56(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 64(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -88(%rdi) + # Row 3 + movq -64(%rdi), %r12 + movq -56(%rdi), %r13 + movq -8(%rdi), %r14 + movq 40(%rdi), %r15 + movq 88(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -56(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -8(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 40(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 88(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -64(%rdi) + # Row 4 + xorq -80(%rdi), %r9 + xorq -32(%rdi), %r10 + xorq 16(%rdi), %r11 + xorq 24(%rdi), %rax + xorq 72(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -80(%rdi) + movq %r13, -32(%rdi) + movq %r14, 16(%rdi) + movq %r15, 24(%rdi) + movq %rbx, 72(%rdi) + # Round 1 + xorq %rcx, %r12 + xorq -88(%rdi), %r12 + xorq -72(%rdi), %r12 + xorq -64(%rdi), %r12 + xorq -56(%rdi), %r13 + xorq -48(%rdi), %r13 + xorq -40(%rdi), %r13 + xorq -24(%rdi), %r13 + xorq -16(%rdi), %r14 + xorq -8(%rdi), %r14 + xorq (%rdi), %r14 + xorq 8(%rdi), %r14 + xorq 32(%rdi), %r15 + xorq 40(%rdi), %r15 + xorq 48(%rdi), %r15 + xorq 56(%rdi), %r15 + xorq 64(%rdi), %rbx + xorq 80(%rdi), %rbx + xorq 88(%rdi), %rbx + xorq 96(%rdi), %rbx + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -24(%rdi), %r13 + movq 8(%rdi), %r14 + movq 40(%rdi), %r15 + movq 72(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -24(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 8(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 40(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 72(%rdi) + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq $0x8082, %rcx + # Row 1 + movq 48(%rdi), %r12 + movq 80(%rdi), %r13 + movq -88(%rdi), %r14 + movq -56(%rdi), %r15 + movq 16(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 80(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -88(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -56(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 16(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 48(%rdi) + # Row 2 + movq -48(%rdi), %r12 + movq -16(%rdi), %r13 + movq 56(%rdi), %r14 + movq 88(%rdi), %r15 + movq -80(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -16(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 56(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 88(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -80(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -48(%rdi) + # Row 3 + movq 96(%rdi), %r12 + movq -72(%rdi), %r13 + movq -40(%rdi), %r14 + movq -8(%rdi), %r15 + movq 24(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -72(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -40(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -8(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 24(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 96(%rdi) + # Row 4 + xorq (%rdi), %r9 + xorq 32(%rdi), %r10 + xorq 64(%rdi), %r11 + xorq -64(%rdi), %rax + xorq -32(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, (%rdi) + movq %r13, 32(%rdi) + movq %r14, 64(%rdi) + movq %r15, -64(%rdi) + movq %rbx, -32(%rdi) + # Round 2 + xorq %rcx, %r12 + xorq -88(%rdi), %r14 + xorq -80(%rdi), %rbx + xorq -72(%rdi), %r13 + xorq -56(%rdi), %r15 + xorq -48(%rdi), %r12 + xorq -40(%rdi), %r14 + xorq -24(%rdi), %r13 + xorq -16(%rdi), %r13 + xorq -8(%rdi), %r15 + xorq 8(%rdi), %r14 + xorq 16(%rdi), %rbx + xorq 24(%rdi), %rbx + xorq 40(%rdi), %r15 + xorq 48(%rdi), %r12 + xorq 56(%rdi), %r14 + xorq 72(%rdi), %rbx + xorq 80(%rdi), %r13 + xorq 88(%rdi), %r15 + xorq 96(%rdi), %r12 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 80(%rdi), %r13 + movq 56(%rdi), %r14 + movq -8(%rdi), %r15 + movq -32(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 80(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 56(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -8(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -32(%rdi) + movq $0x800000000000808a, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 40(%rdi), %r12 + movq 16(%rdi), %r13 + movq -48(%rdi), %r14 + movq -72(%rdi), %r15 + movq 64(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 16(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -48(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -72(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 64(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 40(%rdi) + # Row 2 + movq -24(%rdi), %r12 + movq -88(%rdi), %r13 + movq 88(%rdi), %r14 + movq 24(%rdi), %r15 + movq (%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -88(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 88(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 24(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, (%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -24(%rdi) + # Row 3 + movq 72(%rdi), %r12 + movq 48(%rdi), %r13 + movq -16(%rdi), %r14 + movq -40(%rdi), %r15 + movq -64(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 48(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -16(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -40(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -64(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 72(%rdi) + # Row 4 + xorq 8(%rdi), %r9 + xorq -56(%rdi), %r10 + xorq -80(%rdi), %r11 + xorq 96(%rdi), %rax + xorq 32(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 8(%rdi) + movq %r13, -56(%rdi) + movq %r14, -80(%rdi) + movq %r15, 96(%rdi) + movq %rbx, 32(%rdi) + # Round 3 + xorq %rcx, %r12 + xorq -88(%rdi), %r13 + xorq -72(%rdi), %r15 + xorq -64(%rdi), %rbx + xorq -48(%rdi), %r14 + xorq -40(%rdi), %r15 + xorq -32(%rdi), %rbx + xorq -24(%rdi), %r12 + xorq -16(%rdi), %r14 + xorq -8(%rdi), %r15 + xorq (%rdi), %rbx + xorq 16(%rdi), %r13 + xorq 24(%rdi), %r15 + xorq 40(%rdi), %r12 + xorq 48(%rdi), %r13 + xorq 56(%rdi), %r14 + xorq 64(%rdi), %rbx + xorq 72(%rdi), %r12 + xorq 80(%rdi), %r13 + xorq 88(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 16(%rdi), %r13 + movq 88(%rdi), %r14 + movq -40(%rdi), %r15 + movq 32(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 16(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 88(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -40(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 32(%rdi) + movq $0x8000000080008000, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq -8(%rdi), %r12 + movq 64(%rdi), %r13 + movq -24(%rdi), %r14 + movq 48(%rdi), %r15 + movq -80(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 64(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -24(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 48(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -80(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -8(%rdi) + # Row 2 + movq 80(%rdi), %r12 + movq -48(%rdi), %r13 + movq 24(%rdi), %r14 + movq -64(%rdi), %r15 + movq 8(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -48(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 24(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -64(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 8(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 80(%rdi) + # Row 3 + movq -32(%rdi), %r12 + movq 40(%rdi), %r13 + movq -88(%rdi), %r14 + movq -16(%rdi), %r15 + movq 96(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 40(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -88(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -16(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 96(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -32(%rdi) + # Row 4 + xorq 56(%rdi), %r9 + xorq -72(%rdi), %r10 + xorq (%rdi), %r11 + xorq 72(%rdi), %rax + xorq -56(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 56(%rdi) + movq %r13, -72(%rdi) + movq %r14, (%rdi) + movq %r15, 72(%rdi) + movq %rbx, -56(%rdi) + # Round 4 + xorq %rcx, %r12 + xorq -88(%rdi), %r14 + xorq -80(%rdi), %rbx + xorq -64(%rdi), %r15 + xorq -48(%rdi), %r13 + xorq -40(%rdi), %r15 + xorq -32(%rdi), %r12 + xorq -24(%rdi), %r14 + xorq -16(%rdi), %r15 + xorq -8(%rdi), %r12 + xorq 8(%rdi), %rbx + xorq 16(%rdi), %r13 + xorq 24(%rdi), %r14 + xorq 32(%rdi), %rbx + xorq 40(%rdi), %r13 + xorq 48(%rdi), %r15 + xorq 64(%rdi), %r13 + xorq 80(%rdi), %r12 + xorq 88(%rdi), %r14 + xorq 96(%rdi), %rbx + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 64(%rdi), %r13 + movq 24(%rdi), %r14 + movq -16(%rdi), %r15 + movq -56(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 64(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 24(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -16(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -56(%rdi) + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq $0x808b, %rcx + # Row 1 + movq -40(%rdi), %r12 + movq -80(%rdi), %r13 + movq 80(%rdi), %r14 + movq 40(%rdi), %r15 + movq (%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -80(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 80(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 40(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, (%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -40(%rdi) + # Row 2 + movq 16(%rdi), %r12 + movq -24(%rdi), %r13 + movq -64(%rdi), %r14 + movq 96(%rdi), %r15 + movq 56(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -24(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -64(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 96(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 56(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 16(%rdi) + # Row 3 + movq 32(%rdi), %r12 + movq -8(%rdi), %r13 + movq -48(%rdi), %r14 + movq -88(%rdi), %r15 + movq 72(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -8(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -48(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -88(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 72(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 32(%rdi) + # Row 4 + xorq 88(%rdi), %r9 + xorq 48(%rdi), %r10 + xorq 8(%rdi), %r11 + xorq -32(%rdi), %rax + xorq -72(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 88(%rdi) + movq %r13, 48(%rdi) + movq %r14, 8(%rdi) + movq %r15, -32(%rdi) + movq %rbx, -72(%rdi) + # Round 5 + xorq %rcx, %r12 + xorq -88(%rdi), %r15 + xorq -80(%rdi), %r13 + xorq -64(%rdi), %r14 + xorq -56(%rdi), %rbx + xorq -48(%rdi), %r14 + xorq -40(%rdi), %r12 + xorq -24(%rdi), %r13 + xorq -16(%rdi), %r15 + xorq -8(%rdi), %r13 + xorq (%rdi), %rbx + xorq 16(%rdi), %r12 + xorq 24(%rdi), %r14 + xorq 32(%rdi), %r12 + xorq 40(%rdi), %r15 + xorq 56(%rdi), %rbx + xorq 64(%rdi), %r13 + xorq 72(%rdi), %rbx + xorq 80(%rdi), %r14 + xorq 96(%rdi), %r15 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -80(%rdi), %r13 + movq -64(%rdi), %r14 + movq -88(%rdi), %r15 + movq -72(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -80(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -64(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -88(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -72(%rdi) + movq $0x80000001, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq -16(%rdi), %r12 + movq (%rdi), %r13 + movq 16(%rdi), %r14 + movq -8(%rdi), %r15 + movq 8(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, (%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 16(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -8(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 8(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -16(%rdi) + # Row 2 + movq 64(%rdi), %r12 + movq 80(%rdi), %r13 + movq 96(%rdi), %r14 + movq 72(%rdi), %r15 + movq 88(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 80(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 96(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 72(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 88(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 64(%rdi) + # Row 3 + movq -56(%rdi), %r12 + movq -40(%rdi), %r13 + movq -24(%rdi), %r14 + movq -48(%rdi), %r15 + movq -32(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -40(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -24(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -48(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -32(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -56(%rdi) + # Row 4 + xorq 24(%rdi), %r9 + xorq 40(%rdi), %r10 + xorq 56(%rdi), %r11 + xorq 32(%rdi), %rax + xorq 48(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 24(%rdi) + movq %r13, 40(%rdi) + movq %r14, 56(%rdi) + movq %r15, 32(%rdi) + movq %rbx, 48(%rdi) + # Round 6 + xorq %rcx, %r12 + xorq -88(%rdi), %r15 + xorq -80(%rdi), %r13 + xorq -72(%rdi), %rbx + xorq -64(%rdi), %r14 + xorq -56(%rdi), %r12 + xorq -48(%rdi), %r15 + xorq -40(%rdi), %r13 + xorq -32(%rdi), %rbx + xorq -24(%rdi), %r14 + xorq -16(%rdi), %r12 + xorq -8(%rdi), %r15 + xorq (%rdi), %r13 + xorq 8(%rdi), %rbx + xorq 16(%rdi), %r14 + xorq 64(%rdi), %r12 + xorq 72(%rdi), %r15 + xorq 80(%rdi), %r13 + xorq 88(%rdi), %rbx + xorq 96(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq (%rdi), %r13 + movq 96(%rdi), %r14 + movq -48(%rdi), %r15 + movq 48(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, (%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 96(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -48(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 48(%rdi) + movq $0x8000000080008081, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq -88(%rdi), %r12 + movq 8(%rdi), %r13 + movq 64(%rdi), %r14 + movq -40(%rdi), %r15 + movq 56(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 8(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 64(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -40(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 56(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -88(%rdi) + # Row 2 + movq -80(%rdi), %r12 + movq 16(%rdi), %r13 + movq 72(%rdi), %r14 + movq -32(%rdi), %r15 + movq 24(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 16(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 72(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -32(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 24(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -80(%rdi) + # Row 3 + movq -72(%rdi), %r12 + movq -16(%rdi), %r13 + movq 80(%rdi), %r14 + movq -24(%rdi), %r15 + movq 32(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -16(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 80(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -24(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 32(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -72(%rdi) + # Row 4 + xorq -64(%rdi), %r9 + xorq -8(%rdi), %r10 + xorq 88(%rdi), %r11 + xorq -56(%rdi), %rax + xorq 40(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -64(%rdi) + movq %r13, -8(%rdi) + movq %r14, 88(%rdi) + movq %r15, -56(%rdi) + movq %rbx, 40(%rdi) + # Round 7 + xorq %rcx, %r12 + xorq -88(%rdi), %r12 + xorq -80(%rdi), %r12 + xorq -72(%rdi), %r12 + xorq -48(%rdi), %r15 + xorq -40(%rdi), %r15 + xorq -32(%rdi), %r15 + xorq -24(%rdi), %r15 + xorq -16(%rdi), %r13 + xorq (%rdi), %r13 + xorq 8(%rdi), %r13 + xorq 16(%rdi), %r13 + xorq 24(%rdi), %rbx + xorq 32(%rdi), %rbx + xorq 48(%rdi), %rbx + xorq 56(%rdi), %rbx + xorq 64(%rdi), %r14 + xorq 72(%rdi), %r14 + xorq 80(%rdi), %r14 + xorq 96(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 8(%rdi), %r13 + movq 72(%rdi), %r14 + movq -24(%rdi), %r15 + movq 40(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 8(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 72(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -24(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 40(%rdi) + movq $0x8000000000008009, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq -48(%rdi), %r12 + movq 56(%rdi), %r13 + movq -80(%rdi), %r14 + movq -16(%rdi), %r15 + movq 88(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 56(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -80(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -16(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 88(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -48(%rdi) + # Row 2 + movq (%rdi), %r12 + movq 64(%rdi), %r13 + movq -32(%rdi), %r14 + movq 32(%rdi), %r15 + movq -64(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 64(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -32(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 32(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -64(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, (%rdi) + # Row 3 + movq 48(%rdi), %r12 + movq -88(%rdi), %r13 + movq 16(%rdi), %r14 + movq 80(%rdi), %r15 + movq -56(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -88(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 16(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 80(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -56(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 48(%rdi) + # Row 4 + xorq 96(%rdi), %r9 + xorq -40(%rdi), %r10 + xorq 24(%rdi), %r11 + xorq -72(%rdi), %rax + xorq -8(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 96(%rdi) + movq %r13, -40(%rdi) + movq %r14, 24(%rdi) + movq %r15, -72(%rdi) + movq %rbx, -8(%rdi) + # Round 8 + xorq %rcx, %r12 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r14 + xorq -64(%rdi), %rbx + xorq -56(%rdi), %rbx + xorq -48(%rdi), %r12 + xorq -32(%rdi), %r14 + xorq -24(%rdi), %r15 + xorq -16(%rdi), %r15 + xorq (%rdi), %r12 + xorq 8(%rdi), %r13 + xorq 16(%rdi), %r14 + xorq 32(%rdi), %r15 + xorq 40(%rdi), %rbx + xorq 48(%rdi), %r12 + xorq 56(%rdi), %r13 + xorq 64(%rdi), %r13 + xorq 72(%rdi), %r14 + xorq 80(%rdi), %r15 + xorq 88(%rdi), %rbx + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 56(%rdi), %r13 + movq -32(%rdi), %r14 + movq 80(%rdi), %r15 + movq -8(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 56(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -32(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 80(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -8(%rdi) + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq $0x8a, %rcx + # Row 1 + movq -24(%rdi), %r12 + movq 88(%rdi), %r13 + movq (%rdi), %r14 + movq -88(%rdi), %r15 + movq 24(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 88(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, (%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -88(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 24(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -24(%rdi) + # Row 2 + movq 8(%rdi), %r12 + movq -80(%rdi), %r13 + movq 32(%rdi), %r14 + movq -56(%rdi), %r15 + movq 96(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -80(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 32(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -56(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 96(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 8(%rdi) + # Row 3 + movq 40(%rdi), %r12 + movq -48(%rdi), %r13 + movq 64(%rdi), %r14 + movq 16(%rdi), %r15 + movq -72(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -48(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 64(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 16(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -72(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 40(%rdi) + # Row 4 + xorq 72(%rdi), %r9 + xorq -16(%rdi), %r10 + xorq -64(%rdi), %r11 + xorq 48(%rdi), %rax + xorq -40(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 72(%rdi) + movq %r13, -16(%rdi) + movq %r14, -64(%rdi) + movq %r15, 48(%rdi) + movq %rbx, -40(%rdi) + # Round 9 + xorq %rcx, %r12 + xorq -88(%rdi), %r15 + xorq -80(%rdi), %r13 + xorq -72(%rdi), %rbx + xorq -56(%rdi), %r15 + xorq -48(%rdi), %r13 + xorq -32(%rdi), %r14 + xorq -24(%rdi), %r12 + xorq -8(%rdi), %rbx + xorq (%rdi), %r14 + xorq 8(%rdi), %r12 + xorq 16(%rdi), %r15 + xorq 24(%rdi), %rbx + xorq 32(%rdi), %r14 + xorq 40(%rdi), %r12 + xorq 56(%rdi), %r13 + xorq 64(%rdi), %r14 + xorq 80(%rdi), %r15 + xorq 88(%rdi), %r13 + xorq 96(%rdi), %rbx + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 88(%rdi), %r13 + movq 32(%rdi), %r14 + movq 16(%rdi), %r15 + movq -40(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 88(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 32(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 16(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -40(%rdi) + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq $0x88, %rcx + # Row 1 + movq 80(%rdi), %r12 + movq 24(%rdi), %r13 + movq 8(%rdi), %r14 + movq -48(%rdi), %r15 + movq -64(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 24(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 8(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -48(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -64(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 80(%rdi) + # Row 2 + movq 56(%rdi), %r12 + movq (%rdi), %r13 + movq -56(%rdi), %r14 + movq -72(%rdi), %r15 + movq 72(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, (%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -56(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -72(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 72(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 56(%rdi) + # Row 3 + movq -8(%rdi), %r12 + movq -24(%rdi), %r13 + movq -80(%rdi), %r14 + movq 64(%rdi), %r15 + movq 48(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -24(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -80(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 64(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 48(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -8(%rdi) + # Row 4 + xorq -32(%rdi), %r9 + xorq -88(%rdi), %r10 + xorq 96(%rdi), %r11 + xorq 40(%rdi), %rax + xorq -16(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -32(%rdi) + movq %r13, -88(%rdi) + movq %r14, 96(%rdi) + movq %r15, 40(%rdi) + movq %rbx, -16(%rdi) + # Round 10 + xorq %rcx, %r12 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r15 + xorq -64(%rdi), %rbx + xorq -56(%rdi), %r14 + xorq -48(%rdi), %r15 + xorq -40(%rdi), %rbx + xorq -24(%rdi), %r13 + xorq -8(%rdi), %r12 + xorq (%rdi), %r13 + xorq 8(%rdi), %r14 + xorq 16(%rdi), %r15 + xorq 24(%rdi), %r13 + xorq 32(%rdi), %r14 + xorq 48(%rdi), %rbx + xorq 56(%rdi), %r12 + xorq 64(%rdi), %r15 + xorq 72(%rdi), %rbx + xorq 80(%rdi), %r12 + xorq 88(%rdi), %r13 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 24(%rdi), %r13 + movq -56(%rdi), %r14 + movq 64(%rdi), %r15 + movq -16(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 24(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -56(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 64(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -16(%rdi) + movq $0x80008009, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 16(%rdi), %r12 + movq -64(%rdi), %r13 + movq 56(%rdi), %r14 + movq -24(%rdi), %r15 + movq 96(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -64(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 56(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -24(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 96(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 16(%rdi) + # Row 2 + movq 88(%rdi), %r12 + movq 8(%rdi), %r13 + movq -72(%rdi), %r14 + movq 48(%rdi), %r15 + movq -32(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 8(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -72(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 48(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -32(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 88(%rdi) + # Row 3 + movq -40(%rdi), %r12 + movq 80(%rdi), %r13 + movq (%rdi), %r14 + movq -80(%rdi), %r15 + movq 40(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 80(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, (%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -80(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 40(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -40(%rdi) + # Row 4 + xorq 32(%rdi), %r9 + xorq -48(%rdi), %r10 + xorq 72(%rdi), %r11 + xorq -8(%rdi), %rax + xorq -88(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 32(%rdi) + movq %r13, -48(%rdi) + movq %r14, 72(%rdi) + movq %r15, -8(%rdi) + movq %rbx, -88(%rdi) + # Round 11 + xorq %rcx, %r12 + xorq -80(%rdi), %r15 + xorq -72(%rdi), %r14 + xorq -64(%rdi), %r13 + xorq -56(%rdi), %r14 + xorq -40(%rdi), %r12 + xorq -32(%rdi), %rbx + xorq -24(%rdi), %r15 + xorq -16(%rdi), %rbx + xorq (%rdi), %r14 + xorq 8(%rdi), %r13 + xorq 16(%rdi), %r12 + xorq 24(%rdi), %r13 + xorq 40(%rdi), %rbx + xorq 48(%rdi), %r15 + xorq 56(%rdi), %r14 + xorq 64(%rdi), %r15 + xorq 80(%rdi), %r13 + xorq 88(%rdi), %r12 + xorq 96(%rdi), %rbx + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -64(%rdi), %r13 + movq -72(%rdi), %r14 + movq -80(%rdi), %r15 + movq -88(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -64(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -72(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -80(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -88(%rdi) + movq $0x8000000a, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 64(%rdi), %r12 + movq 96(%rdi), %r13 + movq 88(%rdi), %r14 + movq 80(%rdi), %r15 + movq 72(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 96(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 88(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 80(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 72(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 64(%rdi) + # Row 2 + movq 24(%rdi), %r12 + movq 56(%rdi), %r13 + movq 48(%rdi), %r14 + movq 40(%rdi), %r15 + movq 32(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 56(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 48(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 40(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 32(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 24(%rdi) + # Row 3 + movq -16(%rdi), %r12 + movq 16(%rdi), %r13 + movq 8(%rdi), %r14 + movq (%rdi), %r15 + movq -8(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 16(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 8(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, (%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -8(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -16(%rdi) + # Row 4 + xorq -56(%rdi), %r9 + xorq -24(%rdi), %r10 + xorq -32(%rdi), %r11 + xorq -40(%rdi), %rax + xorq -48(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -56(%rdi) + movq %r13, -24(%rdi) + movq %r14, -32(%rdi) + movq %r15, -40(%rdi) + movq %rbx, -48(%rdi) + # Round 12 + xorq %rcx, %r12 + xorq -88(%rdi), %rbx + xorq -80(%rdi), %r15 + xorq -72(%rdi), %r14 + xorq -64(%rdi), %r13 + xorq -16(%rdi), %r12 + xorq -8(%rdi), %rbx + xorq (%rdi), %r15 + xorq 8(%rdi), %r14 + xorq 16(%rdi), %r13 + xorq 24(%rdi), %r12 + xorq 32(%rdi), %rbx + xorq 40(%rdi), %r15 + xorq 48(%rdi), %r14 + xorq 56(%rdi), %r13 + xorq 64(%rdi), %r12 + xorq 72(%rdi), %rbx + xorq 80(%rdi), %r15 + xorq 88(%rdi), %r14 + xorq 96(%rdi), %r13 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 96(%rdi), %r13 + movq 48(%rdi), %r14 + movq (%rdi), %r15 + movq -48(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 96(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 48(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, (%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -48(%rdi) + movq $0x8000808b, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq -80(%rdi), %r12 + movq 72(%rdi), %r13 + movq 24(%rdi), %r14 + movq 16(%rdi), %r15 + movq -32(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 72(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 24(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 16(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -32(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -80(%rdi) + # Row 2 + movq -64(%rdi), %r12 + movq 88(%rdi), %r13 + movq 40(%rdi), %r14 + movq -8(%rdi), %r15 + movq -56(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 88(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 40(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -8(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -56(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -64(%rdi) + # Row 3 + movq -88(%rdi), %r12 + movq 64(%rdi), %r13 + movq 56(%rdi), %r14 + movq 8(%rdi), %r15 + movq -40(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 64(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 56(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 8(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -40(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -88(%rdi) + # Row 4 + xorq -72(%rdi), %r9 + xorq 80(%rdi), %r10 + xorq 32(%rdi), %r11 + xorq -16(%rdi), %rax + xorq -24(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -72(%rdi) + movq %r13, 80(%rdi) + movq %r14, 32(%rdi) + movq %r15, -16(%rdi) + movq %rbx, -24(%rdi) + # Round 13 + xorq %rcx, %r12 + xorq -88(%rdi), %r12 + xorq -80(%rdi), %r12 + xorq -64(%rdi), %r12 + xorq -56(%rdi), %rbx + xorq -48(%rdi), %rbx + xorq -40(%rdi), %rbx + xorq -32(%rdi), %rbx + xorq -8(%rdi), %r15 + xorq (%rdi), %r15 + xorq 8(%rdi), %r15 + xorq 16(%rdi), %r15 + xorq 24(%rdi), %r14 + xorq 40(%rdi), %r14 + xorq 48(%rdi), %r14 + xorq 56(%rdi), %r14 + xorq 64(%rdi), %r13 + xorq 72(%rdi), %r13 + xorq 88(%rdi), %r13 + xorq 96(%rdi), %r13 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 72(%rdi), %r13 + movq 40(%rdi), %r14 + movq 8(%rdi), %r15 + movq -24(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 72(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 40(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 8(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -24(%rdi) + movq $0x800000000000008b, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq (%rdi), %r12 + movq -32(%rdi), %r13 + movq -64(%rdi), %r14 + movq 64(%rdi), %r15 + movq 32(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -32(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -64(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 64(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 32(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, (%rdi) + # Row 2 + movq 96(%rdi), %r12 + movq 24(%rdi), %r13 + movq -8(%rdi), %r14 + movq -40(%rdi), %r15 + movq -72(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 24(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -8(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -40(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -72(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 96(%rdi) + # Row 3 + movq -48(%rdi), %r12 + movq -80(%rdi), %r13 + movq 88(%rdi), %r14 + movq 56(%rdi), %r15 + movq -16(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -80(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 88(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 56(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -16(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -48(%rdi) + # Row 4 + xorq 48(%rdi), %r9 + xorq 16(%rdi), %r10 + xorq -56(%rdi), %r11 + xorq -88(%rdi), %rax + xorq 80(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 48(%rdi) + movq %r13, 16(%rdi) + movq %r14, -56(%rdi) + movq %r15, -88(%rdi) + movq %rbx, 80(%rdi) + # Round 14 + xorq %rcx, %r12 + xorq -80(%rdi), %r13 + xorq -72(%rdi), %rbx + xorq -64(%rdi), %r14 + xorq -48(%rdi), %r12 + xorq -40(%rdi), %r15 + xorq -32(%rdi), %r13 + xorq -24(%rdi), %rbx + xorq -16(%rdi), %rbx + xorq -8(%rdi), %r14 + xorq (%rdi), %r12 + xorq 8(%rdi), %r15 + xorq 24(%rdi), %r13 + xorq 32(%rdi), %rbx + xorq 40(%rdi), %r14 + xorq 56(%rdi), %r15 + xorq 64(%rdi), %r15 + xorq 72(%rdi), %r13 + xorq 88(%rdi), %r14 + xorq 96(%rdi), %r12 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -32(%rdi), %r13 + movq -8(%rdi), %r14 + movq 56(%rdi), %r15 + movq 80(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -32(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -8(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 56(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 80(%rdi) + movq $0x8000000000008089, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 8(%rdi), %r12 + movq 32(%rdi), %r13 + movq 96(%rdi), %r14 + movq -80(%rdi), %r15 + movq -56(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 32(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 96(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -80(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -56(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 8(%rdi) + # Row 2 + movq 72(%rdi), %r12 + movq -64(%rdi), %r13 + movq -40(%rdi), %r14 + movq -16(%rdi), %r15 + movq 48(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -64(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -40(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -16(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 48(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 72(%rdi) + # Row 3 + movq -24(%rdi), %r12 + movq (%rdi), %r13 + movq 24(%rdi), %r14 + movq 88(%rdi), %r15 + movq -88(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, (%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 24(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 88(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -88(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -24(%rdi) + # Row 4 + xorq 40(%rdi), %r9 + xorq 64(%rdi), %r10 + xorq -72(%rdi), %r11 + xorq -48(%rdi), %rax + xorq 16(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 40(%rdi) + movq %r13, 64(%rdi) + movq %r14, -72(%rdi) + movq %r15, -48(%rdi) + movq %rbx, 16(%rdi) + # Round 15 + xorq %rcx, %r12 + xorq -88(%rdi), %rbx + xorq -80(%rdi), %r15 + xorq -64(%rdi), %r13 + xorq -56(%rdi), %rbx + xorq -40(%rdi), %r14 + xorq -32(%rdi), %r13 + xorq -24(%rdi), %r12 + xorq -16(%rdi), %r15 + xorq -8(%rdi), %r14 + xorq (%rdi), %r13 + xorq 8(%rdi), %r12 + xorq 24(%rdi), %r14 + xorq 32(%rdi), %r13 + xorq 48(%rdi), %rbx + xorq 56(%rdi), %r15 + xorq 72(%rdi), %r12 + xorq 80(%rdi), %rbx + xorq 88(%rdi), %r15 + xorq 96(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 32(%rdi), %r13 + movq -40(%rdi), %r14 + movq 88(%rdi), %r15 + movq 16(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 32(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -40(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 88(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 16(%rdi) + movq $0x8000000000008003, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 56(%rdi), %r12 + movq -56(%rdi), %r13 + movq 72(%rdi), %r14 + movq (%rdi), %r15 + movq -72(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -56(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 72(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, (%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -72(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 56(%rdi) + # Row 2 + movq -32(%rdi), %r12 + movq 96(%rdi), %r13 + movq -16(%rdi), %r14 + movq -88(%rdi), %r15 + movq 40(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 96(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -16(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -88(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 40(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -32(%rdi) + # Row 3 + movq 80(%rdi), %r12 + movq 8(%rdi), %r13 + movq -64(%rdi), %r14 + movq 24(%rdi), %r15 + movq -48(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 8(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -64(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 24(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -48(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 80(%rdi) + # Row 4 + xorq -8(%rdi), %r9 + xorq -80(%rdi), %r10 + xorq 48(%rdi), %r11 + xorq -24(%rdi), %rax + xorq 64(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -8(%rdi) + movq %r13, -80(%rdi) + movq %r14, 48(%rdi) + movq %r15, -24(%rdi) + movq %rbx, 64(%rdi) + # Round 16 + xorq %rcx, %r12 + xorq -88(%rdi), %r15 + xorq -72(%rdi), %rbx + xorq -64(%rdi), %r14 + xorq -56(%rdi), %r13 + xorq -48(%rdi), %rbx + xorq -40(%rdi), %r14 + xorq -32(%rdi), %r12 + xorq -16(%rdi), %r14 + xorq (%rdi), %r15 + xorq 8(%rdi), %r13 + xorq 16(%rdi), %rbx + xorq 24(%rdi), %r15 + xorq 32(%rdi), %r13 + xorq 40(%rdi), %rbx + xorq 56(%rdi), %r12 + xorq 72(%rdi), %r14 + xorq 80(%rdi), %r12 + xorq 88(%rdi), %r15 + xorq 96(%rdi), %r13 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -56(%rdi), %r13 + movq -16(%rdi), %r14 + movq 24(%rdi), %r15 + movq 64(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -56(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -16(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 24(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 64(%rdi) + movq $0x8000000000008002, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 88(%rdi), %r12 + movq -72(%rdi), %r13 + movq -32(%rdi), %r14 + movq 8(%rdi), %r15 + movq 48(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -72(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -32(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 8(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 48(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 88(%rdi) + # Row 2 + movq 32(%rdi), %r12 + movq 72(%rdi), %r13 + movq -88(%rdi), %r14 + movq -48(%rdi), %r15 + movq -8(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 72(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -88(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -48(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -8(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 32(%rdi) + # Row 3 + movq 16(%rdi), %r12 + movq 56(%rdi), %r13 + movq 96(%rdi), %r14 + movq -64(%rdi), %r15 + movq -24(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 56(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 96(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -64(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -24(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 16(%rdi) + # Row 4 + xorq -40(%rdi), %r9 + xorq (%rdi), %r10 + xorq 40(%rdi), %r11 + xorq 80(%rdi), %rax + xorq -80(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -40(%rdi) + movq %r13, (%rdi) + movq %r14, 40(%rdi) + movq %r15, 80(%rdi) + movq %rbx, -80(%rdi) + # Round 17 + xorq %rcx, %r12 + xorq -88(%rdi), %r14 + xorq -72(%rdi), %r13 + xorq -64(%rdi), %r15 + xorq -56(%rdi), %r13 + xorq -48(%rdi), %r15 + xorq -32(%rdi), %r14 + xorq -24(%rdi), %rbx + xorq -16(%rdi), %r14 + xorq -8(%rdi), %rbx + xorq 8(%rdi), %r15 + xorq 16(%rdi), %r12 + xorq 24(%rdi), %r15 + xorq 32(%rdi), %r12 + xorq 48(%rdi), %rbx + xorq 56(%rdi), %r13 + xorq 64(%rdi), %rbx + xorq 72(%rdi), %r13 + xorq 88(%rdi), %r12 + xorq 96(%rdi), %r14 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -72(%rdi), %r13 + movq -88(%rdi), %r14 + movq -64(%rdi), %r15 + movq -80(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -72(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -88(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -64(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -80(%rdi) + movq $0x8000000000000080, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 24(%rdi), %r12 + movq 48(%rdi), %r13 + movq 32(%rdi), %r14 + movq 56(%rdi), %r15 + movq 40(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 48(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 32(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 56(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 40(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 24(%rdi) + # Row 2 + movq -56(%rdi), %r12 + movq -32(%rdi), %r13 + movq -48(%rdi), %r14 + movq -24(%rdi), %r15 + movq -40(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -32(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -48(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -24(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -40(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -56(%rdi) + # Row 3 + movq 64(%rdi), %r12 + movq 88(%rdi), %r13 + movq 72(%rdi), %r14 + movq 96(%rdi), %r15 + movq 80(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 88(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 72(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 96(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 80(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 64(%rdi) + # Row 4 + xorq -16(%rdi), %r9 + xorq 8(%rdi), %r10 + xorq -8(%rdi), %r11 + xorq 16(%rdi), %rax + xorq (%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -16(%rdi) + movq %r13, 8(%rdi) + movq %r14, -8(%rdi) + movq %r15, 16(%rdi) + movq %rbx, (%rdi) + # Round 18 + xorq %rcx, %r12 + xorq -88(%rdi), %r14 + xorq -80(%rdi), %rbx + xorq -72(%rdi), %r13 + xorq -64(%rdi), %r15 + xorq -56(%rdi), %r12 + xorq -48(%rdi), %r14 + xorq -40(%rdi), %rbx + xorq -32(%rdi), %r13 + xorq -24(%rdi), %r15 + xorq 24(%rdi), %r12 + xorq 32(%rdi), %r14 + xorq 40(%rdi), %rbx + xorq 48(%rdi), %r13 + xorq 56(%rdi), %r15 + xorq 64(%rdi), %r12 + xorq 72(%rdi), %r14 + xorq 80(%rdi), %rbx + xorq 88(%rdi), %r13 + xorq 96(%rdi), %r15 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 48(%rdi), %r13 + movq -48(%rdi), %r14 + movq 96(%rdi), %r15 + movq (%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 48(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -48(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 96(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, (%rdi) + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq $0x800a, %rcx + # Row 1 + movq -64(%rdi), %r12 + movq 40(%rdi), %r13 + movq -56(%rdi), %r14 + movq 88(%rdi), %r15 + movq -8(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 40(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -56(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 88(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -8(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -64(%rdi) + # Row 2 + movq -72(%rdi), %r12 + movq 32(%rdi), %r13 + movq -24(%rdi), %r14 + movq 80(%rdi), %r15 + movq -16(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 32(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -24(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 80(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -16(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -72(%rdi) + # Row 3 + movq -80(%rdi), %r12 + movq 24(%rdi), %r13 + movq -32(%rdi), %r14 + movq 72(%rdi), %r15 + movq 16(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 24(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -32(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 72(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 16(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -80(%rdi) + # Row 4 + xorq -88(%rdi), %r9 + xorq 56(%rdi), %r10 + xorq -40(%rdi), %r11 + xorq 64(%rdi), %rax + xorq 8(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -88(%rdi) + movq %r13, 56(%rdi) + movq %r14, -40(%rdi) + movq %r15, 64(%rdi) + movq %rbx, 8(%rdi) + # Round 19 + xorq %rcx, %r12 + xorq -80(%rdi), %r12 + xorq -72(%rdi), %r12 + xorq -64(%rdi), %r12 + xorq -56(%rdi), %r14 + xorq -48(%rdi), %r14 + xorq -32(%rdi), %r14 + xorq -24(%rdi), %r14 + xorq -16(%rdi), %rbx + xorq -8(%rdi), %rbx + xorq (%rdi), %rbx + xorq 16(%rdi), %rbx + xorq 24(%rdi), %r13 + xorq 32(%rdi), %r13 + xorq 40(%rdi), %r13 + xorq 48(%rdi), %r13 + xorq 72(%rdi), %r15 + xorq 80(%rdi), %r15 + xorq 88(%rdi), %r15 + xorq 96(%rdi), %r15 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq 40(%rdi), %r13 + movq -24(%rdi), %r14 + movq 72(%rdi), %r15 + movq 8(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 40(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -24(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 72(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 8(%rdi) + movq $0x800000008000000a, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 96(%rdi), %r12 + movq -8(%rdi), %r13 + movq -72(%rdi), %r14 + movq 24(%rdi), %r15 + movq -40(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -8(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -72(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 24(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -40(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 96(%rdi) + # Row 2 + movq 48(%rdi), %r12 + movq -56(%rdi), %r13 + movq 80(%rdi), %r14 + movq 16(%rdi), %r15 + movq -88(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -56(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 80(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 16(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -88(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 48(%rdi) + # Row 3 + movq (%rdi), %r12 + movq -64(%rdi), %r13 + movq 32(%rdi), %r14 + movq -32(%rdi), %r15 + movq 64(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -64(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 32(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -32(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 64(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, (%rdi) + # Row 4 + xorq -48(%rdi), %r9 + xorq 88(%rdi), %r10 + xorq -16(%rdi), %r11 + xorq -80(%rdi), %rax + xorq 56(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -48(%rdi) + movq %r13, 88(%rdi) + movq %r14, -16(%rdi) + movq %r15, -80(%rdi) + movq %rbx, 56(%rdi) + # Round 20 + xorq %rcx, %r12 + xorq -88(%rdi), %rbx + xorq -72(%rdi), %r14 + xorq -64(%rdi), %r13 + xorq -56(%rdi), %r13 + xorq -40(%rdi), %rbx + xorq -32(%rdi), %r15 + xorq -24(%rdi), %r14 + xorq -8(%rdi), %r13 + xorq (%rdi), %r12 + xorq 8(%rdi), %rbx + xorq 16(%rdi), %r15 + xorq 24(%rdi), %r15 + xorq 32(%rdi), %r14 + xorq 40(%rdi), %r13 + xorq 48(%rdi), %r12 + xorq 64(%rdi), %rbx + xorq 72(%rdi), %r15 + xorq 80(%rdi), %r14 + xorq 96(%rdi), %r12 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -8(%rdi), %r13 + movq 80(%rdi), %r14 + movq -32(%rdi), %r15 + movq 56(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -8(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 80(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -32(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 56(%rdi) + movq $0x8000000080008081, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 72(%rdi), %r12 + movq -40(%rdi), %r13 + movq 48(%rdi), %r14 + movq -64(%rdi), %r15 + movq -16(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -40(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 48(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -64(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -16(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 72(%rdi) + # Row 2 + movq 40(%rdi), %r12 + movq -72(%rdi), %r13 + movq 16(%rdi), %r14 + movq 64(%rdi), %r15 + movq -48(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -72(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 16(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 64(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -48(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 40(%rdi) + # Row 3 + movq 8(%rdi), %r12 + movq 96(%rdi), %r13 + movq -56(%rdi), %r14 + movq 32(%rdi), %r15 + movq -80(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 96(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -56(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 32(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -80(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 8(%rdi) + # Row 4 + xorq -24(%rdi), %r9 + xorq 24(%rdi), %r10 + xorq -88(%rdi), %r11 + xorq (%rdi), %rax + xorq 88(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, -24(%rdi) + movq %r13, 24(%rdi) + movq %r14, -88(%rdi) + movq %r15, (%rdi) + movq %rbx, 88(%rdi) + # Round 21 + xorq %rcx, %r12 + xorq -80(%rdi), %rbx + xorq -72(%rdi), %r13 + xorq -64(%rdi), %r15 + xorq -56(%rdi), %r14 + xorq -48(%rdi), %rbx + xorq -40(%rdi), %r13 + xorq -32(%rdi), %r15 + xorq -16(%rdi), %rbx + xorq -8(%rdi), %r13 + xorq 8(%rdi), %r12 + xorq 16(%rdi), %r14 + xorq 32(%rdi), %r15 + xorq 40(%rdi), %r12 + xorq 48(%rdi), %r14 + xorq 56(%rdi), %rbx + xorq 64(%rdi), %r15 + xorq 72(%rdi), %r12 + xorq 80(%rdi), %r14 + xorq 96(%rdi), %r13 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -40(%rdi), %r13 + movq 16(%rdi), %r14 + movq 32(%rdi), %r15 + movq 88(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -40(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 16(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 32(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 88(%rdi) + movq $0x8000000000008080, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq -32(%rdi), %r12 + movq -16(%rdi), %r13 + movq 40(%rdi), %r14 + movq 96(%rdi), %r15 + movq -88(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -16(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 40(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 96(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -88(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -32(%rdi) + # Row 2 + movq -8(%rdi), %r12 + movq 48(%rdi), %r13 + movq 64(%rdi), %r14 + movq -80(%rdi), %r15 + movq -24(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 48(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 64(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -80(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -24(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -8(%rdi) + # Row 3 + movq 56(%rdi), %r12 + movq 72(%rdi), %r13 + movq -72(%rdi), %r14 + movq -56(%rdi), %r15 + movq (%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 72(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -72(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -56(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, (%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 56(%rdi) + # Row 4 + xorq 80(%rdi), %r9 + xorq -64(%rdi), %r10 + xorq -48(%rdi), %r11 + xorq 8(%rdi), %rax + xorq 24(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 80(%rdi) + movq %r13, -64(%rdi) + movq %r14, -48(%rdi) + movq %r15, 8(%rdi) + movq %rbx, 24(%rdi) + # Round 22 + xorq %rcx, %r12 + xorq -88(%rdi), %rbx + xorq -80(%rdi), %r15 + xorq -72(%rdi), %r14 + xorq -56(%rdi), %r15 + xorq -40(%rdi), %r13 + xorq -32(%rdi), %r12 + xorq -24(%rdi), %rbx + xorq -16(%rdi), %r13 + xorq -8(%rdi), %r12 + xorq (%rdi), %rbx + xorq 16(%rdi), %r14 + xorq 32(%rdi), %r15 + xorq 40(%rdi), %r14 + xorq 48(%rdi), %r13 + xorq 56(%rdi), %r12 + xorq 64(%rdi), %r14 + xorq 72(%rdi), %r13 + xorq 88(%rdi), %rbx + xorq 96(%rdi), %r15 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -16(%rdi), %r13 + movq 64(%rdi), %r14 + movq -56(%rdi), %r15 + movq 24(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -16(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 64(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -56(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 24(%rdi) + movq $0x80000001, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq 32(%rdi), %r12 + movq -88(%rdi), %r13 + movq -8(%rdi), %r14 + movq 72(%rdi), %r15 + movq -48(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -88(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -8(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 72(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -48(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 32(%rdi) + # Row 2 + movq -40(%rdi), %r12 + movq 40(%rdi), %r13 + movq -80(%rdi), %r14 + movq (%rdi), %r15 + movq 80(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 40(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -80(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, (%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 80(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -40(%rdi) + # Row 3 + movq 88(%rdi), %r12 + movq -32(%rdi), %r13 + movq 48(%rdi), %r14 + movq -72(%rdi), %r15 + movq 8(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -32(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 48(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -72(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 8(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 88(%rdi) + # Row 4 + xorq 16(%rdi), %r9 + xorq 96(%rdi), %r10 + xorq -24(%rdi), %r11 + xorq 56(%rdi), %rax + xorq -64(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 16(%rdi) + movq %r13, 96(%rdi) + movq %r14, -24(%rdi) + movq %r15, 56(%rdi) + movq %rbx, -64(%rdi) + # Round 23 + xorq %rcx, %r12 + xorq -88(%rdi), %r13 + xorq -80(%rdi), %r14 + xorq -72(%rdi), %r15 + xorq -56(%rdi), %r15 + xorq -48(%rdi), %rbx + xorq -40(%rdi), %r12 + xorq -32(%rdi), %r13 + xorq -16(%rdi), %r13 + xorq -8(%rdi), %r14 + xorq (%rdi), %r15 + xorq 8(%rdi), %rbx + xorq 24(%rdi), %rbx + xorq 32(%rdi), %r12 + xorq 40(%rdi), %r13 + xorq 48(%rdi), %r14 + xorq 64(%rdi), %r14 + xorq 72(%rdi), %r15 + xorq 80(%rdi), %rbx + xorq 88(%rdi), %r12 + # Calc t[0..4] + rorxq $63, %r13, %rax + rorxq $63, %r14, %r8 + rorxq $63, %r15, %r9 + rorxq $63, %rbx, %r10 + rorxq $63, %r12, %r11 + xorq %rbx, %rax + xorq %r12, %r8 + xorq %r13, %r9 + xorq %r14, %r10 + xorq %r15, %r11 + # Row Mix + # Row 0 + movq %rcx, %r12 + movq -88(%rdi), %r13 + movq -80(%rdi), %r14 + movq -72(%rdi), %r15 + movq -64(%rdi), %rbx + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + rolq $44, %r13 + rolq $43, %r14 + rolq $21, %r15 + rolq $14, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -88(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -80(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -72(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -64(%rdi) + movq $0x8000000080008008, %rbx + andnq %r14, %r13, %rcx + xorq %r12, %rcx + # XOR in constant + xorq %rbx, %rcx + # Row 1 + movq -56(%rdi), %r12 + movq -48(%rdi), %r13 + movq -40(%rdi), %r14 + movq -32(%rdi), %r15 + movq -24(%rdi), %rbx + xorq %r10, %r12 + xorq %r11, %r13 + xorq %rax, %r14 + xorq %r8, %r15 + xorq %r9, %rbx + rolq $28, %r12 + rolq $20, %r13 + rolq $3, %r14 + rolq $45, %r15 + rolq $61, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -48(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, -40(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, -32(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, -24(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -56(%rdi) + # Row 2 + movq -16(%rdi), %r12 + movq -8(%rdi), %r13 + movq (%rdi), %r14 + movq 8(%rdi), %r15 + movq 16(%rdi), %rbx + xorq %r8, %r12 + xorq %r9, %r13 + xorq %r10, %r14 + xorq %r11, %r15 + xorq %rax, %rbx + rolq $0x01, %r12 + rolq $6, %r13 + rolq $25, %r14 + rolq $8, %r15 + rolq $18, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, -8(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, (%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 8(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 16(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, -16(%rdi) + # Row 3 + movq 24(%rdi), %r12 + movq 32(%rdi), %r13 + movq 40(%rdi), %r14 + movq 48(%rdi), %r15 + movq 56(%rdi), %rbx + xorq %r11, %r12 + xorq %rax, %r13 + xorq %r8, %r14 + xorq %r9, %r15 + xorq %r10, %rbx + rolq $27, %r12 + rolq $36, %r13 + rolq $10, %r14 + rolq $15, %r15 + rolq $56, %rbx + andnq %r15, %r14, %rbp + xorq %r13, %rbp + movq %rbp, 32(%rdi) + andnq %rbx, %r15, %rbp + xorq %r14, %rbp + movq %rbp, 40(%rdi) + andnq %r12, %rbx, %rbp + xorq %r15, %rbp + movq %rbp, 48(%rdi) + andnq %r13, %r12, %rbp + xorq %rbx, %rbp + movq %rbp, 56(%rdi) + andnq %r14, %r13, %rbp + xorq %r12, %rbp + movq %rbp, 24(%rdi) + # Row 4 + xorq 64(%rdi), %r9 + xorq 72(%rdi), %r10 + xorq 80(%rdi), %r11 + xorq 88(%rdi), %rax + xorq 96(%rdi), %r8 + rorxq $2, %r9, %r12 + rorxq $9, %r10, %r13 + rorxq $25, %r11, %r14 + rorxq $23, %rax, %r15 + rorxq $62, %r8, %rbx + andnq %r14, %r13, %rax + andnq %r15, %r14, %r8 + andnq %rbx, %r15, %r9 + andnq %r12, %rbx, %r10 + andnq %r13, %r12, %r11 + xorq %rax, %r12 + xorq %r8, %r13 + xorq %r9, %r14 + xorq %r10, %r15 + xorq %r11, %rbx + movq %r12, 64(%rdi) + movq %r13, 72(%rdi) + movq %r14, 80(%rdi) + movq %r15, 88(%rdi) + movq %rbx, 96(%rdi) + addq (%rsp), %rsi + subl $0x01, %edx + movq (%rsp), %rbp + jg L_sha3_block_n_bmi2_start + movq %rcx, -96(%rdi) + popq %rbp + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size sha3_block_n_bmi2,.-sha3_block_n_bmi2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_sha3_block_avx2_rotl: +.quad 0x1,0x3e +.quad 0x1c,0x1b +.quad 0x2c,0x6 +.quad 0x37,0x14 +.quad 0xa,0x2b +.quad 0x19,0x27 +.quad 0x2d,0xf +.quad 0x15,0x8 +.quad 0x24,0x3 +.quad 0x29,0x12 +.quad 0x2,0x3d +.quad 0x38,0xe +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_sha3_block_avx2_rotr: +.quad 0x3f,0x2 +.quad 0x24,0x25 +.quad 0x14,0x3a +.quad 0x9,0x2c +.quad 0x36,0x15 +.quad 0x27,0x19 +.quad 0x13,0x31 +.quad 0x2b,0x38 +.quad 0x1c,0x3d +.quad 0x17,0x2e +.quad 0x3e,0x3 +.quad 0x8,0x32 +#ifndef __APPLE__ +.text +.globl sha3_block_avx2 +.type sha3_block_avx2,@function +.align 16 +sha3_block_avx2: +#else +.section __TEXT,__text +.globl _sha3_block_avx2 +.p2align 4 +_sha3_block_avx2: +#endif /* __APPLE__ */ + leaq L_sha3_avx2_r(%rip), %rdx + leaq L_sha3_block_avx2_rotl(%rip), %rax + addq $0x40, %rax + leaq L_sha3_block_avx2_rotr(%rip), %rcx + addq $0x40, %rcx + movq $24, %r8 + vpbroadcastq (%rdi), %ymm0 + vmovdqu 8(%rdi), %ymm1 + vmovdqu 40(%rdi), %ymm2 + vmovdqu 72(%rdi), %ymm3 + vmovdqu 104(%rdi), %ymm4 + vmovdqu 136(%rdi), %ymm5 + vmovdqu 168(%rdi), %ymm6 + vpermq $57, %ymm2, %ymm7 + vpermq $30, %ymm3, %ymm8 + vpermq $0x4b, %ymm4, %ymm9 + vpermq $0x93, %ymm5, %ymm10 + vpblendd $12, %ymm3, %ymm2, %ymm11 + vpblendd $0xc0, %ymm5, %ymm4, %ymm12 + vpblendd $0xc0, %ymm8, %ymm7, %ymm2 + vpblendd $0xf0, %ymm9, %ymm8, %ymm3 + vpblendd $3, %ymm9, %ymm10, %ymm4 + vpblendd $0xf0, %ymm12, %ymm11, %ymm5 +L_sha3_block_avx2_start: + # Calc b[0..4] + vpshufd $0xee, %ymm5, %ymm7 + vpxor %ymm7, %ymm5, %ymm14 + vpxor %ymm2, %ymm1, %ymm15 + vpermq $0xaa, %ymm14, %ymm7 + vpxor %ymm0, %ymm14, %ymm14 + vpxor %ymm4, %ymm3, %ymm12 + vpxor %ymm7, %ymm14, %ymm14 + vpermq $0x00, %ymm14, %ymm14 + vpxor %ymm6, %ymm15, %ymm15 + vpxor %ymm12, %ymm15, %ymm15 + # XOR in b[x+4] + vpermq $0x93, %ymm15, %ymm7 + vpermq $57, %ymm15, %ymm9 + vpermq $0xff, %ymm15, %ymm8 + vpermq $0x00, %ymm15, %ymm10 + vpblendd $3, %ymm14, %ymm7, %ymm7 + vpblendd $0xc0, %ymm14, %ymm9, %ymm9 + vpxor %ymm8, %ymm0, %ymm0 + vpxor %ymm7, %ymm1, %ymm1 + vpxor %ymm7, %ymm2, %ymm2 + vpxor %ymm7, %ymm3, %ymm3 + vpxor %ymm7, %ymm4, %ymm4 + vpxor %ymm8, %ymm5, %ymm5 + vpxor %ymm7, %ymm6, %ymm6 + # Rotate left 1 + vpsrlq $63, %ymm9, %ymm7 + vpsrlq $63, %ymm10, %ymm8 + vpaddq %ymm9, %ymm9, %ymm9 + vpaddq %ymm10, %ymm10, %ymm10 + vpor %ymm7, %ymm9, %ymm9 + vpor %ymm8, %ymm10, %ymm10 + # XOR in ROTL64(b[x+1]) + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm9, %ymm1, %ymm1 + vpxor %ymm9, %ymm2, %ymm2 + vpxor %ymm9, %ymm3, %ymm3 + vpxor %ymm9, %ymm4, %ymm4 + vpxor %ymm10, %ymm5, %ymm5 + vpxor %ymm9, %ymm6, %ymm6 + # Shuffle - Rotate + vpsrlvq -64(%rcx), %ymm1, %ymm8 + vpsrlvq -32(%rcx), %ymm2, %ymm9 + vpsrlvq (%rcx), %ymm3, %ymm10 + vpsrlvq 32(%rcx), %ymm4, %ymm11 + vpsrlvq 64(%rcx), %ymm5, %ymm12 + vpsrlvq 96(%rcx), %ymm6, %ymm13 + vpsllvq -64(%rax), %ymm1, %ymm1 + vpsllvq -32(%rax), %ymm2, %ymm2 + vpsllvq (%rax), %ymm3, %ymm3 + vpsllvq 32(%rax), %ymm4, %ymm4 + vpsllvq 64(%rax), %ymm5, %ymm5 + vpsllvq 96(%rax), %ymm6, %ymm6 + vpor %ymm8, %ymm1, %ymm1 + vpor %ymm9, %ymm2, %ymm2 + vpor %ymm10, %ymm3, %ymm3 + vpor %ymm11, %ymm4, %ymm4 + vpor %ymm12, %ymm5, %ymm5 + vpor %ymm13, %ymm6, %ymm6 + # Row Mix + vpermq $0x00, %ymm2, %ymm12 + vpermq $0x55, %ymm3, %ymm13 + vpermq $0xaa, %ymm4, %ymm14 + vpermq $0xff, %ymm6, %ymm15 + vpandn %ymm14, %ymm13, %ymm7 + vpandn %ymm15, %ymm14, %ymm8 + vpandn %ymm0, %ymm15, %ymm9 + vpandn %ymm12, %ymm0, %ymm10 + vpandn %ymm13, %ymm12, %ymm11 + vpxor %ymm7, %ymm12, %ymm12 + vpxor %ymm8, %ymm13, %ymm13 + vpxor %ymm9, %ymm14, %ymm14 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm0, %ymm0 + vpermq $0x8d, %ymm5, %ymm7 + vpblendd $12, %ymm13, %ymm12, %ymm10 + vpermq $0x72, %ymm1, %ymm11 + vpblendd $0xc0, %ymm15, %ymm14, %ymm9 + vpermq $0x87, %ymm2, %ymm12 + vpblendd $0xf0, %ymm9, %ymm10, %ymm1 + vpermq $0xc9, %ymm3, %ymm13 + vpermq $0x9c, %ymm4, %ymm14 + vpermq $45, %ymm6, %ymm15 + vpblendd $48, %ymm7, %ymm12, %ymm12 + vpblendd $3, %ymm7, %ymm13, %ymm13 + vpblendd $0xc0, %ymm7, %ymm14, %ymm14 + vpblendd $12, %ymm7, %ymm15, %ymm15 + vpandn %ymm13, %ymm12, %ymm5 + vpandn %ymm14, %ymm13, %ymm7 + vpandn %ymm15, %ymm14, %ymm2 + vpandn %ymm11, %ymm15, %ymm3 + vpandn %ymm12, %ymm11, %ymm4 + vpxor %ymm5, %ymm11, %ymm5 + vpxor %ymm7, %ymm12, %ymm12 + vpxor %ymm2, %ymm13, %ymm13 + vpxor %ymm3, %ymm14, %ymm14 + vpxor %ymm4, %ymm15, %ymm15 + vpunpcklqdq %ymm13, %ymm12, %ymm2 + vpunpckhqdq %ymm13, %ymm12, %ymm3 + vpunpcklqdq %ymm15, %ymm14, %ymm7 + vpunpckhqdq %ymm15, %ymm14, %ymm8 + vperm2i128 $49, %ymm7, %ymm2, %ymm4 + vperm2i128 $49, %ymm8, %ymm3, %ymm6 + vperm2i128 $32, %ymm7, %ymm2, %ymm2 + vperm2i128 $32, %ymm8, %ymm3, %ymm3 + vpxor (%rdx), %ymm0, %ymm0 + addq $32, %rdx + subq $0x01, %r8 + jnz L_sha3_block_avx2_start + vpermq $0x93, %ymm2, %ymm7 + vpermq $0x4e, %ymm3, %ymm8 + vpermq $57, %ymm4, %ymm9 + vpblendd $3, %ymm5, %ymm7, %ymm2 + vpblendd $3, %ymm7, %ymm8, %ymm3 + vpblendd $12, %ymm5, %ymm3, %ymm3 + vpblendd $0xc0, %ymm9, %ymm8, %ymm4 + vpblendd $48, %ymm5, %ymm4, %ymm4 + vpblendd $0xc0, %ymm5, %ymm9, %ymm5 + vmovq %xmm0, (%rdi) + vmovdqu %ymm1, 8(%rdi) + vmovdqu %ymm2, 40(%rdi) + vmovdqu %ymm3, 72(%rdi) + vmovdqu %ymm4, 104(%rdi) + vmovdqu %ymm5, 136(%rdi) + vmovdqu %ymm6, 168(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size sha3_block_avx2,.-sha3_block_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_sha3_blocksx4_avx2 +.type kyber_sha3_blocksx4_avx2,@function +.align 16 +kyber_sha3_blocksx4_avx2: +#else +.section __TEXT,__text +.globl _kyber_sha3_blocksx4_avx2 +.p2align 4 +_kyber_sha3_blocksx4_avx2: +#endif /* __APPLE__ */ + leaq L_sha3_x4_avx2_r(%rip), %rdx + vmovdqu (%rdi), %ymm15 + movq %rdi, %rax + movq %rdi, %rcx + addq $0x80, %rdi + addq $0x180, %rax + addq $0x280, %rcx + # Round 0 + # Calc b[0..4] + vmovdqu -96(%rdi), %ymm11 + vmovdqu -64(%rdi), %ymm12 + vmovdqu -32(%rdi), %ymm13 + vmovdqu (%rdi), %ymm14 + vpxor 32(%rdi), %ymm15, %ymm10 + vpxor 64(%rdi), %ymm11, %ymm11 + vpxor 96(%rdi), %ymm12, %ymm12 + vpxor 128(%rdi), %ymm13, %ymm13 + vpxor -96(%rax), %ymm14, %ymm14 + vpxor -64(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm10, %ymm10 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 64(%rdi), %ymm6, %ymm11 + vpxor (%rax), %ymm7, %ymm12 + vpxor -64(%rcx), %ymm8, %ymm13 + vpxor 128(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor (%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, 128(%rcx) + # Row 1 + vpxor -32(%rdi), %ymm8, %ymm10 + vpxor -96(%rax), %ymm9, %ymm11 + vpxor -64(%rax), %ymm5, %ymm12 + vpxor 128(%rax), %ymm6, %ymm13 + vpxor 64(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, 64(%rcx) + # Row 2 + vpxor -96(%rdi), %ymm6, %ymm10 + vpxor 96(%rdi), %ymm7, %ymm11 + vpxor 32(%rax), %ymm8, %ymm12 + vpxor -32(%rcx), %ymm9, %ymm13 + vpxor (%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, (%rcx) + # Row 3 + vpxor (%rdi), %ymm9, %ymm10 + vpxor 32(%rdi), %ymm5, %ymm11 + vpxor -32(%rax), %ymm6, %ymm12 + vpxor -96(%rcx), %ymm7, %ymm13 + vpxor 96(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, 96(%rcx) + # Row 4 + vpxor -64(%rdi), %ymm7, %ymm10 + vpxor 128(%rdi), %ymm8, %ymm11 + vpxor 64(%rax), %ymm9, %ymm12 + vpxor 96(%rax), %ymm5, %ymm13 + vpxor 32(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, 32(%rcx) + # Round 1 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm10, %ymm10 + vpxor -32(%rdi), %ymm10, %ymm10 + vpxor (%rdi), %ymm10, %ymm10 + vpxor 32(%rdi), %ymm1, %ymm11 + vpxor 64(%rdi), %ymm11, %ymm11 + vpxor 96(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm11, %ymm11 + vpxor -64(%rax), %ymm2, %ymm12 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm3, %ymm13 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm4, %ymm14 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm14, %ymm14 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -96(%rax), %ymm6, %ymm11 + vpxor 32(%rax), %ymm7, %ymm12 + vpxor -96(%rcx), %ymm8, %ymm13 + vpxor 32(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 32(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, 32(%rcx) + # Row 1 + vpxor -64(%rcx), %ymm8, %ymm10 + vpxor 64(%rcx), %ymm9, %ymm11 + vpxor -96(%rdi), %ymm5, %ymm12 + vpxor 32(%rdi), %ymm6, %ymm13 + vpxor 64(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 64(%rax) + # Row 2 + vpxor 64(%rdi), %ymm6, %ymm10 + vpxor -64(%rax), %ymm7, %ymm11 + vpxor -32(%rcx), %ymm8, %ymm12 + vpxor 96(%rcx), %ymm9, %ymm13 + vpxor -64(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, -64(%rdi) + # Row 3 + vpxor 128(%rcx), %ymm9, %ymm10 + vpxor -32(%rdi), %ymm5, %ymm11 + vpxor 96(%rdi), %ymm6, %ymm12 + vpxor -32(%rax), %ymm7, %ymm13 + vpxor 96(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 96(%rax) + # Row 4 + vpxor (%rax), %ymm7, %ymm10 + vpxor 128(%rax), %ymm8, %ymm11 + vpxor (%rcx), %ymm9, %ymm12 + vpxor (%rdi), %ymm5, %ymm13 + vpxor 128(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, 128(%rdi) + # Round 2 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm3, %ymm13 + vpxor 64(%rdi), %ymm10, %ymm10 + vpxor 96(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm11, %ymm11 + vpxor -64(%rax), %ymm11, %ymm11 + vpxor -32(%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -64(%rcx), %ymm10, %ymm10 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 64(%rcx), %ymm6, %ymm11 + vpxor -32(%rcx), %ymm7, %ymm12 + vpxor -32(%rax), %ymm8, %ymm13 + vpxor 128(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 64(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 128(%rdi) + # Row 1 + vpxor -96(%rcx), %ymm8, %ymm10 + vpxor 64(%rax), %ymm9, %ymm11 + vpxor 64(%rdi), %ymm5, %ymm12 + vpxor -32(%rdi), %ymm6, %ymm13 + vpxor (%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, (%rcx) + # Row 2 + vpxor -96(%rax), %ymm6, %ymm10 + vpxor -96(%rdi), %ymm7, %ymm11 + vpxor 96(%rcx), %ymm8, %ymm12 + vpxor 96(%rax), %ymm9, %ymm13 + vpxor (%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, (%rax) + # Row 3 + vpxor 32(%rcx), %ymm9, %ymm10 + vpxor -64(%rcx), %ymm5, %ymm11 + vpxor -64(%rax), %ymm6, %ymm12 + vpxor 96(%rdi), %ymm7, %ymm13 + vpxor (%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, (%rdi) + # Row 4 + vpxor 32(%rax), %ymm7, %ymm10 + vpxor 32(%rdi), %ymm8, %ymm11 + vpxor -64(%rdi), %ymm9, %ymm12 + vpxor 128(%rcx), %ymm5, %ymm13 + vpxor 128(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, 128(%rax) + # Round 3 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm3, %ymm13 + vpxor (%rdi), %ymm4, %ymm14 + vpxor 64(%rdi), %ymm2, %ymm12 + vpxor 96(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm14, %ymm14 + vpxor -96(%rax), %ymm10, %ymm10 + vpxor -64(%rax), %ymm12, %ymm12 + vpxor -32(%rax), %ymm13, %ymm13 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm10, %ymm10 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm14, %ymm14 + vpxor 32(%rcx), %ymm10, %ymm10 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 64(%rax), %ymm6, %ymm11 + vpxor 96(%rcx), %ymm7, %ymm12 + vpxor 96(%rdi), %ymm8, %ymm13 + vpxor 128(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 96(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, 128(%rax) + # Row 1 + vpxor -32(%rax), %ymm8, %ymm10 + vpxor (%rcx), %ymm9, %ymm11 + vpxor -96(%rax), %ymm5, %ymm12 + vpxor -64(%rcx), %ymm6, %ymm13 + vpxor -64(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, -64(%rdi) + # Row 2 + vpxor 64(%rcx), %ymm6, %ymm10 + vpxor 64(%rdi), %ymm7, %ymm11 + vpxor 96(%rax), %ymm8, %ymm12 + vpxor (%rdi), %ymm9, %ymm13 + vpxor 32(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, 32(%rax) + # Row 3 + vpxor 128(%rdi), %ymm9, %ymm10 + vpxor -96(%rcx), %ymm5, %ymm11 + vpxor -96(%rdi), %ymm6, %ymm12 + vpxor -64(%rax), %ymm7, %ymm13 + vpxor 128(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, 128(%rcx) + # Row 4 + vpxor -32(%rcx), %ymm7, %ymm10 + vpxor -32(%rdi), %ymm8, %ymm11 + vpxor (%rax), %ymm9, %ymm12 + vpxor 32(%rcx), %ymm5, %ymm13 + vpxor 32(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 32(%rdi) + # Round 4 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 64(%rdi), %ymm1, %ymm11 + vpxor 96(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm10, %ymm10 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor -32(%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm11, %ymm11 + vpxor 64(%rcx), %ymm10, %ymm10 + vpxor 96(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor (%rcx), %ymm6, %ymm11 + vpxor 96(%rax), %ymm7, %ymm12 + vpxor -64(%rax), %ymm8, %ymm13 + vpxor 32(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 128(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, 32(%rdi) + # Row 1 + vpxor 96(%rdi), %ymm8, %ymm10 + vpxor -64(%rdi), %ymm9, %ymm11 + vpxor 64(%rcx), %ymm5, %ymm12 + vpxor -96(%rcx), %ymm6, %ymm13 + vpxor (%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, (%rax) + # Row 2 + vpxor 64(%rax), %ymm6, %ymm10 + vpxor -96(%rax), %ymm7, %ymm11 + vpxor (%rdi), %ymm8, %ymm12 + vpxor 128(%rcx), %ymm9, %ymm13 + vpxor -32(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, -32(%rcx) + # Row 3 + vpxor 128(%rax), %ymm9, %ymm10 + vpxor -32(%rax), %ymm5, %ymm11 + vpxor 64(%rdi), %ymm6, %ymm12 + vpxor -96(%rdi), %ymm7, %ymm13 + vpxor 32(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, 32(%rcx) + # Row 4 + vpxor 96(%rcx), %ymm7, %ymm10 + vpxor -64(%rcx), %ymm8, %ymm11 + vpxor 32(%rax), %ymm9, %ymm12 + vpxor 128(%rdi), %ymm5, %ymm13 + vpxor -32(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, -32(%rdi) + # Round 5 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm4, %ymm14 + vpxor 64(%rdi), %ymm12, %ymm12 + vpxor 96(%rdi), %ymm10, %ymm10 + vpxor -96(%rax), %ymm11, %ymm11 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm10, %ymm10 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm11, %ymm11 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -64(%rdi), %ymm6, %ymm11 + vpxor (%rdi), %ymm7, %ymm12 + vpxor -96(%rdi), %ymm8, %ymm13 + vpxor -32(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 160(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, -32(%rdi) + # Row 1 + vpxor -64(%rax), %ymm8, %ymm10 + vpxor (%rax), %ymm9, %ymm11 + vpxor 64(%rax), %ymm5, %ymm12 + vpxor -32(%rax), %ymm6, %ymm13 + vpxor 32(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 32(%rax) + # Row 2 + vpxor (%rcx), %ymm6, %ymm10 + vpxor 64(%rcx), %ymm7, %ymm11 + vpxor 128(%rcx), %ymm8, %ymm12 + vpxor 32(%rcx), %ymm9, %ymm13 + vpxor 96(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 96(%rcx) + # Row 3 + vpxor 32(%rdi), %ymm9, %ymm10 + vpxor 96(%rdi), %ymm5, %ymm11 + vpxor -96(%rax), %ymm6, %ymm12 + vpxor 64(%rdi), %ymm7, %ymm13 + vpxor 128(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, 128(%rdi) + # Row 4 + vpxor 96(%rax), %ymm7, %ymm10 + vpxor -96(%rcx), %ymm8, %ymm11 + vpxor -32(%rcx), %ymm9, %ymm12 + vpxor 128(%rax), %ymm5, %ymm13 + vpxor -64(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, -64(%rcx) + # Round 6 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm10, %ymm10 + vpxor 64(%rdi), %ymm13, %ymm13 + vpxor 96(%rdi), %ymm11, %ymm11 + vpxor 128(%rdi), %ymm14, %ymm14 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -64(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm13, %ymm13 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm14, %ymm14 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor (%rax), %ymm6, %ymm11 + vpxor 128(%rcx), %ymm7, %ymm12 + vpxor 64(%rdi), %ymm8, %ymm13 + vpxor -64(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 192(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, -64(%rcx) + # Row 1 + vpxor -96(%rdi), %ymm8, %ymm10 + vpxor 32(%rax), %ymm9, %ymm11 + vpxor (%rcx), %ymm5, %ymm12 + vpxor 96(%rdi), %ymm6, %ymm13 + vpxor -32(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, -32(%rcx) + # Row 2 + vpxor -64(%rdi), %ymm6, %ymm10 + vpxor 64(%rax), %ymm7, %ymm11 + vpxor 32(%rcx), %ymm8, %ymm12 + vpxor 128(%rdi), %ymm9, %ymm13 + vpxor 96(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, 96(%rax) + # Row 3 + vpxor -32(%rdi), %ymm9, %ymm10 + vpxor -64(%rax), %ymm5, %ymm11 + vpxor 64(%rcx), %ymm6, %ymm12 + vpxor -96(%rax), %ymm7, %ymm13 + vpxor 128(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, 128(%rax) + # Row 4 + vpxor (%rdi), %ymm7, %ymm10 + vpxor -32(%rax), %ymm8, %ymm11 + vpxor 96(%rcx), %ymm9, %ymm12 + vpxor 32(%rdi), %ymm5, %ymm13 + vpxor -96(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, -96(%rcx) + # Round 7 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm10, %ymm10 + vpxor -64(%rdi), %ymm10, %ymm10 + vpxor -32(%rdi), %ymm10, %ymm10 + vpxor 64(%rdi), %ymm3, %ymm13 + vpxor 96(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm13, %ymm13 + vpxor -96(%rax), %ymm13, %ymm13 + vpxor -64(%rax), %ymm1, %ymm11 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm4, %ymm14 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm2, %ymm12 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 32(%rax), %ymm6, %ymm11 + vpxor 32(%rcx), %ymm7, %ymm12 + vpxor -96(%rax), %ymm8, %ymm13 + vpxor -96(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 224(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, -96(%rcx) + # Row 1 + vpxor 64(%rdi), %ymm8, %ymm10 + vpxor -32(%rcx), %ymm9, %ymm11 + vpxor -64(%rdi), %ymm5, %ymm12 + vpxor -64(%rax), %ymm6, %ymm13 + vpxor 96(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, 96(%rcx) + # Row 2 + vpxor (%rax), %ymm6, %ymm10 + vpxor (%rcx), %ymm7, %ymm11 + vpxor 128(%rdi), %ymm8, %ymm12 + vpxor 128(%rax), %ymm9, %ymm13 + vpxor (%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, (%rdi) + # Row 3 + vpxor -64(%rcx), %ymm9, %ymm10 + vpxor -96(%rdi), %ymm5, %ymm11 + vpxor 64(%rax), %ymm6, %ymm12 + vpxor 64(%rcx), %ymm7, %ymm13 + vpxor 32(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, 32(%rdi) + # Row 4 + vpxor 128(%rcx), %ymm7, %ymm10 + vpxor 96(%rdi), %ymm8, %ymm11 + vpxor 96(%rax), %ymm9, %ymm12 + vpxor -32(%rdi), %ymm5, %ymm13 + vpxor -32(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, -32(%rax) + # Round 8 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm1, %ymm11 + vpxor -64(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm4, %ymm14 + vpxor 32(%rdi), %ymm14, %ymm14 + vpxor 64(%rdi), %ymm10, %ymm10 + vpxor 128(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm3, %ymm13 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor (%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm10, %ymm10 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm11, %ymm11 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -32(%rcx), %ymm6, %ymm11 + vpxor 128(%rdi), %ymm7, %ymm12 + vpxor 64(%rcx), %ymm8, %ymm13 + vpxor -32(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 256(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, -32(%rax) + # Row 1 + vpxor -96(%rax), %ymm8, %ymm10 + vpxor 96(%rcx), %ymm9, %ymm11 + vpxor (%rax), %ymm5, %ymm12 + vpxor -96(%rdi), %ymm6, %ymm13 + vpxor 96(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, 96(%rax) + # Row 2 + vpxor 32(%rax), %ymm6, %ymm10 + vpxor -64(%rdi), %ymm7, %ymm11 + vpxor 128(%rax), %ymm8, %ymm12 + vpxor 32(%rdi), %ymm9, %ymm13 + vpxor 128(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 128(%rcx) + # Row 3 + vpxor -96(%rcx), %ymm9, %ymm10 + vpxor 64(%rdi), %ymm5, %ymm11 + vpxor (%rcx), %ymm6, %ymm12 + vpxor 64(%rax), %ymm7, %ymm13 + vpxor -32(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, -32(%rdi) + # Row 4 + vpxor 32(%rcx), %ymm7, %ymm10 + vpxor -64(%rax), %ymm8, %ymm11 + vpxor (%rdi), %ymm9, %ymm12 + vpxor -64(%rcx), %ymm5, %ymm13 + vpxor 96(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, 96(%rdi) + # Round 9 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor 32(%rdi), %ymm13, %ymm13 + vpxor 64(%rdi), %ymm11, %ymm11 + vpxor 128(%rdi), %ymm2, %ymm12 + vpxor -96(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm10, %ymm10 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm14, %ymm14 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -96(%rcx), %ymm10, %ymm10 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm11, %ymm11 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 96(%rcx), %ymm6, %ymm11 + vpxor 128(%rax), %ymm7, %ymm12 + vpxor 64(%rax), %ymm8, %ymm13 + vpxor 96(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 288(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 1 + vpxor 64(%rcx), %ymm8, %ymm10 + vpxor 96(%rax), %ymm9, %ymm11 + vpxor 32(%rax), %ymm5, %ymm12 + vpxor 64(%rdi), %ymm6, %ymm13 + vpxor (%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, (%rdi) + # Row 2 + vpxor -32(%rcx), %ymm6, %ymm10 + vpxor (%rax), %ymm7, %ymm11 + vpxor 32(%rdi), %ymm8, %ymm12 + vpxor -32(%rdi), %ymm9, %ymm13 + vpxor 32(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, 32(%rcx) + # Row 3 + vpxor -32(%rax), %ymm9, %ymm10 + vpxor -96(%rax), %ymm5, %ymm11 + vpxor -64(%rdi), %ymm6, %ymm12 + vpxor (%rcx), %ymm7, %ymm13 + vpxor -64(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, -64(%rcx) + # Row 4 + vpxor 128(%rdi), %ymm7, %ymm10 + vpxor -96(%rdi), %ymm8, %ymm11 + vpxor 128(%rcx), %ymm9, %ymm12 + vpxor -96(%rcx), %ymm5, %ymm13 + vpxor -64(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, -64(%rax) + # Round 10 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm2, %ymm12 + vpxor -32(%rdi), %ymm3, %ymm13 + vpxor (%rdi), %ymm4, %ymm14 + vpxor 32(%rdi), %ymm12, %ymm12 + vpxor 64(%rdi), %ymm13, %ymm13 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor -96(%rax), %ymm1, %ymm11 + vpxor -32(%rax), %ymm10, %ymm10 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm11, %ymm11 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm10, %ymm10 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm10, %ymm10 + vpxor 96(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 96(%rax), %ymm6, %ymm11 + vpxor 32(%rdi), %ymm7, %ymm12 + vpxor (%rcx), %ymm8, %ymm13 + vpxor -64(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 320(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, -64(%rax) + # Row 1 + vpxor 64(%rax), %ymm8, %ymm10 + vpxor (%rdi), %ymm9, %ymm11 + vpxor -32(%rcx), %ymm5, %ymm12 + vpxor -96(%rax), %ymm6, %ymm13 + vpxor 128(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, 128(%rcx) + # Row 2 + vpxor 96(%rcx), %ymm6, %ymm10 + vpxor 32(%rax), %ymm7, %ymm11 + vpxor -32(%rdi), %ymm8, %ymm12 + vpxor -64(%rcx), %ymm9, %ymm13 + vpxor 128(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, 128(%rdi) + # Row 3 + vpxor 96(%rdi), %ymm9, %ymm10 + vpxor 64(%rcx), %ymm5, %ymm11 + vpxor (%rax), %ymm6, %ymm12 + vpxor -64(%rdi), %ymm7, %ymm13 + vpxor -96(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -96(%rcx) + # Row 4 + vpxor 128(%rax), %ymm7, %ymm10 + vpxor 64(%rdi), %ymm8, %ymm11 + vpxor 32(%rcx), %ymm9, %ymm12 + vpxor -32(%rax), %ymm5, %ymm13 + vpxor -96(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, -96(%rdi) + # Round 11 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm12, %ymm12 + vpxor 96(%rdi), %ymm10, %ymm10 + vpxor 128(%rdi), %ymm4, %ymm14 + vpxor -96(%rax), %ymm13, %ymm13 + vpxor -64(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm10, %ymm10 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor (%rdi), %ymm6, %ymm11 + vpxor -32(%rdi), %ymm7, %ymm12 + vpxor -64(%rdi), %ymm8, %ymm13 + vpxor -96(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 352(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -96(%rdi) + # Row 1 + vpxor (%rcx), %ymm8, %ymm10 + vpxor 128(%rcx), %ymm9, %ymm11 + vpxor 96(%rcx), %ymm5, %ymm12 + vpxor 64(%rcx), %ymm6, %ymm13 + vpxor 32(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, 32(%rcx) + # Row 2 + vpxor 96(%rax), %ymm6, %ymm10 + vpxor -32(%rcx), %ymm7, %ymm11 + vpxor -64(%rcx), %ymm8, %ymm12 + vpxor -96(%rcx), %ymm9, %ymm13 + vpxor 128(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, 128(%rax) + # Row 3 + vpxor -64(%rax), %ymm9, %ymm10 + vpxor 64(%rax), %ymm5, %ymm11 + vpxor 32(%rax), %ymm6, %ymm12 + vpxor (%rax), %ymm7, %ymm13 + vpxor -32(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, -32(%rax) + # Row 4 + vpxor 32(%rdi), %ymm7, %ymm10 + vpxor -96(%rax), %ymm8, %ymm11 + vpxor 128(%rdi), %ymm9, %ymm12 + vpxor 96(%rdi), %ymm5, %ymm13 + vpxor 64(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, 64(%rdi) + # Round 12 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm1, %ymm11 + vpxor -64(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm10, %ymm10 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 128(%rcx), %ymm6, %ymm11 + vpxor -64(%rcx), %ymm7, %ymm12 + vpxor (%rax), %ymm8, %ymm13 + vpxor 64(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 384(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, 64(%rdi) + # Row 1 + vpxor -64(%rdi), %ymm8, %ymm10 + vpxor 32(%rcx), %ymm9, %ymm11 + vpxor 96(%rax), %ymm5, %ymm12 + vpxor 64(%rax), %ymm6, %ymm13 + vpxor 128(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, 128(%rdi) + # Row 2 + vpxor (%rdi), %ymm6, %ymm10 + vpxor 96(%rcx), %ymm7, %ymm11 + vpxor -96(%rcx), %ymm8, %ymm12 + vpxor -32(%rax), %ymm9, %ymm13 + vpxor 32(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 32(%rdi) + # Row 3 + vpxor -96(%rdi), %ymm9, %ymm10 + vpxor (%rcx), %ymm5, %ymm11 + vpxor -32(%rcx), %ymm6, %ymm12 + vpxor 32(%rax), %ymm7, %ymm13 + vpxor 96(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 4 + vpxor -32(%rdi), %ymm7, %ymm10 + vpxor 64(%rcx), %ymm8, %ymm11 + vpxor 128(%rax), %ymm9, %ymm12 + vpxor -64(%rax), %ymm5, %ymm13 + vpxor -96(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, -96(%rax) + # Round 13 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm10, %ymm10 + vpxor -64(%rdi), %ymm10, %ymm10 + vpxor (%rdi), %ymm10, %ymm10 + vpxor 32(%rdi), %ymm4, %ymm14 + vpxor 64(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor 128(%rdi), %ymm14, %ymm14 + vpxor -32(%rax), %ymm3, %ymm13 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm2, %ymm12 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm1, %ymm11 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm11, %ymm11 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 32(%rcx), %ymm6, %ymm11 + vpxor -96(%rcx), %ymm7, %ymm12 + vpxor 32(%rax), %ymm8, %ymm13 + vpxor -96(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 416(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, -96(%rax) + # Row 1 + vpxor (%rax), %ymm8, %ymm10 + vpxor 128(%rdi), %ymm9, %ymm11 + vpxor (%rdi), %ymm5, %ymm12 + vpxor (%rcx), %ymm6, %ymm13 + vpxor 128(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, 128(%rax) + # Row 2 + vpxor 128(%rcx), %ymm6, %ymm10 + vpxor 96(%rax), %ymm7, %ymm11 + vpxor -32(%rax), %ymm8, %ymm12 + vpxor 96(%rdi), %ymm9, %ymm13 + vpxor -32(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, -32(%rdi) + # Row 3 + vpxor 64(%rdi), %ymm9, %ymm10 + vpxor -64(%rdi), %ymm5, %ymm11 + vpxor 96(%rcx), %ymm6, %ymm12 + vpxor -32(%rcx), %ymm7, %ymm13 + vpxor -64(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, -64(%rax) + # Row 4 + vpxor -64(%rcx), %ymm7, %ymm10 + vpxor 64(%rax), %ymm8, %ymm11 + vpxor 32(%rdi), %ymm9, %ymm12 + vpxor -96(%rdi), %ymm5, %ymm13 + vpxor 64(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, 64(%rcx) + # Round 14 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 64(%rdi), %ymm10, %ymm10 + vpxor 96(%rdi), %ymm3, %ymm13 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm14, %ymm14 + vpxor -64(%rax), %ymm14, %ymm14 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm11, %ymm11 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 128(%rdi), %ymm6, %ymm11 + vpxor -32(%rax), %ymm7, %ymm12 + vpxor -32(%rcx), %ymm8, %ymm13 + vpxor 64(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 448(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, 64(%rcx) + # Row 1 + vpxor 32(%rax), %ymm8, %ymm10 + vpxor 128(%rax), %ymm9, %ymm11 + vpxor 128(%rcx), %ymm5, %ymm12 + vpxor -64(%rdi), %ymm6, %ymm13 + vpxor 32(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, 32(%rdi) + # Row 2 + vpxor 32(%rcx), %ymm6, %ymm10 + vpxor (%rdi), %ymm7, %ymm11 + vpxor 96(%rdi), %ymm8, %ymm12 + vpxor -64(%rax), %ymm9, %ymm13 + vpxor -64(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, -64(%rcx) + # Row 3 + vpxor -96(%rax), %ymm9, %ymm10 + vpxor (%rax), %ymm5, %ymm11 + vpxor 96(%rax), %ymm6, %ymm12 + vpxor 96(%rcx), %ymm7, %ymm13 + vpxor -96(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, -96(%rdi) + # Row 4 + vpxor -96(%rcx), %ymm7, %ymm10 + vpxor (%rcx), %ymm8, %ymm11 + vpxor -32(%rdi), %ymm9, %ymm12 + vpxor 64(%rdi), %ymm5, %ymm13 + vpxor 64(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, 64(%rax) + # Round 15 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor (%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm2, %ymm12 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm10, %ymm10 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm10, %ymm10 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 128(%rax), %ymm6, %ymm11 + vpxor 96(%rdi), %ymm7, %ymm12 + vpxor 96(%rcx), %ymm8, %ymm13 + vpxor 64(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 480(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, 64(%rax) + # Row 1 + vpxor -32(%rcx), %ymm8, %ymm10 + vpxor 32(%rdi), %ymm9, %ymm11 + vpxor 32(%rcx), %ymm5, %ymm12 + vpxor (%rax), %ymm6, %ymm13 + vpxor -32(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, -32(%rdi) + # Row 2 + vpxor 128(%rdi), %ymm6, %ymm10 + vpxor 128(%rcx), %ymm7, %ymm11 + vpxor -64(%rax), %ymm8, %ymm12 + vpxor -96(%rdi), %ymm9, %ymm13 + vpxor -96(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, -96(%rcx) + # Row 3 + vpxor 64(%rcx), %ymm9, %ymm10 + vpxor 32(%rax), %ymm5, %ymm11 + vpxor (%rdi), %ymm6, %ymm12 + vpxor 96(%rax), %ymm7, %ymm13 + vpxor 64(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, 64(%rdi) + # Row 4 + vpxor -32(%rax), %ymm7, %ymm10 + vpxor -64(%rdi), %ymm8, %ymm11 + vpxor -64(%rcx), %ymm9, %ymm12 + vpxor -96(%rax), %ymm5, %ymm13 + vpxor (%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, (%rcx) + # Round 16 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm1, %ymm11 + vpxor 64(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm12, %ymm12 + vpxor 128(%rdi), %ymm10, %ymm10 + vpxor -64(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm10, %ymm10 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 32(%rdi), %ymm6, %ymm11 + vpxor -64(%rax), %ymm7, %ymm12 + vpxor 96(%rax), %ymm8, %ymm13 + vpxor (%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 512(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, (%rcx) + # Row 1 + vpxor 96(%rcx), %ymm8, %ymm10 + vpxor -32(%rdi), %ymm9, %ymm11 + vpxor 128(%rdi), %ymm5, %ymm12 + vpxor 32(%rax), %ymm6, %ymm13 + vpxor -64(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, -64(%rcx) + # Row 2 + vpxor 128(%rax), %ymm6, %ymm10 + vpxor 32(%rcx), %ymm7, %ymm11 + vpxor -96(%rdi), %ymm8, %ymm12 + vpxor 64(%rdi), %ymm9, %ymm13 + vpxor -32(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, -32(%rax) + # Row 3 + vpxor 64(%rax), %ymm9, %ymm10 + vpxor -32(%rcx), %ymm5, %ymm11 + vpxor 128(%rcx), %ymm6, %ymm12 + vpxor (%rdi), %ymm7, %ymm13 + vpxor -96(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, -96(%rax) + # Row 4 + vpxor 96(%rdi), %ymm7, %ymm10 + vpxor (%rax), %ymm8, %ymm11 + vpxor -96(%rcx), %ymm9, %ymm12 + vpxor 64(%rcx), %ymm5, %ymm13 + vpxor -64(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, -64(%rdi) + # Round 17 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm11, %ymm11 + vpxor 64(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm4, %ymm14 + vpxor -64(%rax), %ymm12, %ymm12 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 64(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor 128(%rax), %ymm10, %ymm10 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm14, %ymm14 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm10, %ymm10 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -32(%rdi), %ymm6, %ymm11 + vpxor -96(%rdi), %ymm7, %ymm12 + vpxor (%rdi), %ymm8, %ymm13 + vpxor -64(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 544(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, -64(%rdi) + # Row 1 + vpxor 96(%rax), %ymm8, %ymm10 + vpxor -64(%rcx), %ymm9, %ymm11 + vpxor 128(%rax), %ymm5, %ymm12 + vpxor -32(%rcx), %ymm6, %ymm13 + vpxor -96(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, -96(%rcx) + # Row 2 + vpxor 32(%rdi), %ymm6, %ymm10 + vpxor 128(%rdi), %ymm7, %ymm11 + vpxor 64(%rdi), %ymm8, %ymm12 + vpxor -96(%rax), %ymm9, %ymm13 + vpxor 96(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 3 + vpxor (%rcx), %ymm9, %ymm10 + vpxor 96(%rcx), %ymm5, %ymm11 + vpxor 32(%rcx), %ymm6, %ymm12 + vpxor 128(%rcx), %ymm7, %ymm13 + vpxor 64(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, 64(%rcx) + # Row 4 + vpxor -64(%rax), %ymm7, %ymm10 + vpxor 32(%rax), %ymm8, %ymm11 + vpxor -32(%rax), %ymm9, %ymm12 + vpxor 64(%rax), %ymm5, %ymm13 + vpxor (%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, (%rax) + # Round 18 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm10, %ymm10 + vpxor 64(%rdi), %ymm12, %ymm12 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm10, %ymm10 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm11, %ymm11 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -64(%rcx), %ymm6, %ymm11 + vpxor 64(%rdi), %ymm7, %ymm12 + vpxor 128(%rcx), %ymm8, %ymm13 + vpxor (%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 576(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, (%rax) + # Row 1 + vpxor (%rdi), %ymm8, %ymm10 + vpxor -96(%rcx), %ymm9, %ymm11 + vpxor 32(%rdi), %ymm5, %ymm12 + vpxor 96(%rcx), %ymm6, %ymm13 + vpxor -32(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, -32(%rax) + # Row 2 + vpxor -32(%rdi), %ymm6, %ymm10 + vpxor 128(%rax), %ymm7, %ymm11 + vpxor -96(%rax), %ymm8, %ymm12 + vpxor 64(%rcx), %ymm9, %ymm13 + vpxor -64(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, -64(%rax) + # Row 3 + vpxor -64(%rdi), %ymm9, %ymm10 + vpxor 96(%rax), %ymm5, %ymm11 + vpxor 128(%rdi), %ymm6, %ymm12 + vpxor 32(%rcx), %ymm7, %ymm13 + vpxor 64(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 64(%rax) + # Row 4 + vpxor -96(%rdi), %ymm7, %ymm10 + vpxor -32(%rcx), %ymm8, %ymm11 + vpxor 96(%rdi), %ymm9, %ymm12 + vpxor (%rcx), %ymm5, %ymm13 + vpxor 32(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, 32(%rax) + # Round 19 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm10, %ymm10 + vpxor -32(%rdi), %ymm10, %ymm10 + vpxor (%rdi), %ymm10, %ymm10 + vpxor 32(%rdi), %ymm2, %ymm12 + vpxor 64(%rdi), %ymm12, %ymm12 + vpxor 128(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -64(%rax), %ymm4, %ymm14 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm1, %ymm11 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor 32(%rcx), %ymm3, %ymm13 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -96(%rcx), %ymm6, %ymm11 + vpxor -96(%rax), %ymm7, %ymm12 + vpxor 32(%rcx), %ymm8, %ymm13 + vpxor 32(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 608(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 32(%rax) + # Row 1 + vpxor 128(%rcx), %ymm8, %ymm10 + vpxor -32(%rax), %ymm9, %ymm11 + vpxor -32(%rdi), %ymm5, %ymm12 + vpxor 96(%rax), %ymm6, %ymm13 + vpxor 96(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 2 + vpxor -64(%rcx), %ymm6, %ymm10 + vpxor 32(%rdi), %ymm7, %ymm11 + vpxor 64(%rcx), %ymm8, %ymm12 + vpxor 64(%rax), %ymm9, %ymm13 + vpxor -96(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, -96(%rdi) + # Row 3 + vpxor (%rax), %ymm9, %ymm10 + vpxor (%rdi), %ymm5, %ymm11 + vpxor 128(%rax), %ymm6, %ymm12 + vpxor 128(%rdi), %ymm7, %ymm13 + vpxor (%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, (%rcx) + # Row 4 + vpxor 64(%rdi), %ymm7, %ymm10 + vpxor 96(%rcx), %ymm8, %ymm11 + vpxor -64(%rax), %ymm9, %ymm12 + vpxor -64(%rdi), %ymm5, %ymm13 + vpxor -32(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -32(%rcx) + # Round 20 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm11, %ymm11 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor 128(%rdi), %ymm3, %ymm13 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor (%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm10, %ymm10 + vpxor (%rcx), %ymm14, %ymm14 + vpxor 32(%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -32(%rax), %ymm6, %ymm11 + vpxor 64(%rcx), %ymm7, %ymm12 + vpxor 128(%rdi), %ymm8, %ymm13 + vpxor -32(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 640(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, -32(%rcx) + # Row 1 + vpxor 32(%rcx), %ymm8, %ymm10 + vpxor 96(%rdi), %ymm9, %ymm11 + vpxor -64(%rcx), %ymm5, %ymm12 + vpxor (%rdi), %ymm6, %ymm13 + vpxor -64(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, -64(%rax) + # Row 2 + vpxor -96(%rcx), %ymm6, %ymm10 + vpxor -32(%rdi), %ymm7, %ymm11 + vpxor 64(%rax), %ymm8, %ymm12 + vpxor (%rcx), %ymm9, %ymm13 + vpxor 64(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, 64(%rdi) + # Row 3 + vpxor 32(%rax), %ymm9, %ymm10 + vpxor 128(%rcx), %ymm5, %ymm11 + vpxor 32(%rdi), %ymm6, %ymm12 + vpxor 128(%rax), %ymm7, %ymm13 + vpxor -64(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, -64(%rdi) + # Row 4 + vpxor -96(%rax), %ymm7, %ymm10 + vpxor 96(%rax), %ymm8, %ymm11 + vpxor -96(%rdi), %ymm9, %ymm12 + vpxor (%rax), %ymm5, %ymm13 + vpxor 96(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, 96(%rcx) + # Round 21 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm2, %ymm12 + vpxor 64(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm11, %ymm11 + vpxor 128(%rdi), %ymm13, %ymm13 + vpxor -64(%rax), %ymm14, %ymm14 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm10, %ymm10 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm10, %ymm10 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm10, %ymm10 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 96(%rdi), %ymm6, %ymm11 + vpxor 64(%rax), %ymm7, %ymm12 + vpxor 128(%rax), %ymm8, %ymm13 + vpxor 96(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 672(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, 96(%rcx) + # Row 1 + vpxor 128(%rdi), %ymm8, %ymm10 + vpxor -64(%rax), %ymm9, %ymm11 + vpxor -96(%rcx), %ymm5, %ymm12 + vpxor 128(%rcx), %ymm6, %ymm13 + vpxor -96(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, -96(%rdi) + # Row 2 + vpxor -32(%rax), %ymm6, %ymm10 + vpxor -64(%rcx), %ymm7, %ymm11 + vpxor (%rcx), %ymm8, %ymm12 + vpxor -64(%rdi), %ymm9, %ymm13 + vpxor -96(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -96(%rax) + # Row 3 + vpxor -32(%rcx), %ymm9, %ymm10 + vpxor 32(%rcx), %ymm5, %ymm11 + vpxor -32(%rdi), %ymm6, %ymm12 + vpxor 32(%rdi), %ymm7, %ymm13 + vpxor (%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, (%rax) + # Row 4 + vpxor 64(%rcx), %ymm7, %ymm10 + vpxor (%rdi), %ymm8, %ymm11 + vpxor 64(%rdi), %ymm9, %ymm12 + vpxor 32(%rax), %ymm5, %ymm13 + vpxor 96(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, 96(%rax) + # Round 22 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm13, %ymm13 + vpxor 96(%rdi), %ymm1, %ymm11 + vpxor 128(%rdi), %ymm10, %ymm10 + vpxor -96(%rax), %ymm14, %ymm14 + vpxor -64(%rax), %ymm11, %ymm11 + vpxor -32(%rax), %ymm10, %ymm10 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor -32(%rcx), %ymm10, %ymm10 + vpxor (%rcx), %ymm12, %ymm12 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm14, %ymm14 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -64(%rax), %ymm6, %ymm11 + vpxor (%rcx), %ymm7, %ymm12 + vpxor 32(%rdi), %ymm8, %ymm13 + vpxor 96(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 704(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 96(%rax) + # Row 1 + vpxor 128(%rax), %ymm8, %ymm10 + vpxor -96(%rdi), %ymm9, %ymm11 + vpxor -32(%rax), %ymm5, %ymm12 + vpxor 32(%rcx), %ymm6, %ymm13 + vpxor 64(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 64(%rdi) + # Row 2 + vpxor 96(%rdi), %ymm6, %ymm10 + vpxor -96(%rcx), %ymm7, %ymm11 + vpxor -64(%rdi), %ymm8, %ymm12 + vpxor (%rax), %ymm9, %ymm13 + vpxor 64(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, 64(%rcx) + # Row 3 + vpxor 96(%rcx), %ymm9, %ymm10 + vpxor 128(%rdi), %ymm5, %ymm11 + vpxor -64(%rcx), %ymm6, %ymm12 + vpxor -32(%rdi), %ymm7, %ymm13 + vpxor 32(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, 32(%rax) + # Row 4 + vpxor 64(%rax), %ymm7, %ymm10 + vpxor 128(%rcx), %ymm8, %ymm11 + vpxor -96(%rax), %ymm9, %ymm12 + vpxor -32(%rcx), %ymm5, %ymm13 + vpxor (%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, (%rdi) + # Round 23 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm1, %ymm11 + vpxor -64(%rdi), %ymm2, %ymm12 + vpxor -32(%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm13, %ymm13 + vpxor 64(%rdi), %ymm4, %ymm14 + vpxor 96(%rdi), %ymm10, %ymm10 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -64(%rax), %ymm11, %ymm11 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm14, %ymm14 + vpxor 128(%rax), %ymm10, %ymm10 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm12, %ymm12 + vpxor 32(%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -96(%rdi), %ymm6, %ymm11 + vpxor -64(%rdi), %ymm7, %ymm12 + vpxor -32(%rdi), %ymm8, %ymm13 + vpxor (%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 736(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, (%rdi) + # Row 1 + vpxor 32(%rdi), %ymm8, %ymm10 + vpxor 64(%rdi), %ymm9, %ymm11 + vpxor 96(%rdi), %ymm5, %ymm12 + vpxor 128(%rdi), %ymm6, %ymm13 + vpxor -96(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, -96(%rax) + # Row 2 + vpxor -64(%rax), %ymm6, %ymm10 + vpxor -32(%rax), %ymm7, %ymm11 + vpxor (%rax), %ymm8, %ymm12 + vpxor 32(%rax), %ymm9, %ymm13 + vpxor 64(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, 64(%rax) + # Row 3 + vpxor 96(%rax), %ymm9, %ymm10 + vpxor 128(%rax), %ymm5, %ymm11 + vpxor -96(%rcx), %ymm6, %ymm12 + vpxor -64(%rcx), %ymm7, %ymm13 + vpxor -32(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, -32(%rcx) + # Row 4 + vpxor (%rcx), %ymm7, %ymm10 + vpxor 32(%rcx), %ymm8, %ymm11 + vpxor 64(%rcx), %ymm9, %ymm12 + vpxor 96(%rcx), %ymm5, %ymm13 + vpxor 128(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, 128(%rcx) + subq $0x80, %rdi + vmovdqu %ymm15, (%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_sha3_blocksx4_avx2,.-kyber_sha3_blocksx4_avx2 +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX2 */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/wolfcrypt/src/sha512_asm.S b/wolfcrypt/src/sha512_asm.S index 6ec4dc2e5..eeff0b630 100644 --- a/wolfcrypt/src/sha512_asm.S +++ b/wolfcrypt/src/sha512_asm.S @@ -19,6 +19,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +#ifdef WOLFSSL_USER_SETTINGS +#include "wolfssl/wolfcrypt/settings.h" +#endif + #ifndef HAVE_INTEL_AVX1 #define HAVE_INTEL_AVX1 #endif /* HAVE_INTEL_AVX1 */ diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 20bbd5f19..d5d62c7f3 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -406,6 +406,7 @@ WOLFSSL_TEST_SUBROUTINE int sha256_test(void); WOLFSSL_TEST_SUBROUTINE int sha512_test(void); WOLFSSL_TEST_SUBROUTINE int sha384_test(void); WOLFSSL_TEST_SUBROUTINE int sha3_test(void); +WOLFSSL_TEST_SUBROUTINE int shake128_test(void); WOLFSSL_TEST_SUBROUTINE int shake256_test(void); WOLFSSL_TEST_SUBROUTINE int hash_test(void); WOLFSSL_TEST_SUBROUTINE int hmac_md5_test(void); @@ -920,6 +921,13 @@ options: [-s max_relative_stack_bytes] [-m max_relative_heap_memory_bytes]\n\ TEST_PASS("SHA-3 test passed!\n"); #endif +#ifdef WOLFSSL_SHAKE128 + if ( (ret = shake128_test()) != 0) + return err_sys("SHAKE128 test failed!\n", ret); + else + TEST_PASS("SHAKE128 test passed!\n"); +#endif + #ifdef WOLFSSL_SHAKE256 if ( (ret = shake256_test()) != 0) return err_sys("SHAKE256 test failed!\n", ret); @@ -3491,7 +3499,499 @@ WOLFSSL_TEST_SUBROUTINE int sha3_test(void) } #endif /* WOLFSSL_SHA3 */ +#ifdef WOLFSSL_SHAKE128 +static int shake128_absorb_test(wc_Shake* sha) +{ + byte hash[WC_SHA3_128_BLOCK_SIZE*2]; + + testVector a, b, c, d, e; + testVector test_sha[5]; + int ret = 0; + int times = sizeof(test_sha) / sizeof(struct testVector), i; + + byte large_input[1024]; + const char* large_digest = + "\x2b\xd1\x69\x9f\xb3\x75\x40\x74\xb8\xb2\xd2\x0b\x92\x47\x9b\xfe" + "\xc9\x91\x48\xbe\xda\xa4\x09\xd7\x61\x35\x18\x05\x07\x71\xa5\x61" + "\x4d\xc4\x94\xad\xbe\x04\x7d\xad\x95\x2f\xeb\x2c\xc0\x10\x67\x43" + "\x40\xf1\x4a\x58\x1c\x54\xfa\x24\x1c\x1a\x4e\x8d\x9b\xbc\xea\xa7" + "\x32\xf2\x4c\xc7\x86\x05\x36\xdc\xb4\x42\xd8\x35\xd1\xb4\xa2\x79" + "\xa2\xe6\xee\x67\x4f\xbf\x2a\x93\x41\x88\x25\x56\x29\x90\x1a\x06" + "\xba\xfe\x9f\xa6\x1a\x74\xe8\x7e\x85\x4a\xc8\x58\x60\xb1\x7b\x18" + "\xdf\x77\x59\x46\x04\xc1\xff\x4b\x9b\xcb\xad\xfe\x91\x28\xf0\x01" + "\xc1\x33\xd0\x99\x99\x2e\x0c\x86\x84\x67\x4d\x37\xa4\x42\x45\x10" + "\xdc\x8f\xdb\x6f\xa6\x9b\xee\x8a\x60\xa5\x1f\x95\x3f\x8f\xf5\x31" + "\x4b\x1d\x48\x1e\x45\xff\x79\x5c\xbe\x72\xfc\x56\xed\x6d\x1a\x99" + "\x7f\x23\x7c\xd1\xa5\x50\x9e\xb0\x4d\x61\x37\xa5\xcb\x24\x71\x3b" + "\xa3\x60\x51\x2e\x80\x83\x8b\xe0\x55\x50\xa7\x1e\xcc\x9f\xac\x41" + "\x77\x2c\x79\x22\x30\x09\x1b\x1a\x83\x5b\x2c\x48\xdc\x09\x7d\x59" + "\x0d\xf0\x54\x17\xfb\x5e\x38\x68\xde\xdb\xc5\x93\xab\x17\x5f\x4b" + "\x4d\x6d\xf2\xc7\x4e\x15\x1e\x10\x76\xc4\xcb\x87\xd8\xb7\x9d\xa8" + "\xbf\xc5\x2e\x5e\xfc\xd3\x6c\x45\xd4\x5d\x72\x0f\x66\xeb\x67\x86" + "\xfa\x6c\xd6\x80\xa4\x23\xcb\x5d\xed\x3c\xde\xdc\x5b\x3d\xca\x95" + "\x43\x4b\xdc\xe8\x49\xd3\xe1\x01\xd4\xf1\xe4\x47\xcf\x56\xba\x71" + "\xb4\x69\xed\xe7\xdb\x0f\x89\xd6\xbb\xcd\x1a\xff\xb4\xbe\x72\x26" + "\xdc\x76\x79\xb3\x1a\x4b\xe6\x8d\x9b\x8e\xd9\xe9\xe6\xf9\xff\xa5"; + + a.input = ""; + a.output = "\x7f\x9c\x2b\xa4\xe8\x8f\x82\x7d\x61\x60\x45\x50\x76\x05\x85" + "\x3e\xd7\x3b\x80\x93\xf6\xef\xbc\x88\xeb\x1a\x6e\xac\xfa\x66" + "\xef\x26\x3c\xb1\xee\xa9\x88\x00\x4b\x93\x10\x3c\xfb\x0a\xee" + "\xfd\x2a\x68\x6e\x01\xfa\x4a\x58\xe8\xa3\x63\x9c\xa8\xa1\xe3" + "\xf9\xae\x57\xe2\x35\xb8\xcc\x87\x3c\x23\xdc\x62\xb8\xd2\x60" + "\x16\x9a\xfa\x2f\x75\xab\x91\x6a\x58\xd9\x74\x91\x88\x35\xd2" + "\x5e\x6a\x43\x50\x85\xb2\xba\xdf\xd6\xdf\xaa\xc3\x59\xa5\xef" + "\xbb\x7b\xcc\x4b\x59\xd5\x38\xdf\x9a\x04\x30\x2e\x10\xc8\xbc" + "\x1c\xbf\x1a\x0b\x3a\x51\x20\xea\x17\xcd\xa7\xcf\xad\x76\x5f" + "\x56\x23\x47\x4d\x36\x8c\xcc\xa8\xaf\x00\x07\xcd\x9f\x5e\x4c" + "\x84\x9f\x16\x7a\x58\x0b\x14\xaa\xbd\xef\xae\xe7\xee\xf4\x7c" + "\xb0\xfc\xa9"; + a.inLen = XSTRLEN(a.input); + a.outLen = WC_SHA3_128_BLOCK_SIZE; + + b.input = "abc"; + b.output = "\x58\x81\x09\x2d\xd8\x18\xbf\x5c\xf8\xa3\xdd\xb7\x93\xfb\xcb" + "\xa7\x40\x97\xd5\xc5\x26\xa6\xd3\x5f\x97\xb8\x33\x51\x94\x0f" + "\x2c\xc8\x44\xc5\x0a\xf3\x2a\xcd\x3f\x2c\xdd\x06\x65\x68\x70" + "\x6f\x50\x9b\xc1\xbd\xde\x58\x29\x5d\xae\x3f\x89\x1a\x9a\x0f" + "\xca\x57\x83\x78\x9a\x41\xf8\x61\x12\x14\xce\x61\x23\x94\xdf" + "\x28\x6a\x62\xd1\xa2\x25\x2a\xa9\x4d\xb9\xc5\x38\x95\x6c\x71" + "\x7d\xc2\xbe\xd4\xf2\x32\xa0\x29\x4c\x85\x7c\x73\x0a\xa1\x60" + "\x67\xac\x10\x62\xf1\x20\x1f\xb0\xd3\x77\xcf\xb9\xcd\xe4\xc6" + "\x35\x99\xb2\x7f\x34\x62\xbb\xa4\xa0\xed\x29\x6c\x80\x1f\x9f" + "\xf7\xf5\x73\x02\xbb\x30\x76\xee\x14\x5f\x97\xa3\x2a\xe6\x8e" + "\x76\xab\x66\xc4\x8d\x51\x67\x5b\xd4\x9a\xcc\x29\x08\x2f\x56" + "\x47\x58\x4e"; + b.inLen = XSTRLEN(b.input); + b.outLen = WC_SHA3_128_BLOCK_SIZE; + + c.input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + c.output = "\x1a\x96\x18\x2b\x50\xfb\x8c\x7e\x74\xe0\xa7\x07\x78\x8f\x55" + "\xe9\x82\x09\xb8\xd9\x1f\xad\xe8\xf3\x2f\x8d\xd5\xcf\xf7\xbf" + "\x21\xf5\x4e\xe5\xf1\x95\x50\x82\x5a\x6e\x07\x00\x30\x51\x9e" + "\x94\x42\x63\xac\x1c\x67\x65\x28\x70\x65\x62\x1f\x9f\xcb\x32" + "\x01\x72\x3e\x32\x23\xb6\x3a\x46\xc2\x93\x8a\xa9\x53\xba\x84" + "\x01\xd0\xea\x77\xb8\xd2\x64\x90\x77\x55\x66\x40\x7b\x95\x67" + "\x3c\x0f\x4c\xc1\xce\x9f\xd9\x66\x14\x8d\x7e\xfd\xff\x26\xbb" + "\xf9\xf4\x8a\x21\xc6\xda\x35\xbf\xaa\x54\x56\x54\xf7\x0a\xe5" + "\x86\xff\x10\x13\x14\x20\x77\x14\x83\xec\x92\xed\xab\x40\x8c" + "\x76\x7b\xf4\xc5\xb4\xff\xfa\xa8\x0c\x8c\xa2\x14\xd8\x4c\x4d" + "\xc7\x00\xd0\xc5\x06\x30\xb2\xff\xc3\x79\x3e\xa4\xd8\x72\x58" + "\xb4\xc9\x54"; + c.inLen = XSTRLEN(c.input); + c.outLen = WC_SHA3_128_BLOCK_SIZE; + + /* Taken from NIST CAVP test vectors - full rate output. */ + d.input = "\xdc\x88\x6d\xf3\xf6\x9c\x49\x51\x3d\xe3\x62\x7e\x94\x81\xdb" + "\x58\x71\xe8\xee\x88\xeb\x9f\x99\x61\x15\x41\x93\x0a\x8b\xc8" + "\x85\xe0"; + d.output = "\x93\x68\xf0\x15\x10\x92\x44\xeb\x02\x47\xfa\x3a\x0e\x57\xf5" + "\x2e\xa7\xd9\xeb\xa2\x3d\xae\x7a\x19\x7f\x0a\x29\xe9\x22\x55" + "\x06\x05\x98\x16\xb7\x84\x48\xb6\x49\x7a\x76\xeb\x96\x2d\xb3" + "\xf8\x4d\x37\x60\xf1\xfe\xb4\xbd\xc1\xfd\x4a\xc9\x4e\x91\x7a" + "\xc2\xea\x5e\x4f\x38\x37\x4a\xa5\x6e\x4f\x47\x67\xb8\xd7\x83" + "\x1b\x2d\x51\x49\x5a\xb8\xea\xb7\xc9\x82\x20\xaf\x13\x41\x5a" + "\x59\xbb\x7c\x17\x7a\xcd\x62\x8e\xf0\xff\xe3\x6c\xeb\x18\x59" + "\x5d\x14\x4c\xbf\x25\xef\xc0\x6c\xd9\x56\xa5\x78\x20\x6e\xa8" + "\xf9\x14\x5e\xf9\xce\x19\x50\x6a\x9d\x04\x4e\xc7\x00\x79\x9f" + "\xa1\x41\x9b\xaf\x60\x52\xc0\xc1\xb4\x45\xf8\x35\x17\x57\xb0" + "\xd0\x22\x87\x21\x89\xe2\xc0\x27\x3f\x82\xd9\x69\x69\x66\x3e" + "\x55\x4d\x09"; + d.inLen = 32; + d.outLen = WC_SHA3_128_BLOCK_SIZE; + /* Taken from NIST CAVP test vectors - more than one output block. */ + e.input = "\x8d\x80\x01\xe2\xc0\x96\xf1\xb8\x8e\x7c\x92\x24\xa0\x86\xef" + "\xd4\x79\x7f\xbf\x74\xa8\x03\x3a\x2d\x42\x2a\x2b\x6b\x8f\x67" + "\x47\xe4"; + e.output = "\xe1\x7e\xab\x0d\xa4\x04\xf9\xb6\xac\xc0\x84\x97\x2f\xc5\x79" + "\xe8\x6d\xaa\x76\x10\xa5\xe1\x7c\x23\x2f\x79\x19\x83\x96\xfd" + "\x01\xc2\x4c\x34\xbb\x54\xf4\xb0\x1e\xf7\x40\xb4\x25\x33\x4a" + "\x55\xdd\x24\x81\x3d\xc8\xea\x86\xf5\x6e\xf7\x27\x67\x26\x2b" + "\xf2\x25\x74\x8c\xcc\x3d\x9f\x48\x6f\xfb\x72\x8f\x4e\xad\x29" + "\x60\xc9\x6c\x3e\x44\x63\x86\xea\xce\x21\x9c\x84\x28\x16\x11" + "\x63\x58\xb0\xf4\x2d\x7d\xff\xf7\xdd\x24\x11\xfa\x2a\x56\x79" + "\xfd\x7a\x94\x77\x45\x75\xba\xf9\xfc\xad\x68\xa1\x9e\x30\xd1" + "\x49\xb0\x59\xb5\x9c\x44\x6c\x4e\xdc\xa5\x9b\xc5\xa4\x79\x9d" + "\xc4\x65\xaa\x9e\x78\x2c\xed\x9f\x21\xc5\x5d\xe2\x42\xdd\x25" + "\xd0\xd9\xde\x60\xd0\x9f\xf8\x6a\xba\xf3\xa0\x3a\x76\x71\xb3" + "\x05\x42\xdf\xbe\x72\xfc\x56\xed\x6d\x1a\x99\x7f\x23\x7c\xd1" + "\xa5\x50\x9e\xb0\x4d\x61\x37\xa5\xcb\x24\x71\x3b\xa3\x60\x51" + "\x2e\x80\x83\x8b\xe0\x55\x50\xa7\x1e\xcc\x9f\xac\x41\x77\x2c" + "\x79\x22\x30\x09\x1b\x1a\x83\x5b\x2c\x48\xdc\x09\x7d\x59\x0d" + "\xf0\x54\x17\xfb\x5e\x38\x68\xde\xdb\xc5\x93\xab\x17\x5f\x4b" + "\x4d\x6d\xf2\xc7\x4e\x15\x1e\x10\x76\xc4\xcb\x87\xd8\xb7\x9d" + "\xa8\xbf\xc5\x2e\x5e\xfc\xd3\x6c\x45\xd4\x5d\x72\x0f\x66\xeb" + "\x67\x86\xfa\x6c\xd6\x80\xa4\x23\xcb\x5d\xed\x3c\xde\xdc\x5b" + "\x3d\xca\x95\x43\x4b\xdc\xe8\x49\xd3\xe1\x01\xd4\xf1\xe4\x47" + "\xcf\x56\xba\x71\xb4\x69\xed\xe7\xdb\x0f\x89\xd6\xbb\xcd\x1a" + "\xff\xb4\xbe\x72\x26\xdc\x76\x79\xb3\x1a\x4b\xe6\x8d\x9b\x8e" + "\xd9\xe9\xe6\xf9\xff\xa5"; + e.inLen = 32; + e.outLen = 2 * WC_SHA3_128_BLOCK_SIZE; + + test_sha[0] = a; + test_sha[1] = b; + test_sha[2] = c; + test_sha[3] = d; + test_sha[4] = e; + + for (i = 0; i < times; ++i) { + ret = wc_InitShake128(sha, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(-3100 - i, exit); + ret = wc_Shake128_Absorb(sha, (byte*)test_sha[i].input, + (word32)test_sha[i].inLen); + if (ret != 0) + ERROR_OUT(-3101 - i, exit); + ret = wc_Shake128_SqueezeBlocks(sha, hash, + (word32)test_sha[i].outLen / WC_SHA3_128_BLOCK_SIZE); + if (ret != 0) + ERROR_OUT(-3102 - i, exit); + + if (XMEMCMP(hash, test_sha[i].output, (word32)test_sha[i].outLen) != 0) + ERROR_OUT(-3103 - i, exit); + } + + /* BEGIN LARGE HASH TEST */ { + for (i = 0; i < (int)sizeof(large_input); i++) { + large_input[i] = (byte)(i & 0xFF); + } + ret = wc_InitShake128(sha, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(-3104, exit); + /* Absorb is non-incremental. */ + ret = wc_Shake128_Absorb(sha, (byte*)large_input, + (word32)sizeof(large_input)); + if (ret != 0) + ERROR_OUT(-3105, exit); + /* Able to squeeze out blocks incrementally. */ + ret = wc_Shake128_SqueezeBlocks(sha, hash, 1); + if (ret != 0) + ERROR_OUT(-3106, exit); + ret = wc_Shake128_SqueezeBlocks(sha, hash, + ((word32)sizeof(hash) / WC_SHA3_128_BLOCK_SIZE) - 1); + if (ret != 0) + ERROR_OUT(-3106, exit); + if (XMEMCMP(hash, large_digest, sizeof(hash)) != 0) + ERROR_OUT(-3107, exit); + } /* END LARGE HASH TEST */ + +exit: + return ret; +} + +WOLFSSL_TEST_SUBROUTINE int shake128_test(void) +{ + wc_Shake sha; + byte hash[250]; + + testVector a, b, c, d, e; + testVector test_sha[5]; + int ret = 0; + int times = sizeof(test_sha) / sizeof(struct testVector), i; + + byte large_input[1024]; + const char* large_digest = + "\x88\xd7\x0e\x86\x46\x72\x6b\x3d\x7d\x22\xe1\xa9\x2d\x02\xdb\x35" + "\x92\x4f\x1b\x03\x90\xee\xa3\xce\xd1\x3a\x08\x3a\xd7\x4e\x10\xdf" + "\x09\x67\x33\x35\x4f\xdd\x38\x50\x5b\xcb\x75\xc7\xba\x65\xe5\xe8" + "\xb8\x76\xde\xc5\xee\xd7\xf1\x65\x93\x4e\x5e\xc4\xb1\xd7\x6b\xee" + "\x4b\x57\x48\xf5\x38\x49\x9e\x45\xa0\xf7\x32\xe9\x05\x26\x6a\x10" + "\x70\xd4\x7c\x19\x01\x1f\x6d\x37\xba\x7b\x74\xc2\xbc\xb6\xbc\x74" + "\xa3\x66\x6c\x9b\x11\x84\x9d\x4a\x36\xbc\x8a\x0d\x4c\xe3\x39\xfa" + "\xfa\x1b"; + + a.input = ""; + a.output = "\x7f\x9c\x2b\xa4\xe8\x8f\x82\x7d\x61\x60\x45\x50\x76\x05\x85" + "\x3e\xd7\x3b\x80\x93\xf6\xef\xbc\x88\xeb\x1a\x6e\xac\xfa\x66" + "\xef\x26\x3c\xb1\xee\xa9\x88\x00\x4b\x93\x10\x3c\xfb\x0a\xee" + "\xfd\x2a\x68\x6e\x01\xfa\x4a\x58\xe8\xa3\x63\x9c\xa8\xa1\xe3" + "\xf9\xae\x57\xe2\x35\xb8\xcc\x87\x3c\x23\xdc\x62\xb8\xd2\x60" + "\x16\x9a\xfa\x2f\x75\xab\x91\x6a\x58\xd9\x74\x91\x88\x35\xd2" + "\x5e\x6a\x43\x50\x85\xb2\xba\xdf\xd6\xdf\xaa\xc3\x59\xa5\xef" + "\xbb\x7b\xcc\x4b\x59\xd5\x38\xdf\x9a"; + a.inLen = XSTRLEN(a.input); + a.outLen = 114; + + b.input = "abc"; + b.output = "\x58\x81\x09\x2d\xd8\x18\xbf\x5c\xf8\xa3\xdd\xb7\x93\xfb\xcb" + "\xa7\x40\x97\xd5\xc5\x26\xa6\xd3\x5f\x97\xb8\x33\x51\x94\x0f" + "\x2c\xc8\x44\xc5\x0a\xf3\x2a\xcd\x3f\x2c\xdd\x06\x65\x68\x70" + "\x6f\x50\x9b\xc1\xbd\xde\x58\x29\x5d\xae\x3f\x89\x1a\x9a\x0f" + "\xca\x57\x83\x78\x9a\x41\xf8\x61\x12\x14\xce\x61\x23\x94\xdf" + "\x28\x6a\x62\xd1\xa2\x25\x2a\xa9\x4d\xb9\xc5\x38\x95\x6c\x71" + "\x7d\xc2\xbe\xd4\xf2\x32\xa0\x29\x4c\x85\x7c\x73\x0a\xa1\x60" + "\x67\xac\x10\x62\xf1\x20\x1f\xb0\xd3"; + b.inLen = XSTRLEN(b.input); + b.outLen = 114; + + c.input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + c.output = "\x1a\x96\x18\x2b\x50\xfb\x8c\x7e\x74\xe0\xa7\x07\x78\x8f\x55" + "\xe9\x82\x09\xb8\xd9\x1f\xad\xe8\xf3\x2f\x8d\xd5\xcf\xf7\xbf" + "\x21\xf5\x4e\xe5\xf1\x95\x50\x82\x5a\x6e\x07\x00\x30\x51\x9e" + "\x94\x42\x63\xac\x1c\x67\x65\x28\x70\x65\x62\x1f\x9f\xcb\x32" + "\x01\x72\x3e\x32\x23\xb6\x3a\x46\xc2\x93\x8a\xa9\x53\xba\x84" + "\x01\xd0\xea\x77\xb8\xd2\x64\x90\x77\x55\x66\x40\x7b\x95\x67" + "\x3c\x0f\x4c\xc1\xce\x9f\xd9\x66\x14\x8d\x7e\xfd\xff\x26\xbb" + "\xf9\xf4\x8a\x21\xc6\xda\x35\xbf\xaa"; + c.inLen = XSTRLEN(c.input); + c.outLen = 114; + + /* Taken from NIST CAVP test vectors - full rate output. */ + d.input = "\xdc\x88\x6d\xf3\xf6\x9c\x49\x51\x3d\xe3\x62\x7e\x94\x81\xdb" + "\x58\x71\xe8\xee\x88\xeb\x9f\x99\x61\x15\x41\x93\x0a\x8b\xc8" + "\x85\xe0"; + d.output = "\x93\x68\xf0\x15\x10\x92\x44\xeb\x02\x47\xfa\x3a\x0e\x57\xf5" + "\x2e\xa7\xd9\xeb\xa2\x3d\xae\x7a\x19\x7f\x0a\x29\xe9\x22\x55" + "\x06\x05\x98\x16\xb7\x84\x48\xb6\x49\x7a\x76\xeb\x96\x2d\xb3" + "\xf8\x4d\x37\x60\xf1\xfe\xb4\xbd\xc1\xfd\x4a\xc9\x4e\x91\x7a" + "\xc2\xea\x5e\x4f\x38\x37\x4a\xa5\x6e\x4f\x47\x67\xb8\xd7\x83" + "\x1b\x2d\x51\x49\x5a\xb8\xea\xb7\xc9\x82\x20\xaf\x13\x41\x5a" + "\x59\xbb\x7c\x17\x7a\xcd\x62\x8e\xf0\xff\xe3\x6c\xeb\x18\x59" + "\x5d\x14\x4c\xbf\x25\xef\xc0\x6c\xd9\x56\xa5\x78\x20\x6e\xa8" + "\xf9\x14\x5e\xf9\xce\x19\x50\x6a\x9d\x04\x4e\xc7\x00\x79\x9f" + "\xa1"; + d.inLen = 32; + d.outLen = 136; + /* Taken from NIST CAVP test vectors - more than one output block. */ + e.input = "\x8d\x80\x01\xe2\xc0\x96\xf1\xb8\x8e\x7c\x92\x24\xa0\x86\xef" + "\xd4\x79\x7f\xbf\x74\xa8\x03\x3a\x2d\x42\x2a\x2b\x6b\x8f\x67" + "\x47\xe4"; + e.output = "\xe1\x7e\xab\x0d\xa4\x04\xf9\xb6\xac\xc0\x84\x97\x2f\xc5\x79" + "\xe8\x6d\xaa\x76\x10\xa5\xe1\x7c\x23\x2f\x79\x19\x83\x96\xfd" + "\x01\xc2\x4c\x34\xbb\x54\xf4\xb0\x1e\xf7\x40\xb4\x25\x33\x4a" + "\x55\xdd\x24\x81\x3d\xc8\xea\x86\xf5\x6e\xf7\x27\x67\x26\x2b" + "\xf2\x25\x74\x8c\xcc\x3d\x9f\x48\x6f\xfb\x72\x8f\x4e\xad\x29" + "\x60\xc9\x6c\x3e\x44\x63\x86\xea\xce\x21\x9c\x84\x28\x16\x11" + "\x63\x58\xb0\xf4\x2d\x7d\xff\xf7\xdd\x24\x11\xfa\x2a\x56\x79" + "\xfd\x7a\x94\x77\x45\x75\xba\xf9\xfc\xad\x68\xa1\x9e\x30\xd1" + "\x49\xb0\x59\xb5\x9c\x44\x6c\x4e\xdc\xa5\x9b\xc5\xa4\x79\x9d" + "\xc4\x65\xaa\x9e\x78\x2c\xed\x9f\x21\xc5\x5d\xe2\x42\xdd\x25" + "\xd0\xd9\xde\x60\xd0\x9f\xf8\x6a\xba\xf3\xa0\x3a\x76\x71\xb3" + "\x05\x42\xdf\xbe\x72\xfc\x56\xed\x6d\x1a\x99\x7f\x23\x7c\xd1" + "\xa5\x50\x9e\xb0\x4d\x61\x37\xa5\xcb\x24\x71\x3b\xa3\x60\x51" + "\x2e\x80\x83\x8b\xe0\x55\x50\xa7\x1e\xcc\x9f\xac\x41\x77\x2c" + "\x79\x22\x30\x09\x1b\x1a\x83\x5b\x2c\x48\xdc\x09\x7d\x59\x0d" + "\xf0\x54\x17\xfb\x5e\x38\x68\xde\xdb\xc5\x93\xab\x17\x5f\x4b" + "\x4d\x6d\xf2\xc7\x4e\x15\x1e\x10\x76\xc4"; + e.inLen = 32; + e.outLen = 250; + + test_sha[0] = a; + test_sha[1] = b; + test_sha[2] = c; + test_sha[3] = d; + test_sha[4] = e; + + ret = wc_InitShake128(&sha, HEAP_HINT, devId); + if (ret != 0) + return -3100; + + for (i = 0; i < times; ++i) { + ret = wc_Shake128_Update(&sha, (byte*)test_sha[i].input, + (word32)test_sha[i].inLen); + if (ret != 0) + ERROR_OUT(-3101 - i, exit); + ret = wc_Shake128_Final(&sha, hash, (word32)test_sha[i].outLen); + if (ret != 0) + ERROR_OUT(-3102 - i, exit); + + if (XMEMCMP(hash, test_sha[i].output, test_sha[i].outLen) != 0) + ERROR_OUT(-3103 - i, exit); + } + + /* BEGIN LARGE HASH TEST */ { + for (i = 0; i < (int)sizeof(large_input); i++) { + large_input[i] = (byte)(i & 0xFF); + } + times = 100; + for (i = 0; i < times; ++i) { + ret = wc_Shake128_Update(&sha, (byte*)large_input, + (word32)sizeof(large_input)); + if (ret != 0) + ERROR_OUT(-3104, exit); + } + ret = wc_Shake128_Final(&sha, hash, (word32)sizeof(hash)); + if (ret != 0) + ERROR_OUT(-3105, exit); + if (XMEMCMP(hash, large_digest, 114) != 0) + ERROR_OUT(-3106, exit); + } /* END LARGE HASH TEST */ + + ret = shake128_absorb_test(&sha); + +exit: + wc_Shake128_Free(&sha); + + return ret; +} +#endif + #ifdef WOLFSSL_SHAKE256 +static int shake256_absorb_test(wc_Shake* sha) +{ + byte hash[WC_SHA3_256_BLOCK_SIZE*2]; + + testVector a, b, c, d, e; + testVector test_sha[5]; + int ret = 0; + int times = sizeof(test_sha) / sizeof(struct testVector), i; + + byte large_input[1024]; + const char* large_digest = + "\x21\x25\x8e\xae\x6e\x4f\xa7\xe1\xb9\x6d\xa7\xc9\x7d\x46\x03\x69" + "\x29\x0d\x81\x49\xba\x5d\xaf\x37\xfd\xeb\x25\x52\x1d\xd9\xbd\x65" + "\xfa\x99\xb9\xd1\x70\x6b\xeb\xd4\xc1\x2c\xea\x24\x20\x27\xa7\xcd" + "\xfa\xe1\x81\xd9\xd5\xc1\x1c\xc7\xe9\x70\xc3\xc7\x21\x6f\x32\x22" + "\xe3\x27\xdb\x58\x5e\xea\x18\x2d\x63\x4d\x14\x6c\x94\xcf\x2b\x7e" + "\x6e\x2a\x74\xf3\xe0\xac\xb3\xb2\xcc\xef\x38\xe9\xe7\x35\xb3\xc5" + "\x77\x9d\xff\xe3\x08\x8e\xf8\x2c\x89\xbb\x45\x22\x16\x99\x91\xc0" + "\xe7\x71\x57\x75\xc5\xb1\xc6\xaf\x27\xcb\x64\x8c\xc4\xee\x3d\x5f" + "\x4c\x35\xfb\x1c\xf3\xf8\x0e\xfd\x5e\xfc\x07\xd8\x4d\x55\x32\x49" + "\x45\x0d\xab\x4a\x49\xc4\x83\xde\xd2\x50\xc9\x33\x8f\x85\xcd\x93" + "\x7a\xe6\x6b\xb4\x36\xf3\xb4\x02\x6e\x85\x9f\xda\x1c\xa5\x71\x43" + "\x2f\x3b\xfc\x09\xe7\xc0\x3c\xa4\xd1\x83\xb7\x41\x11\x1c\xa0\x48" + "\x3d\x0e\xda\xbc\x03\xfe\xb2\x3b\x17\xee\x48\xe8\x44\xba\x24\x08" + "\xd9\xdc\xfd\x01\x39\xd2\xe8\xc7\x31\x01\x25\xae\xe8\x01\xc6\x1a" + "\xb7\x90\x0d\x1e\xfc\x47\xc0\x78\x28\x17\x66\xf3\x61\xc5\xe6\x11" + "\x13\x46\x23\x5e\x1d\xc3\x83\x25\x66\x6c\x68\x1b\x30\xdd\xc4\xe6" + "\x83\x8b\x0f\x23\x58\x7e\x06\x5f\x4a\x2b\xed\xc9\x6c\x97\x68\x44"; + + a.input = ""; + a.output = "\x46\xb9\xdd\x2b\x0b\xa8\x8d\x13\x23\x3b\x3f\xeb\x74\x3e\xeb" + "\x24\x3f\xcd\x52\xea\x62\xb8\x1b\x82\xb5\x0c\x27\x64\x6e\xd5" + "\x76\x2f\xd7\x5d\xc4\xdd\xd8\xc0\xf2\x00\xcb\x05\x01\x9d\x67" + "\xb5\x92\xf6\xfc\x82\x1c\x49\x47\x9a\xb4\x86\x40\x29\x2e\xac" + "\xb3\xb7\xc4\xbe\x14\x1e\x96\x61\x6f\xb1\x39\x57\x69\x2c\xc7" + "\xed\xd0\xb4\x5a\xe3\xdc\x07\x22\x3c\x8e\x92\x93\x7b\xef\x84" + "\xbc\x0e\xab\x86\x28\x53\x34\x9e\xc7\x55\x46\xf5\x8f\xb7\xc2" + "\x77\x5c\x38\x46\x2c\x50\x10\xd8\x46\xc1\x85\xc1\x51\x11\xe5" + "\x95\x52\x2a\x6b\xcd\x16\xcf\x86\xf3\xd1\x22\x10\x9e\x3b\x1f" + "\xdd"; + a.inLen = XSTRLEN(a.input); + a.outLen = WC_SHA3_256_BLOCK_SIZE; + + b.input = "abc"; + b.output = "\x48\x33\x66\x60\x13\x60\xa8\x77\x1c\x68\x63\x08\x0c\xc4\x11" + "\x4d\x8d\xb4\x45\x30\xf8\xf1\xe1\xee\x4f\x94\xea\x37\xe7\x8b" + "\x57\x39\xd5\xa1\x5b\xef\x18\x6a\x53\x86\xc7\x57\x44\xc0\x52" + "\x7e\x1f\xaa\x9f\x87\x26\xe4\x62\xa1\x2a\x4f\xeb\x06\xbd\x88" + "\x01\xe7\x51\xe4\x13\x85\x14\x12\x04\xf3\x29\x97\x9f\xd3\x04" + "\x7a\x13\xc5\x65\x77\x24\xad\xa6\x4d\x24\x70\x15\x7b\x3c\xdc" + "\x28\x86\x20\x94\x4d\x78\xdb\xcd\xdb\xd9\x12\x99\x3f\x09\x13" + "\xf1\x64\xfb\x2c\xe9\x51\x31\xa2\xd0\x9a\x3e\x6d\x51\xcb\xfc" + "\x62\x27\x20\xd7\xa7\x5c\x63\x34\xe8\xa2\xd7\xec\x71\xa7\xcc" + "\x29"; + b.inLen = XSTRLEN(b.input); + b.outLen = WC_SHA3_256_BLOCK_SIZE; + + c.input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + c.output = "\x4d\x8c\x2d\xd2\x43\x5a\x01\x28\xee\xfb\xb8\xc3\x6f\x6f\x87" + "\x13\x3a\x79\x11\xe1\x8d\x97\x9e\xe1\xae\x6b\xe5\xd4\xfd\x2e" + "\x33\x29\x40\xd8\x68\x8a\x4e\x6a\x59\xaa\x80\x60\xf1\xf9\xbc" + "\x99\x6c\x05\xac\xa3\xc6\x96\xa8\xb6\x62\x79\xdc\x67\x2c\x74" + "\x0b\xb2\x24\xec\x37\xa9\x2b\x65\xdb\x05\x39\xc0\x20\x34\x55" + "\xf5\x1d\x97\xcc\xe4\xcf\xc4\x91\x27\xd7\x26\x0a\xfc\x67\x3a" + "\xf2\x08\xba\xf1\x9b\xe2\x12\x33\xf3\xde\xbe\x78\xd0\x67\x60" + "\xcf\xa5\x51\xee\x1e\x07\x91\x41\xd4\x9d\xd3\xef\x7e\x18\x2b" + "\x15\x24\xdf\x82\xea\x1c\xef\xe1\xc6\xc3\x96\x61\x75\xf0\x22" + "\x8d"; + c.inLen = XSTRLEN(c.input); + c.outLen = WC_SHA3_256_BLOCK_SIZE; + + /* Taken from NIST CAVP test vectors - full rate output. */ + d.input = "\xdc\x88\x6d\xf3\xf6\x9c\x49\x51\x3d\xe3\x62\x7e\x94\x81\xdb" + "\x58\x71\xe8\xee\x88\xeb\x9f\x99\x61\x15\x41\x93\x0a\x8b\xc8" + "\x85\xe0"; + d.output = "\x00\x64\x8a\xfb\xc5\xe6\x51\x64\x9d\xb1\xfd\x82\x93\x6b\x00" + "\xdb\xbc\x12\x2f\xb4\xc8\x77\x86\x0d\x38\x5c\x49\x50\xd5\x6d" + "\xe7\xe0\x96\xd6\x13\xd7\xa3\xf2\x7e\xd8\xf2\x63\x34\xb0\xcc" + "\xc1\x40\x7b\x41\xdc\xcb\x23\xdf\xaa\x52\x98\x18\xd1\x12\x5c" + "\xd5\x34\x80\x92\x52\x43\x66\xb8\x5f\xab\xb9\x7c\x6c\xd1\xe6" + "\x06\x6f\x45\x9b\xcc\x56\x6d\xa8\x7e\xc9\xb7\xba\x36\x79\x2d" + "\x11\x8a\xc3\x9a\x4c\xce\xf6\x19\x2b\xbf\x3a\x54\xaf\x18\xe5" + "\x7b\x0c\x14\x61\x01\xf6\xae\xaa\x82\x2b\xc4\xb4\xc9\x70\x8b" + "\x09\xf0\xb3\xba\xb4\x1b\xcc\xe9\x64\xd9\x99\xd1\x10\x7b\xd7" + "\xc2"; + d.inLen = 32; + d.outLen = WC_SHA3_256_BLOCK_SIZE; + /* Taken from NIST CAVP test vectors - more than one output block. */ + e.input = "\x8d\x80\x01\xe2\xc0\x96\xf1\xb8\x8e\x7c\x92\x24\xa0\x86\xef" + "\xd4\x79\x7f\xbf\x74\xa8\x03\x3a\x2d\x42\x2a\x2b\x6b\x8f\x67" + "\x47\xe4"; + e.output = "\x2e\x97\x5f\x6a\x8a\x14\xf0\x70\x4d\x51\xb1\x36\x67\xd8\x19" + "\x5c\x21\x9f\x71\xe6\x34\x56\x96\xc4\x9f\xa4\xb9\xd0\x8e\x92" + "\x25\xd3\xd3\x93\x93\x42\x51\x52\xc9\x7e\x71\xdd\x24\x60\x1c" + "\x11\xab\xcf\xa0\xf1\x2f\x53\xc6\x80\xbd\x3a\xe7\x57\xb8\x13" + "\x4a\x9c\x10\xd4\x29\x61\x58\x69\x21\x7f\xdd\x58\x85\xc4\xdb" + "\x17\x49\x85\x70\x3a\x6d\x6d\xe9\x4a\x66\x7e\xac\x30\x23\x44" + "\x3a\x83\x37\xae\x1b\xc6\x01\xb7\x6d\x7d\x38\xec\x3c\x34\x46" + "\x31\x05\xf0\xd3\x94\x9d\x78\xe5\x62\xa0\x39\xe4\x46\x95\x48" + "\xb6\x09\x39\x5d\xe5\xa4\xfd\x43\xc4\x6c\xa9\xfd\x6e\xe2\x9a" + "\xda\x5e\xfc\x07\xd8\x4d\x55\x32\x49\x45\x0d\xab\x4a\x49\xc4" + "\x83\xde\xd2\x50\xc9\x33\x8f\x85\xcd\x93\x7a\xe6\x6b\xb4\x36" + "\xf3\xb4\x02\x6e\x85\x9f\xda\x1c\xa5\x71\x43\x2f\x3b\xfc\x09" + "\xe7\xc0\x3c\xa4\xd1\x83\xb7\x41\x11\x1c\xa0\x48\x3d\x0e\xda" + "\xbc\x03\xfe\xb2\x3b\x17\xee\x48\xe8\x44\xba\x24\x08\xd9\xdc" + "\xfd\x01\x39\xd2\xe8\xc7\x31\x01\x25\xae\xe8\x01\xc6\x1a\xb7" + "\x90\x0d\x1e\xfc\x47\xc0\x78\x28\x17\x66\xf3\x61\xc5\xe6\x11" + "\x13\x46\x23\x5e\x1d\xc3\x83\x25\x66\x6c\x68\x1b\x30\xdd\xc4" + "\xe6\x83\x8b\x0f\x23\x58\x7e\x06\x5f\x4a\x2b\xed\xc9\x6c\x97" + "\x68\x44"; + e.inLen = 32; + e.outLen = 2 * WC_SHA3_256_BLOCK_SIZE; + + test_sha[0] = a; + test_sha[1] = b; + test_sha[2] = c; + test_sha[3] = d; + test_sha[4] = e; + + for (i = 0; i < times; ++i) { + ret = wc_InitShake256(sha, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(-3100 - i, exit); + ret = wc_Shake256_Absorb(sha, (byte*)test_sha[i].input, + (word32)test_sha[i].inLen); + if (ret != 0) + ERROR_OUT(-3101 - i, exit); + ret = wc_Shake256_SqueezeBlocks(sha, hash, + (word32)test_sha[i].outLen / WC_SHA3_256_BLOCK_SIZE); + if (ret != 0) + ERROR_OUT(-3102 - i, exit); + + if (XMEMCMP(hash, test_sha[i].output, (word32)test_sha[i].outLen) != 0) + ERROR_OUT(-3103 - i, exit); + } + + /* BEGIN LARGE HASH TEST */ { + for (i = 0; i < (int)sizeof(large_input); i++) { + large_input[i] = (byte)(i & 0xFF); + } + ret = wc_InitShake256(sha, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(-3104, exit); + /* Absorb is non-incremental. */ + ret = wc_Shake256_Absorb(sha, (byte*)large_input, + (word32)sizeof(large_input)); + if (ret != 0) + ERROR_OUT(-3105, exit); + /* Able to squeeze out blocks incrementally. */ + ret = wc_Shake256_SqueezeBlocks(sha, hash, 1); + if (ret != 0) + ERROR_OUT(-3106, exit); + ret = wc_Shake256_SqueezeBlocks(sha, hash, + ((word32)sizeof(hash) / WC_SHA3_256_BLOCK_SIZE) - 1); + if (ret != 0) + ERROR_OUT(-3106, exit); + if (XMEMCMP(hash, large_digest, sizeof(hash)) != 0) + ERROR_OUT(-3107, exit); + } /* END LARGE HASH TEST */ + +exit: + return ret; +} + WOLFSSL_TEST_SUBROUTINE int shake256_test(void) { wc_Shake sha; @@ -3630,6 +4130,7 @@ WOLFSSL_TEST_SUBROUTINE int shake256_test(void) ERROR_OUT(-3106, exit); } /* END LARGE HASH TEST */ + ret = shake256_absorb_test(&sha); exit: wc_Shake256_Free(&sha); diff --git a/wolfssl/wolfcrypt/hash.h b/wolfssl/wolfcrypt/hash.h index d4e685cb2..0cf14970e 100644 --- a/wolfssl/wolfcrypt/hash.h +++ b/wolfssl/wolfcrypt/hash.h @@ -215,8 +215,13 @@ WOLFSSL_API int wc_Sha3_224Hash(const byte* data, word32 len, byte* hash); WOLFSSL_API int wc_Sha3_256Hash(const byte* data, word32 len, byte* hash); WOLFSSL_API int wc_Sha3_384Hash(const byte* data, word32 len, byte* hash); WOLFSSL_API int wc_Sha3_512Hash(const byte* data, word32 len, byte* hash); +#ifdef WOLFSSL_SHAKE128 +WOLFSSL_API int wc_Shake128Hash(const byte* data, word32 len, byte* hash, + word32 hashLen); +#endif #ifdef WOLFSSL_SHAKE256 -WOLFSSL_API int wc_Shake256Hash(const byte* data, word32 len, byte* hash, word32 hashLen); +WOLFSSL_API int wc_Shake256Hash(const byte* data, word32 len, byte* hash, + word32 hashLen); #endif #endif /* WOLFSSL_SHA3 */ diff --git a/wolfssl/wolfcrypt/sha3.h b/wolfssl/wolfcrypt/sha3.h index 784fd486e..e14875a66 100644 --- a/wolfssl/wolfcrypt/sha3.h +++ b/wolfssl/wolfcrypt/sha3.h @@ -42,6 +42,9 @@ /* in bytes */ enum { + /* SHAKE-128 */ + WC_SHA3_128_COUNT = 21, + WC_SHA3_224 = WC_HASH_TYPE_SHA3_224, WC_SHA3_224_DIGEST_SIZE = 28, WC_SHA3_224_COUNT = 18, @@ -58,8 +61,10 @@ enum { WC_SHA3_512_DIGEST_SIZE = 64, WC_SHA3_512_COUNT = 9, - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 WC_SHAKE128 = WC_HASH_TYPE_SHAKE128, + #endif + #ifndef WOLFSSL_NO_SHAKE256 WC_SHAKE256 = WC_HASH_TYPE_SHAKE256, #endif @@ -67,6 +72,7 @@ enum { defined(HAVE_SELFTEST_VERSION) && (HAVE_SELFTEST_VERSION >= 2) /* These values are used for HMAC, not SHA-3 directly. * They come from from FIPS PUB 202. */ + WC_SHA3_128_BLOCK_SIZE = 168, WC_SHA3_224_BLOCK_SIZE = 144, WC_SHA3_256_BLOCK_SIZE = 136, WC_SHA3_384_BLOCK_SIZE = 104, @@ -124,14 +130,10 @@ struct wc_Sha3 { #endif -#ifndef WOLFSSL_NO_SHAKE256 +#if !defined(WOLFSSL_NO_SHAKE128) || !defined(WOLFSSL_NO_SHAKE256) typedef wc_Sha3 wc_Shake; #endif -#if defined(WOLFSSL_ARMASM) && defined(WOLFSSL_ARMASM_CRYPTO_SHA3) -WOLFSSL_LOCAL void BlockSha3(word64 *s); -#endif - WOLFSSL_API int wc_InitSha3_224(wc_Sha3* sha3, void* heap, int devId); WOLFSSL_API int wc_Sha3_224_Update(wc_Sha3* sha3, const byte* data, word32 len); WOLFSSL_API int wc_Sha3_224_Final(wc_Sha3* sha3, byte* hash); @@ -160,10 +162,26 @@ WOLFSSL_API void wc_Sha3_512_Free(wc_Sha3* sha3); WOLFSSL_API int wc_Sha3_512_GetHash(wc_Sha3* sha3, byte* hash); WOLFSSL_API int wc_Sha3_512_Copy(wc_Sha3* src, wc_Sha3* dst); +#ifndef WOLFSSL_NO_SHAKE128 +WOLFSSL_API int wc_InitShake128(wc_Shake* shake, void* heap, int devId); +WOLFSSL_API int wc_Shake128_Update(wc_Shake* shake, const byte* data, word32 len); +WOLFSSL_API int wc_Shake128_Final(wc_Shake* shake, byte* hash, word32 hashLen); +WOLFSSL_API int wc_Shake128_Absorb(wc_Shake* shake, const byte* data, + word32 len); +WOLFSSL_API int wc_Shake128_SqueezeBlocks(wc_Shake* shake, byte* out, + word32 blockCnt); +WOLFSSL_API void wc_Shake128_Free(wc_Shake* shake); +WOLFSSL_API int wc_Shake128_Copy(wc_Shake* src, wc_Sha3* dst); +#endif + #ifndef WOLFSSL_NO_SHAKE256 WOLFSSL_API int wc_InitShake256(wc_Shake* shake, void* heap, int devId); WOLFSSL_API int wc_Shake256_Update(wc_Shake* shake, const byte* data, word32 len); WOLFSSL_API int wc_Shake256_Final(wc_Shake* shake, byte* hash, word32 hashLen); +WOLFSSL_API int wc_Shake256_Absorb(wc_Shake* shake, const byte* data, + word32 len); +WOLFSSL_API int wc_Shake256_SqueezeBlocks(wc_Shake* shake, byte* out, + word32 blockCnt); WOLFSSL_API void wc_Shake256_Free(wc_Shake* shake); WOLFSSL_API int wc_Shake256_Copy(wc_Shake* src, wc_Sha3* dst); #endif @@ -173,6 +191,17 @@ WOLFSSL_API int wc_Shake256_Copy(wc_Shake* src, wc_Sha3* dst); WOLFSSL_API int wc_Sha3_GetFlags(wc_Sha3* sha3, word32* flags); #endif +#ifdef USE_INTEL_SPEEDUP +WOLFSSL_LOCAL void sha3_block_n_bmi2(word64* s, const byte* data, word32 n, + word64 c); +WOLFSSL_LOCAL void sha3_block_bmi2(word64* s); +WOLFSSL_LOCAL void sha3_block_avx2(word64* s); +WOLFSSL_LOCAL void BlockSha3(word64 *s); +#endif +#if defined(WOLFSSL_ARMASM) && defined(WOLFSSL_ARMASM_CRYPTO_SHA3) +WOLFSSL_LOCAL void BlockSha3(word64 *s); +#endif + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/wolfssl/wolfcrypt/types.h b/wolfssl/wolfcrypt/types.h index 322ecf547..8b24626be 100644 --- a/wolfssl/wolfcrypt/types.h +++ b/wolfssl/wolfcrypt/types.h @@ -1041,8 +1041,10 @@ typedef struct w64wrapper { #undef _WC_HASH_TYPE_MAX #define _WC_HASH_TYPE_MAX WC_HASH_TYPE_SHA512_256 #endif - #ifndef WOLFSSL_NO_SHAKE256 + #ifndef WOLFSSL_NO_SHAKE128 WC_HASH_TYPE_SHAKE128 = 18, + #endif + #ifndef WOLFSSL_NO_SHAKE256 WC_HASH_TYPE_SHAKE256 = 19, #undef _WC_HASH_TYPE_MAX #define _WC_HASH_TYPE_MAX WC_HASH_TYPE_SHAKE256